## About FloatWindow
Android APP中实现悬浮窗的场景很多,比如悬浮窗播放视频,离开直播间,或者退出应用,继续播放直播流等。
本人研究并写了一套相对优雅的悬浮窗实现方案,缩放,移动,关闭,点击,自定义某个页面显示等。推荐采用内部view添加布局展示悬浮窗,此方案在线上稳定运行,无兼容性问题,可根据需要自行修改,欢迎交流。
![Android-FloatWindow](https://github.com/duqian291902259/Android-FloatWindow/blob/master/screenshot/float-window-no-permission-1.png)
下载apk体验一下吧:
[float-window-app-release.apk](https://github.com/duqian291902259/Android-FloatWindow/blob/master/release-app/float-window-app-release.apk)
## 悬浮窗的实现方式
### 一,Window Manager实现
通常的做法是使用WindowManager,使用其addView方法,添加一个布局view来实现系统弹窗,大部分window type需要申请权限,如果是 ```TYPE_SYSTEM_ALERT ``` 形式,需要申请以下权限:
``` java
android.permission.SYSTEM_ALERT_WINDOW
```
该方式,既可以在app内部显示,也可以在应用外也显示,缺点是有兼容性问题,需要做ROM适配,而且因为更新布局迟钝,不适合对悬浮窗做缩放操作,本项目有该方案的具体实现,具体参照demo。
悬浮窗主要是通过WindowManager这个类实现的,这个类有3个方法:
``` java
void addView (View view, WindowManager.LayoutParams params)//添加一个悬浮窗
void removeView (View view)//移除悬浮窗
void updateViewLayout (View view, WindowManager.LayoutParams params)//更新悬浮窗参数
```
以下是部分代码:
``` java
/**
* 利用系统弹窗实现悬浮窗
*
* @param mContext
*/
private void initSystemWindow(Context mContext) {
windowManager = SystemUtils.getWindowManager(mContext);
WindowManager.LayoutParams wmParams = new WindowManager.LayoutParams();
wmParams.packageName = mContext.getPackageName();
wmParams.flags = WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL
| WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON
| WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
| WindowManager.LayoutParams.FLAG_SCALED
| WindowManager.LayoutParams.FLAG_LAYOUT_INSET_DECOR
| WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN;
if (float_window_type == FW_TYPE_DIALOG) {
//wmParams.type = WindowManager.LayoutParams.TYPE_APPLICATION_ATTACHED_DIALOG;
wmParams.type = WindowManager.LayoutParams.TYPE_TOAST;
} else if (float_window_type == FW_TYPE_ALERT_WINDOW) {
//需要权限
wmParams.type = WindowManager.LayoutParams.TYPE_SYSTEM_ALERT;
}
wmParams.format = PixelFormat.RGBA_8888;
wmParams.gravity = Gravity.START | Gravity.TOP;
wmParams.width = floatViewParams.width;
wmParams.height = floatViewParams.height;
wmParams.x = floatViewParams.x;
wmParams.y = floatViewParams.y;
floatView = new FloatWindowView(mContext, floatViewParams, wmParams);
windowManager.addView((View) floatView, wmParams);
}
```
### 二,顶级view添加悬浮窗
demo中还提供了另外一种优雅的实现方式,无需申请权限,任意界面都可以显示悬浮窗,此弹窗,无需申请权限,可以拖动,缩放,关闭,点击,没有兼容性问题,限于app内部,可以在BaseActivity中注入。
``` java
/**
* 直接在activity根布局添加悬浮窗
*
* @param mContext
*/
private void initCommonFloatView(Context mContext) {
floatView = new FloatView(mContext, floatViewParams);
View rootView = activity.getWindow().getDecorView().getRootView();
contentView = (FrameLayout) rootView.findViewById(android.R.id.content);
contentView.addView((View) floatView);
}
```
基本上可以满足大部分的需要,仅供参考。
![Android-FloatWindow](https://github.com/duqian291902259/Android-FloatWindow/blob/master/screenshot/float-window-system-permission.png)
### duqian2010@gmail.com
Github:
[Android-FloatWindow](https://github.com/duqian291902259/Android-FloatWindow)
没有合适的资源?快使用搜索试试~ 我知道了~
floatWindow111
共76个文件
java:24个
png:19个
xml:18个
需积分: 0 0 下载量 53 浏览量
2024-07-31
02:00:23
上传
评论
收藏 2.69MB RAR 举报
温馨提示
floatWindow111
资源推荐
资源详情
资源评论
收起资源包目录
float.rar (76个子文件)
Android-FloatWindow-master
gradle.properties 783B
gradle
wrapper
gradle-wrapper.jar 52KB
gradle-wrapper.properties 230B
app
src
androidTest
java
site
duqian
floatwindow
ExampleInstrumentedTest.java 747B
test
java
site
duqian
floatwindow
ExampleUnitTest.java 401B
main
assets
duqian.properties 78B
java
site
duqian
floatwindow
BaseActivity.java 12KB
activity
SubAActivity.java 1KB
SubBActivity.java 2KB
SubCActivity.java 1KB
uitls
SystemUtils.java 5KB
MainActivity.java 3KB
float_view
FloatWindowManager.java 10KB
FloatViewParams.java 828B
LastWindowInfo.java 1019B
FloatBallView.java 16KB
FloatViewListener.java 459B
FloatView.java 17KB
FloatWindowView.java 20KB
IFloatView.java 324B
fw_permission
BelowApi23CompatImpl.java 527B
Api23CompatImpl.java 2KB
QihooCompatImpl.java 1KB
MeizuCompatImpl.java 1KB
HuaweiCompatImpl.java 3KB
RomUtils.java 4KB
FloatWinPermissionCompat.java 5KB
MiuiCompatImpl.java 4KB
res
mipmap-xxhdpi
nn_paster_btn_scale.png 804B
nn_paster_btn_close.png 673B
qrcode.png 120KB
ic_launcher_round.png 10KB
myphoto.png 443KB
ic_launcher.png 6KB
mipmap-hdpi
ic_launcher_round.png 5KB
ic_launcher.png 3KB
drawable-v24
ic_launcher_foreground.xml 2KB
mipmap-anydpi-v26
ic_launcher.xml 270B
ic_launcher_round.xml 270B
menu
navigation.xml 602B
mipmap-mdpi
ic_launcher_round.png 3KB
ic_launcher.png 2KB
mipmap-xxxhdpi
ic_launcher_round.png 15KB
ic_launcher.png 9KB
mipmap-xhdpi
ic_launcher_round.png 7KB
ic_launcher.png 4KB
values
dimens.xml 211B
colors.xml 554B
strings.xml 1KB
styles.xml 405B
layout
activity_sub_b.xml 521B
float_view_inner_layout.xml 2KB
float_view_desktop_layout.xml 3KB
activity_main.xml 1KB
activity_sub.xml 1KB
drawable
ic_home_black_24dp.xml 325B
ic_launcher_background.xml 5KB
ic_dashboard_black_24dp.xml 367B
ic_notifications_black_24dp.xml 479B
AndroidManifest.xml 1KB
proguard-rules.pro 751B
build.gradle 3KB
.gitignore 186B
screenshot
float-window-app-system.png 203KB
float-window-system-permission-2.png 113KB
float-window-no-permission-1.png 129KB
float-window-system-permission.png 151KB
float-window-app-internal.png 126KB
gradlew.bat 2KB
build.gradle 455B
settings.gradle 15B
release-app
mapping-1.0.txt 563KB
float-window-app-release.apk 1.33MB
gradlew 5KB
.gitignore 186B
README.md 4KB
共 76 条
- 1
资源评论
kagiyamahina33
- 粉丝: 0
- 资源: 2
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功