在日常Android
开发当中,我们可能要实现全局悬浮窗的需求。这里分享一个快速实现的框架,希望能帮小伙伴们提高开发效率。
FloatWindow
一个全局悬浮窗的框架,主要特性如下:
1.支持拖动,提供自动贴边等动画
2.内部自动进行权限申请操作
3.可自由指定要显示悬浮窗的界面
4.应用退到后台时,悬浮窗会自动隐藏
5.除小米外,4.4~7.0 无需权限申请
6.位置及宽高可设置百分比值,轻松适配各分辨率
7.支持权限申请结果、位置等状态监听
8.链式调用,简洁清爽
集成到项目
项目的build.gradle
:
allprojects {
repositories {
...
maven { url 'https://jitpack.io' }
}
}
应用的build.gradle
:
dependencies {
implementation 'com.github.yhaolpz:FloatWindow:1.0.9'
}
截止我发布博客,开源库版本是1.0.9
。如果想要查看最新版本,请看开源库wiki
需要权限
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
基础使用
FloatWindow
.with(getApplicationContext())
.setView(view)
.setWidth(100) //设置控件宽高
.setHeight(Screen.width,0.2f)
.setX(100) //设置控件初始位置
.setY(Screen.height,0.3f)
.setDesktopShow(true) //桌面显示
.setViewStateListener(mViewStateListener) //监听悬浮控件状态改变
.setPermissionListener(mPermissionListener) //监听权限申请结果
.build();
可以指定界面显示
.setFilter(true, A_Activity.class, C_Activity.class)
部分界面不展示
.setFilter(false, B_Activity.class)
可拖动悬浮窗以及回弹动画
.setMoveType(MoveType.slide)
.setMoveStyle(500, new AccelerateInterpolator()) //贴边动画时长为500ms,加速插值器
主要有4种MoveType
:
- MoveType.slide : 可拖动,释放后自动贴边 (默认)
- MoveType.back : 可拖动,释放后自动回到原位置
- MoveType.active : 可拖动
- MoveType.inactive : 不可拖动
setMoveStyle 方法可设置动画效果,只在 MoveType.slide 或 MoveType.back 模式下设置此项才有意义。默认减速插值器,默认动画时长为 300ms。
多个悬浮窗
FloatWindow
.with(getApplicationContext())
.setView(imageView)
.build();
FloatWindow
.with(getApplicationContext())
.setView(button)
.setTag("new")
.build();
FloatWindow.get("new").show();
FloatWindow.get("new").hide();
FloatWindow.destroy("new");