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)

相关推荐
花开月满西楼3 分钟前
保姆级【快数学会Android端“动画“】+ 实现补间动画和逐帧动画!!!
android·前端·android studio
这儿有一堆花7 分钟前
打造你的 Android 图像编辑器:深入解析 PhotoEditor 开源库
android·开源
皮皮高1 小时前
itvbox绿豆影视tvbox手机版影视APP源码分享搭建教程
android·前端·后端·开源·tv
EnzoRay2 小时前
MotionEvent
android
玲小珑2 小时前
Auto.js 入门指南(七)定时任务调度
android·前端
墨狂之逸才3 小时前
adb常用命令调试
android
YoungForYou3 小时前
Android端部署NCNN
android
移动开发者1号3 小时前
Jetpack Compose瀑布流实现方案
android·kotlin
移动开发者1号3 小时前
Android LinearLayout、FrameLayout、RelativeLayout、ConstraintLayout大混战
android·kotlin
移动开发者1号3 小时前
ListView与RecyclerView区别总结
android·kotlin