Home

Awesome

悬浮窗框架

本框架意在解决一些悬浮窗的需求,如果是普通的 Toast 封装推荐使用 Toaster

集成步骤

allprojects {
    repositories {
        // JitPack 远程仓库:https://jitpack.io
        maven { url 'https://jitpack.io' }
    }
}
dependencyResolutionManagement {
    repositories {
        // JitPack 远程仓库:https://jitpack.io
        maven { url 'https://jitpack.io' }
    }
}
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.62'
}

使用案例

// 传入 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<?> easyWindow, TextView view) {
                // 点击这个 View 后消失
                easyWindow.cancel();
                // 跳转到某个Activity
                // easyWindow.startActivity(intent);
            }
        })
        .show();
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?> { easyWindow: EasyWindow<*>, view: TextView? ->
        // 点击这个 View 后消失
        easyWindow.cancel()
        // 跳转到某个Activity
        // easyWindow.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?> { easyWindow: EasyWindow<*>, view: TextView? ->
            // 点击这个 View 后消失
            easyWindow.cancel()
            // 跳转到某个Activity
            // easyWindow.startActivity(intent);
        })
        .show()

没有悬浮窗权限如何全局显示?

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<? extends EasyWindow<?>> clazz)

// 取消特定标记的悬浮窗
EasyWindow.cancelByTag(String tag)

// 回收所有正在显示的悬浮窗
EasyWindow.recycleAll()

// 回收特定类名的悬浮窗
EasyWindow.recycleByClass(Class<? extends EasyWindow<?>> clazz)

// 回收特定标记的悬浮窗
EasyWindow.recycleByTag(String tag)

// 判断当前是否有悬浮窗正在显示
EasyWindow.existShowing()

// 判断当前是否有特定类名的悬浮窗正在显示
EasyWindow.existShowingByClass(Class<? extends EasyWindow<?>> clazz)

// 判断当前是否有特定标记的悬浮窗正在显示
EasyWindow.existShowingByTag(String tag)

框架混淆规则

-keep class com.hjq.window.** {*;}

作者的其他开源项目

微信公众号:Android轮子哥

Android 技术 Q 群:10047167

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

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.