Android悬浮窗框架

官网
本框架意在解决一些悬浮窗的需求,如果是普通的 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)

相关推荐
Dnelic-2 小时前
【单元测试】【Android】JUnit 4 和 JUnit 5 的差异记录
android·junit·单元测试·android studio·自学笔记
Eastsea.Chen5 小时前
MTK Android12 user版本MtkLogger
android·framework
长亭外的少年12 小时前
Kotlin 编译失败问题及解决方案:从守护进程到 Gradle 配置
android·开发语言·kotlin
建群新人小猿15 小时前
会员等级经验问题
android·开发语言·前端·javascript·php
1024小神16 小时前
tauri2.0版本开发苹果ios和安卓android应用,环境搭建和最后编译为apk
android·ios·tauri
兰琛16 小时前
20241121 android中树结构列表(使用recyclerView实现)
android·gitee
Y多了个想法16 小时前
RK3568 android11 适配敦泰触摸屏 FocalTech-ft5526
android·rk3568·触摸屏·tp·敦泰·focaltech·ft5526
NotesChapter18 小时前
Android吸顶效果,并有着ViewPager左右切换
android
_祝你今天愉快19 小时前
分析android :The binary version of its metadata is 1.8.0, expected version is 1.5.
android
暮志未晚Webgl19 小时前
109. UE5 GAS RPG 实现检查点的存档功能
android·java·ue5