• Android悬浮窗框架


    官网
    本框架意在解决一些悬浮窗的需求,如果是普通的 Toast 封装推荐使用Toaster
    集成步骤
    • 如果你的项目 Gradle 配置是在 7.0 以下,需要在 build.gradle 文件中加入
    1. allprojects {
    2. repositories {
    3. // JitPack 远程仓库:https://jitpack.io
    4. maven { url 'https://jitpack.io' }
    5. }
    6. }
    • 如果你的 Gradle 配置是 7.0 及以上,则需要在 settings.gradle 文件中加入
    1. dependencyResolutionManagement {
    2. repositories {
    3. // JitPack 远程仓库:https://jitpack.io
    4. maven { url 'https://jitpack.io' }
    5. }
    6. }
    • 配置完远程仓库后,在项目 app 模块下的 build.gradle 文件中加入远程依赖
    1. android {
    2. // 支持 JDK 1.8
    3. compileOptions {
    4. targetCompatibility JavaVersion.VERSION_1_8
    5. sourceCompatibility JavaVersion.VERSION_1_8
    6. }
    7. }
    8. dependencies {
    9. // 悬浮窗框架:https://github.com/getActivity/EasyWindow
    10. implementation 'com.github.getActivity:EasyWindow:10.3'
    11. }
    使用案例
    • Java 用法
    1. // 传入 Activity 对象表示设置成局部的,不需要有悬浮窗权限
    2. // 传入 Application 对象表示设置成全局的,但需要有悬浮窗权限
    3. EasyWindow.with(this)
    4. .setContentView(R.layout.toast_hint)
    5. // 设置成可拖拽的
    6. //.setDraggable()
    7. // 设置显示时长
    8. .setDuration(1000)
    9. // 设置动画样式
    10. //.setAnimStyle(android.R.style.Animation_Translucent)
    11. // 设置外层是否能被触摸
    12. //.setOutsideTouchable(false)
    13. // 设置窗口背景阴影强度
    14. //.setBackgroundDimAmount(0.5f)
    15. .setImageDrawable(android.R.id.icon, R.mipmap.ic_dialog_tip_finish)
    16. .setText(android.R.id.message, "点我消失")
    17. .setOnClickListener(android.R.id.message, new EasyWindow.OnClickListener<TextView>() {
    18. @Override
    19. public void onClick(EasyWindow toast, TextView view) {
    20. // 点击这个 View 后消失
    21. toast.cancel();
    22. // 跳转到某个Activity
    23. // toast.startActivity(intent);
    24. }
    25. })
    26. .show();
    • Kotlin 用法(二选一)
    1. EasyWindow.with(activity).apply {
    2. setContentView(R.layout.toast_hint)
    3. // 设置成可拖拽的
    4. //setDraggable()
    5. // 设置显示时长
    6. setDuration(1000)
    7. // 设置动画样式
    8. //setAnimStyle(android.R.style.Animation_Translucent)
    9. // 设置外层是否能被触摸
    10. //setOutsideTouchable(false)
    11. // 设置窗口背景阴影强度
    12. //setBackgroundDimAmount(0.5f)
    13. setImageDrawable(android.R.id.icon, R.mipmap.ic_dialog_tip_finish)
    14. setText(android.R.id.message, "点我消失")
    15. setOnClickListener(android.R.id.message, EasyWindow.OnClickListener<TextView?> { toast: EasyWindow<*>, view: TextView? ->
    16. // 点击这个 View 后消失
    17. toast.cancel()
    18. // 跳转到某个Activity
    19. // toast.startActivity(intent);
    20. })
    21. }.show()
    1. EasyWindow.with(activity)
    2. .setContentView(R.layout.toast_hint)
    3. // 设置成可拖拽的
    4. //.setDraggable()
    5. // 设置显示时长
    6. .setDuration(1000)
    7. // 设置动画样式
    8. //.setAnimStyle(android.R.style.Animation_Translucent)
    9. // 设置外层是否能被触摸
    10. //.setOutsideTouchable(false)
    11. // 设置窗口背景阴影强度
    12. //.setBackgroundDimAmount(0.5f)
    13. .setImageDrawable(android.R.id.icon, R.mipmap.ic_dialog_tip_finish)
    14. .setText(android.R.id.message, "点我消失")
    15. .setOnClickListener(android.R.id.message, EasyWindow.OnClickListener<TextView?> { toast: EasyWindow<*>, view: TextView? ->
    16. // 点击这个 View 后消失
    17. toast.cancel()
    18. // 跳转到某个Activity
    19. // toast.startActivity(intent);
    20. })
    21. .show()
    没有悬浮窗权限如何全局显示?
    • 没有悬浮窗权限是不能全局显示在其他应用上的,但是全局显示在自己的应用上是可以实现的
    • 但是当前 Activity 创建的悬浮窗只能在当前 Activity 上面显示,如果想在所有的 Activity 都显示需要做特殊处理
    • 我们可以通过 Application 来监听所有 Activity 的生命周期方法,然后在每个 Activity.onCreate 时创建悬浮窗
    1. public final class ActivityWindowLifecycle implements Application.ActivityLifecycleCallbacks {
    2. static void with(Application application) {
    3. application.registerActivityLifecycleCallbacks(new FloatingLifecycle());
    4. }
    5. @Override
    6. public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
    7. EasyWindow.with(activity)
    8. .setView(R.layout.xxx)
    9. .show();
    10. }
    11. @Override
    12. public void onActivityStarted(Activity activity) {}
    13. @Override
    14. public void onActivityResumed(Activity activity) {}
    15. @Override
    16. public void onActivityPaused(Activity activity) {}
    17. @Override
    18. public void onActivityStopped(Activity activity) {}
    19. @Override
    20. public void onActivitySaveInstanceState(Activity activity, Bundle outState) {}
    21. @Override
    22. public void onActivityDestroyed(Activity activity) {}
    23. }
    框架的 API 介绍
    • 对象方法
    1. // 设置悬浮窗宽度
    2. setWidth(int width)
    3. // 设置悬浮窗高度
    4. setHeight(int height)
    5. // 设置悬浮窗显示的重心
    6. setGravity(int gravity)
    7. // 设置水平偏移量
    8. setXOffset(int px)
    9. // 设置垂直偏移量
    10. setYOffset(int px)
    11. // 设置悬浮窗外层是否可触摸
    12. setOutsideTouchable(boolean touchable)
    13. // 设置悬浮窗背景阴影强度
    14. setBackgroundDimAmount(float amount)
    15. // 添加窗口标记
    16. addWindowFlags(int flags)
    17. // 移除窗口标记
    18. removeWindowFlags(int flags)
    19. // 设置窗口标记
    20. setWindowFlags(int flags)
    21. // 是否存在某个窗口标记
    22. hasWindowFlags(int flags)
    23. // 设置悬浮窗的显示类型
    24. setWindowType(int type)
    25. // 几乎涵盖了所有 WindowManager 的参数
    26. // 更多 API 方法请查看 EasyWindow 类的源码
    27. ......
    • 静态方法
    1. // 取消所有正在显示的悬浮窗
    2. EasyWindow.cancelAll()
    3. // 取消特定类名的悬浮窗
    4. EasyWindow.cancelByClass(Class<EasyWindow<?>> clazz)
    5. // 取消特定标记的悬浮窗
    6. EasyWindow.cancelByTag(String tag)
    7. // 回收所有正在显示的悬浮窗
    8. EasyWindow.recycleAll()
    9. // 回收特定类名的悬浮窗
    10. EasyWindow.recycleByClass(Class<EasyWindow<?>> clazz)
    11. // 回收特定标记的悬浮窗
    12. EasyWindow.recycleByTag(String tag)
  • 相关阅读:
    [docker] 网络连接
    mmdet之Loss模块详解
    JVM知识总结(性能调优)
    第三章热备份路由选择协议(HSRP)
    leetcode day12 二叉树的最大深度
    gitee上传代码到仓库步骤(最简洁图文+命令说明)
    泛型基础使用
    1462. 课程表 IV-深度优先遍历
    基于JavaWeb+MySQL的学院党费缴费系统
    【2023CANN训练营第二季】——通过一份入门级算子开发代码了解Ascend C算子开发流程
  • 原文地址:https://blog.csdn.net/ZhaiKun68/article/details/133528828