• Stars
    star
    1,316
  • Rank 35,747 (Top 0.8 %)
  • Language
    Java
  • License
    Apache License 2.0
  • Created almost 6 years ago
  • Updated about 1 year ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

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)

框架混淆规则

  • 在混淆规则文件 proguard-rules.pro 中加入
-keep class com.hjq.window.** {*;}

作者的其他开源项目

微信公众号:Android轮子哥

Android 技术 Q 群:10047167

如果您觉得我的开源库帮你节省了大量的开发时间,请扫描下方的二维码随意打赏,要是能打赏个 10.24 🐵就太👍了。您的支持将鼓励我继续创作:octocat:点击查看捐赠列表

广告区

  • 我现在任腾讯云服务器推广大使,大家如果有购买服务器的需求,可以通过下面的链接购买

【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中

【腾讯云】中小企业福利专场,多款刚需产品,满足企业通用场景需求

License

Copyright 2019 Huang JinQun

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

   http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

More Repositories

1

AndroidProject

Android 技术中台,但愿人长久,搬砖不再有
Java
6,224
star
2

XXPermissions

Android 权限请求框架,已适配 Android 14
Java
5,398
star
3

Toaster

Android 吐司框架,专治 Toast 各种疑难杂症
Java
3,084
star
4

EmojiPackage

表情包资源合集,张张都是经典
2,602
star
5

TitleBar

Android 标题栏框架,从此布局属性不用记
Java
1,689
star
6

AndroidVersionAdapter

安卓版本适配全套指南
1,680
star
7

AndroidIndex

Android 资源大汇总
1,307
star
8

EasyHttp

Android 网络请求框架,简单易用,so easy
Java
1,304
star
9

AndroidProject-Kotlin

Android 技术中台 Kotlin 版本,但愿人长久,搬砖不再有
Kotlin
1,206
star
10

AndroidGithubBoss

Github Android 个人技术开源影响力排行榜
1,174
star
11

MultiLanguages

Android 多语种适配框架,兼容高版本,适配第三方库语种
Java
896
star
12

Logcat

Android 日志打印框架,在手机上可以直接看到 Logcat 日志啦
Java
789
star
13

ShapeView

Shape 支持在布局中直接定义啦,支持设置阴影,文字渐变色,状态选择器
Java
746
star
14

StudioPlugins

Android Studio 精品插件合集,不在于多只在于精
664
star
15

GsonFactory

Gson 解析容错框架,愿从此再无 Json 解析报错
Java
633
star
16

AndroidCodeStandard

Android 代码规范文档
565
star
17

AiIndex

ChatGPT
347
star
18

ProvinceJson

省市区Json
223
star
19

NestedScrollLayout

支持嵌套滚动的布局
Java
133
star
20

Donate

开源心得及支持人员列表
81
star
21

MarkdownDoc

57
star
22

ShapeDrawable

Java
54
star
23

getActivity

22
star
24

Markdown

21
star
25

EasyPermissions

Java
17
star
26

MyTomcat

Java
16
star
27

IssueTemplateGuide

8
star