简介
集成
第 1 步、在工程的 build.gradle 中添加:
allprojects {
repositories {
google()
jcenter()
mavenCentral()()
}
}
第 2 步、在应用的 build.gradle 中添加:
dependencies {
implementation 'io.github.pettywing:floatwindow:1.0.0'
}
使用
基础使用
FloatWindow.with(this, floatView)
.setStartX(Screen.WIDTH, 0.5f)
.setStartY(Screen.HEIGHT, 0.5f)
.build();
// 显示
floatWindow.show();
// 隐藏
floatWindow.dismiss();
// 关闭
floatWindow.dismiss();
// 更新位置
floatWindow.updateLocation(100,200);
builder参数详解
1. setTag
多个悬浮窗管控
// 在新建时可以手动设置tag来唯一标记悬浮窗
FloatWindow.with(this, floatView)
.setTag(FLOAT_WINDOW_TAG)
.build().show();
// 获取的时候可以根据tag来获取
FloatWindow.get(FLOAT_WINDOW_TAG);
// 如果没有设置tag,默认会设置tag为defaultTag
FloatWindow.get();
2. setSystemPopup
设置应用外和应用内悬浮窗 true为应用外悬浮窗,false为应用内悬浮窗
- 应用内悬浮窗:
- 不需要获取权限
- 依托于Activity的windowManager,只能在当前activity显示
- 应用外悬浮窗:
3. setViewStateListener
设置悬浮窗滑动状态监听
4. setPermissionListener
设置悬浮窗权限获取监听
5. 设置宽高和起始位置
FloatWindow.with(this, floatView)
.setWidth(LayoutParams.MATCH_PARENT)
.setHeight(LayoutParams.WRAP_CONTENT)
.setStartX(Screen.WIDTH, 0.5f)
.setStartY(Screen.HEIGHT, 0.5f)
碰到的问题
- layoutParams.gravity只能设置为Gravity.START
当gravity被设置为别的时候,会导致拖动时候的起始位置计算异常,导致拖动错误,如果要设置到其他位置,只能通过修改layoutParams的x和y
- 弹窗输入框无法编辑
默认悬浮窗的layoutParams flag设置的是
WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL<br /> | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;
这种情况下,window的外部可以响应点击,但是内部就无法获取到焦点,导致输入框无法被拉起。 我没有找到很好的解决方案,目前采用的是添加一个editable的状态,在可编辑状态下不开启FLAG_NOT_FOCUSABLE
参考文档
Android悬浮窗看这篇就够了
FloatWindowUtils
WindowManager.LayoutParams的各种flag含义
其他
发布模块到Maven
Android技能树点亮计划Git库
Android技能树点亮计划-语雀文档库
稀土掘金:悠二
Github:PettyWing