- 支持单页面浮窗,无需权限申请
- 支持全局浮窗、应用前台浮窗,需要授权悬浮窗权限
- 自动权限检测、自动跳转浮窗权限管理页、自动处理授权结果
- 支持系统浮窗的页面过滤
- 支持拖拽,支持各种状态的回调
- 支持默认位置的设定,支持对齐方式和偏移量的设定
- 支持创建多个单页面浮窗、多个系统浮窗,Tag进行区分
- 支持出入动画的设定,有默认动画,可自行替换(策略模式)
- 使用简单、链式调用,无侵入性
- 支持xml直接使用,满足拖拽控件的需求
- 支持解锁更多姿势,如:拖拽缩放、通知弹窗...
权限申请 | 系统浮窗 |
---|---|
前台和过滤 | 状态回调 | 拓展使用 |
---|---|---|
- 在项目的根目录的
build.gradle
添加:
allprojects {
repositories {
...
maven { url 'https://jitpack.io' }
}
}
- 在应用模块的
build.gradle
添加:
dependencies {
implementation 'com.github.princekin-f:EasyFloat:1.0.2'
}
EasyFloat.with(this).setLayout(R.layout.float_app).show()
全局初始化为非必须,当浮窗为仅前台显示,或者设置了浮窗过滤页面,需要进行全局初始化,进行进行页面生命周期检测。
EasyFloat.init(this, isDebug)
权限声明为非必须,如果使用到系统浮窗(ShowPattern.ALL_TIME、ShowPattern.FOREGROUND),需要在
AndroidManifest.xml
进行权限声明。
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
在使用到系统浮窗的情况下,不仅要声明浮窗权限,还要声明启动系统浮窗的服务。该服务和浮窗权限成对出现。
<service android:name="com.lzf.easyfloat.service.FloatService" />
EasyFloat.with(this)
// 设置浮窗xml布局文件
.setLayout(R.layout.float_app)
// 设置浮窗显示类型,默认只在当前Activity显示,可选一直显示、仅前台显示
.setShowPattern(ShowPattern.ALL_TIME)
// 设置吸附方式,共15种模式,详情参考SidePattern
.setSidePattern(SidePattern.RESULT_HORIZONTAL)
// 设置浮窗的标签,用于区分多个浮窗
.setTag("testFloat")
// 设置浮窗是否可拖拽
.setDragEnable(true)
// 设置浮窗固定坐标,ps:设置固定坐标,Gravity属性和offset属性将无效
.setLocation(100, 200)
// 设置浮窗的对齐方式和坐标偏移量
.setGravity(Gravity.END or Gravity.CENTER_VERTICAL, 0, 200)
// 设置宽高是否充满父布局,直接在xml设置match_parent属性无效
.setMatchParent(widthMatch = false, heightMatch = false)
// 设置Activity浮窗的出入动画,可自定义,实现相应接口即可(策略模式),无需动画直接设置为null
.setAnimator(DefaultAnimator())
// 设置系统浮窗的出入动画,使用同上
.setAppFloatAnimator(AppFloatDefaultAnimator())
// 设置系统浮窗的不需要显示的页面
.setFilter(MainActivity::class.java, SecondActivity::class.java)
// 设置我们传入xml布局的详细信息
.invokeView(OnInvokeView { })
// 浮窗的一些状态回调,如:创建结果、显示、隐藏、销毁、touchEvent、拖拽过程、拖拽结束。
.registerCallbacks(object : OnFloatCallbacks {
override fun createdResult(isCreated: Boolean, msg: String?, view: View?) {}
override fun show(view: View) {}
override fun hide(view: View) {}
override fun dismiss() {}
override fun touchEvent(view: View, event: MotionEvent) {}
override fun drag(view: View, event: MotionEvent) {}
override fun dragEnd(view: View) {}
})
// 创建浮窗(不要忘记哦😂)
.show()
无需主动进行权限申请,创建结果、申请结果可在
OnFloatCallbacks
的createdResult
获取。
PermissionUtils.checkPermission(this)
// 关闭浮窗
dismiss(activity: Activity? = null, floatTag: String? = null)
// 隐藏浮窗
hide(activity: Activity? = null, floatTag: String? = null)
// 显示浮窗
show(activity: Activity? = null, floatTag: String? = null)
// 设置是否可拖拽
setDragEnable(activity: Activity? = null, dragEnable: Boolean, floatTag: String? = null )
// 浮窗是否显示
isShow(activity: Activity? = null, floatTag: String? = null)
补充一下:? = null
代表可选参数,不填也行,默认值为null。下同。
// 关闭浮窗
dismissAppFloat(context: Context, tag: String? = null)
// 隐藏浮窗
hideAppFloat(context: Context, tag: String? = null)
// 显示浮窗
showAppFloat(context: Context, tag: String? = null)
// 设置是否可拖拽
appFloatDragEnable(dragEnable: Boolean, tag: String? = null)
// 浮窗是否显示
appFloatIsShow(tag: String? = null)
// 添加单个浮窗过滤页面
filterActivity(activity: Activity, tag: String? = null)
// 添加多个浮窗过滤页面
filterActivities(tag: String? = null, vararg clazz: Class<*>)
// 移除单个浮窗过滤页面
removeFilter(activity: Activity, tag: String? = null)
// 移除多个浮窗过滤页面
removeFilters(tag: String? = null, vararg clazz: Class<*>)
// 清空过滤页面
clearFilters(tag: String? = null)
<com.lzf.easyfloat.widget.activityfloat.FloatingView
android:id="@+id/floatingView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center">
<ImageView
android:layout_width="50dp"
android:layout_height="50dp"
android:src="@mipmap/ic_launcher_round" />
</com.lzf.easyfloat.widget.activityfloat.FloatingView>
需要为FloatingView设置点击事件,不然无法拖拽:
floatingView.setOnClickListener {}
-keep class com.lzf.easyfloat.** {*;}
- 修改
enum
包名,解决Java特殊路径无法调用的问题; - 添加
@JvmOverloads
注解,支持对Java的方法重载。