官网
本框架意在解决一些悬浮窗的需求,如果是普通的 Toast 封装推荐使用Toaster
集成步骤
-
如果你的项目 Gradle 配置是在 7.0 以下,需要在 build.gradle 文件中加入
allprojects {
repositories {
// JitPack 远程仓库:https://jitpack.io
maven { url 'https://jitpack.io' }
}
} -
如果你的 Gradle 配置是 7.0 及以上,则需要在 settings.gradle 文件中加入
dependencyResolutionManagement {
repositories {
// JitPack 远程仓库:https://jitpack.io
maven { url 'https://jitpack.io' }
}
} -
配置完远程仓库后,在项目 app 模块下的 build.gradle 文件中加入远程依赖
android {
// 支持 JDK 1.8
compileOptions {
targetCompatibility JavaVersion.VERSION_1_8
sourceCompatibility JavaVersion.VERSION_1_8
}
}dependencies {
// 悬浮窗框架:https://github.com/getActivity/EasyWindow
implementation 'com.github.getActivity:EasyWindow:10.3'
}
使用案例
-
Java 用法
// 传入 Activity 对象表示设置成局部的,不需要有悬浮窗权限
// 传入 Application 对象表示设置成全局的,但需要有悬浮窗权限
EasyWindow.with(this)
.setContentView(R.layout.toast_hint)
// 设置成可拖拽的
//.setDraggable()
// 设置显示时长
.setDuration(1000)
// 设置动画样式
//.setAnimStyle(android.R.style.Animation_Translucent)
// 设置外层是否能被触摸
//.setOutsideTouchable(false)
// 设置窗口背景阴影强度
//.setBackgroundDimAmount(0.5f)
.setImageDrawable(android.R.id.icon, R.mipmap.ic_dialog_tip_finish)
.setText(android.R.id.message, "点我消失")
.setOnClickListener(android.R.id.message, new EasyWindow.OnClickListener<TextView>() {@Override public void onClick(EasyWindow toast, TextView view) { // 点击这个 View 后消失 toast.cancel(); // 跳转到某个Activity // toast.startActivity(intent); } }) .show();
-
Kotlin 用法(二选一)
EasyWindow.with(activity).apply {
setContentView(R.layout.toast_hint)
// 设置成可拖拽的
//setDraggable()
// 设置显示时长
setDuration(1000)
// 设置动画样式
//setAnimStyle(android.R.style.Animation_Translucent)
// 设置外层是否能被触摸
//setOutsideTouchable(false)
// 设置窗口背景阴影强度
//setBackgroundDimAmount(0.5f)
setImageDrawable(android.R.id.icon, R.mipmap.ic_dialog_tip_finish)
setText(android.R.id.message, "点我消失")
setOnClickListener(android.R.id.message, EasyWindow.OnClickListener<TextView?> { toast: EasyWindow<*>, view: TextView? ->
// 点击这个 View 后消失
toast.cancel()
// 跳转到某个Activity
// toast.startActivity(intent);
})
}.show()EasyWindow.with(activity)
.setContentView(R.layout.toast_hint)
// 设置成可拖拽的
//.setDraggable()
// 设置显示时长
.setDuration(1000)
// 设置动画样式
//.setAnimStyle(android.R.style.Animation_Translucent)
// 设置外层是否能被触摸
//.setOutsideTouchable(false)
// 设置窗口背景阴影强度
//.setBackgroundDimAmount(0.5f)
.setImageDrawable(android.R.id.icon, R.mipmap.ic_dialog_tip_finish)
.setText(android.R.id.message, "点我消失")
.setOnClickListener(android.R.id.message, EasyWindow.OnClickListener<TextView?> { toast: EasyWindow<*>, view: TextView? ->
// 点击这个 View 后消失
toast.cancel()
// 跳转到某个Activity
// toast.startActivity(intent);
})
.show()
没有悬浮窗权限如何全局显示?
-
没有悬浮窗权限是不能全局显示在其他应用上的,但是全局显示在自己的应用上是可以实现的
-
但是当前 Activity 创建的悬浮窗只能在当前 Activity 上面显示,如果想在所有的 Activity 都显示需要做特殊处理
-
我们可以通过 Application 来监听所有 Activity 的生命周期方法,然后在每个 Activity.onCreate 时创建悬浮窗
public final class ActivityWindowLifecycle implements Application.ActivityLifecycleCallbacks {
static void with(Application application) { application.registerActivityLifecycleCallbacks(new FloatingLifecycle()); } @Override public void onActivityCreated(Activity activity, Bundle savedInstanceState) { EasyWindow.with(activity) .setView(R.layout.xxx) .show(); } @Override public void onActivityStarted(Activity activity) {} @Override public void onActivityResumed(Activity activity) {} @Override public void onActivityPaused(Activity activity) {} @Override public void onActivityStopped(Activity activity) {} @Override public void onActivitySaveInstanceState(Activity activity, Bundle outState) {} @Override public void onActivityDestroyed(Activity activity) {}
}
框架的 API 介绍
-
对象方法
// 设置悬浮窗宽度
setWidth(int width)
// 设置悬浮窗高度
setHeight(int height)// 设置悬浮窗显示的重心
setGravity(int gravity)
// 设置水平偏移量
setXOffset(int px)
// 设置垂直偏移量
setYOffset(int px)// 设置悬浮窗外层是否可触摸
setOutsideTouchable(boolean touchable)
// 设置悬浮窗背景阴影强度
setBackgroundDimAmount(float amount)// 添加窗口标记
addWindowFlags(int flags)
// 移除窗口标记
removeWindowFlags(int flags)
// 设置窗口标记
setWindowFlags(int flags)
// 是否存在某个窗口标记
hasWindowFlags(int flags)// 设置悬浮窗的显示类型
setWindowType(int type)// 几乎涵盖了所有 WindowManager 的参数
// 更多 API 方法请查看 EasyWindow 类的源码
...... -
静态方法
// 取消所有正在显示的悬浮窗
EasyWindow.cancelAll()// 取消特定类名的悬浮窗
EasyWindow.cancelByClass(Class<EasyWindow<?>> clazz)// 取消特定标记的悬浮窗
EasyWindow.cancelByTag(String tag)// 回收所有正在显示的悬浮窗
EasyWindow.recycleAll()// 回收特定类名的悬浮窗
EasyWindow.recycleByClass(Class<EasyWindow<?>> clazz)// 回收特定标记的悬浮窗
EasyWindow.recycleByTag(String tag)