GithubHelp home page GithubHelp logo

getactivity / easywindow Goto Github PK

View Code? Open in Web Editor NEW
1.3K 16.0 150.0 61.28 MB

Android 悬浮窗框架,好用不解释

License: Apache License 2.0

Java 100.00%
toast windowmanager window-manager toastutils android-toast floating-window floating floatwindow easyfloat float

easywindow's Introduction

悬浮窗框架

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

使用案例

  • 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<?> easyWindow, TextView view) {
                // 点击这个 View 后消失
                easyWindow.cancel();
                // 跳转到某个Activity
                // easyWindow.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?> { 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()

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

  • 没有悬浮窗权限是不能全局显示在其他应用上的,但是全局显示在自己的应用上是可以实现的

  • 但是当前 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.

easywindow's People

Contributors

880634 avatar getactivity avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

easywindow's Issues

能否支持view的部分边界移动到屏幕外

建议收集

  • issue 是否有人曾提过类似的问题?

  • 你觉得框架有什么不足之处?
    能否支持view部分边界移动到屏幕外。

  • 你觉得该怎么去完善会比较好?

支持FLAG_LAYOUT_NO_LIMITSflag,目前我是通过设置这个flag,再在onTouch中处理边界问题。

WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS

设置全屏显示的悬浮窗

如题,想设置全屏显示的悬浮窗
布局中设置match_parent无效,
XToast.setHeight+XToast.setWidth,也无效
请问有啥方法可以设置悬浮窗全屏显示吗?

请严格按照 issue 模板来提问题,否则一律不受理

最近发现有很多人给我提 issue 没有认真按照模板上面的来填写,导致了在排查问题的过程中浪费了作者许多不必要的时间和精力,所以请后面提 issue 的人务必严格遵守,否则我不会受理,直接关闭 issue。

做了个悬浮菜单栏

建议收集

  • issue 是否有人曾提过类似的问题?(必答项,一旦出现重复提问我将不会再次解答)

  • 你觉得框架有什么不足之处?(必答项,你可以描述框架有什么令你不满意的地方)

  • 点击按钮 会展开菜单 但是目前想点击菜单外面 先收缩菜单 请问怎么实现

  • 你觉得该怎么去完善会比较好?(非必答项,你可以提供一下自己的想法或者做法供作者参考)

[建议]:优化调用写法

你觉得框架有什么不足之处?【必答】

调用写法比较丑,EasyWindow<EasyWindow<*>>,建议优化一下,比如写成EasyWindow.with(actitvty)。

issue 是否有人曾提过类似的建议?【必答】

框架文档是否提及了该问题【必答】

是否已经查阅框架文档但还未能解决的【必答】

你觉得该怎么去完善会比较好?【非必答】

EasyWindow.with(context).***

内存泄露

xtoast用的2.6版,xtoast内部会持有activity造成内存泄露

全局悬浮窗拖动卡顿

【警告:请务必按照 issue 模板填写,不要抱有侥幸心理,一旦发现 issue 没有按照模板认真填写,一律直接关闭】

全局可拖拽的悬浮窗,在应用至后台运行时,拖动悬浮窗之后回弹卡顿。

  • 框架版本【必填】:8.6

  • 问题描述【必填】:全局可拖拽的悬浮窗,在应用至后台运行时,拖动悬浮窗之后回弹卡顿。

  • 复现步骤【必填】:打开全局可拖拽悬浮窗,将应用放置后台运行,在桌面拖动悬浮窗,可看到悬浮窗回弹时卡顿。

  • 是否必现【必填】:是

  • 出现问题的手机信息【必填】:华为p40pro

  • 出现问题的安卓版本【必填】:鸿蒙3.0 (android 12)

  • 问题信息的来源渠道【必填】:本框架的demo以及自己的项目中使用时发现

请回答

  • 是部分机型还是所有机型都会出现【必答】:部分/全部(例如:某为,某 Android 版本会出现)

  • 框架最新的版本是否存在这个问题【必答】:是,旧版本无此问题

  • 是否已经查阅框架文档还未能解决的【必答】:是

  • issue 是否有人曾提过类似的问题【必答】:否

  • 是否可以通过 Demo 来复现该问题【必答】:是

  • 使用原生的 WindowManager 是否也会出现该问题【非必答】:是/否(排查一下是不是框架的代码存在问题导致的)

其他

  • 提供报错堆栈(如果有报错的话必填,注意不要拿被混淆过的代码堆栈上来)

  • 提供截图或视频(根据需要提供,此项不强制)

179_1668788209.mp4
  • 提供解决方案(如果已经解决了的话,此项不强制)

[疑惑]:EasyWindow 在多个Activity中展示的时候 切换 activity 保存坐标问题

问题描述【必填】

EasyWindow 在多个Activity中展示的时候 切换 activity 后 如果不保存坐标 回到了默认的地方 我在设置了

.setOnTouchListener { window, _, _ ->
                            LogUtils.dTag(TAG, "setOnTouchListener--mWindowParams!=null")
                            mWindowParams = window.windowParams
                            true
                        }

发现没有触发 我需要在什么时机获取并保存 windowParams

另外 我在 使用了 setOnClickListener 确保 了 mWindowParams 可以赋值 但是这个时候 setWindowParams(mWindowParams) 后 悬浮窗找不到了

setOnClickListener { window, view ->
                            LogUtils.dTag(TAG, "setOnClickListener--mWindowParams!=null")
                            mWindowParams = window.windowParams
                        }

我的完整代码如下 请教下大佬 我该在什么时机 获取并保存 windowParams 获取后 直接设置 .setWindowParams(mWindowParams) 是有什么问题吗 为什么会找不到了呢

object FloatViewUtils {
    private const val TAG = "FloatViewUtils"
    private var mWindowParams: WindowManager.LayoutParams? = null
    fun initFloat() {
        // 注册Activity生命周期监听
        registerActivityLifecycleCallbacks()
    }

    /**
     * 注册Activity生命周期监听
     */
    private fun registerActivityLifecycleCallbacks() {
        Abase.app.registerActivityLifecycleCallbacks(object : Application.ActivityLifecycleCallbacks {
            override fun onActivityCreated(activity: Activity, savedInstanceState: Bundle?) {
                LogUtils.dTag(TAG, "onActivityCreated--${activity.localClassName}")
            }

            override fun onActivityStarted(activity: Activity) {
                LogUtils.dTag(TAG, "onActivityStarted--${activity.localClassName}")
            }

            override fun onActivityResumed(activity: Activity) {
                LogUtils.dTag(TAG, "onActivityResumed--${activity.localClassName}")
                if (mWindowParams == null) {
                    LogUtils.dTag(TAG, "onActivityResumed--${activity.localClassName}--mWindowParams==null")
                    EasyWindow.with(activity)
                        .setContentView(R.layout.float_download)
                        .setDraggable(SpringDraggable())
                        .setGravity(Gravity.END or Gravity.CENTER_VERTICAL)
                        .setTag(activity.localClassName)
                        .setOnClickListener { window, view ->
                            LogUtils.dTag(TAG, "setOnClickListener--mWindowParams==null")
                            mWindowParams = window.windowParams
                        }
                        /*.setOnTouchListener { window, _, _ ->
                            LogUtils.dTag(TAG, "setOnTouchListener--mWindowParams==null")
                            mWindowParams = window.windowParams
                            true
                        }*/
                        .show()
                } else {
                    LogUtils.dTag(TAG, "onActivityResumed--${activity.localClassName}--mWindowParams!=null")
                    EasyWindow.with(activity)
                        .setContentView(R.layout.float_download)
                        .setDraggable(SpringDraggable())
                        .setWindowParams(mWindowParams)
                        .setTag(activity.localClassName)
                        .setOnClickListener { window, view ->
                            LogUtils.dTag(TAG, "setOnClickListener--mWindowParams!=null")
                            mWindowParams = window.windowParams
                        }
                        /*.setOnTouchListener { window, _, _ ->
                            LogUtils.dTag(TAG, "setOnTouchListener--mWindowParams!=null")
                            mWindowParams = window.windowParams
                            true
                        }*/
                        .show()
                }
            }

            override fun onActivityPaused(activity: Activity) {
                LogUtils.dTag(TAG, "onActivityPaused--${activity.localClassName}")
                EasyWindow.cancelByTag(activity.localClassName)
                EasyWindow.recycleByTag(activity.localClassName)
            }

            override fun onActivityStopped(activity: Activity) {
                LogUtils.dTag(TAG, "onActivityStopped--${activity.localClassName}")
            }

            override fun onActivitySaveInstanceState(activity: Activity, outState: Bundle) {
                LogUtils.dTag(TAG, "onActivitySaveInstanceState--${activity.localClassName}")
            }

            override fun onActivityDestroyed(activity: Activity) {
                LogUtils.dTag(TAG, "onActivityDestroyed--${activity.localClassName}")
            }

        })
    }
}

框架文档是否提及了该问题【必答】

是否已经查阅框架文档但还未能解决的【必答】

issue 列表中是否有人曾提过类似的问题【必答】

是否已经搜索过了 issue 列表但还未能解决的【必答】

[建议]:增加控制台的悬浮窗

你觉得框架有什么不足之处?【必答】

我想做一个webview控制台日志输出界面,需要悬浮在右上角,持续输出webview日志

issue 是否有人曾提过类似的建议?【必答】

框架文档是否提及了该问题【必答】

是否已经查阅框架文档但还未能解决的【必答】

你觉得该怎么去完善会比较好?【非必答】

No response

[Bug]:Didn't find class "com.hjq.window.draggable.SpringDraggable"

框架版本【必填】

10.6

问题描述【必填】

报错:Caused by: java.lang.ClassNotFoundException: Didn't find class "com.hjq.window.draggable.SpringDraggable" on path;
降级到10.3版本是ok的;
10.5开始库里面的 Lcom/hjq/window/draggable/SpringDraggable ;SpringDraggable类名改为了SpringBackDraggable,所以找不到这个类,报错

复现步骤【必填】

直接运行示例代码

是否必现【必填】

项目 targetSdkVersion【必填】

30

出现问题的手机信息【必填】

华为mate60pro

出现问题的安卓版本【必填】

Android12

问题信息的来源渠道【必填】

自己遇到的

是部分机型还是所有机型都会出现【必答】

必须

框架最新的版本是否存在这个问题【必答】

框架文档是否提及了该问题【必答】

是否已经查阅框架文档但还未能解决的【必答】

issue 列表中是否有人曾提过类似的问题【必答】

是否已经搜索过了 issue 列表但还未能解决的【必答】

是否可以通过 Demo 来复现该问题【必答】

未选择

提供报错堆栈

java.lang.NoClassDefFoundError: Failed resolution of: Lcom/hjq/window/draggable/SpringDraggable;
        at com.hjq.logcat.LogcatWindow.<init>(LogcatWindow.java:33)
        at com.hjq.logcat.LogcatDispatcher.onActivityCreated(LogcatDispatcher.java:25)
        at android.app.Application.dispatchActivityCreated(Application.java:360)
        at android.app.Activity.dispatchActivityCreated(Activity.java:1407)
        at android.app.Activity.onCreate(Activity.java:1692)
        at androidx.core.app.ComponentActivity.onCreate(ComponentActivity.java:85)
        at androidx.activity.ComponentActivity.onCreate(ComponentActivity.java:149)
        at androidx.fragment.app.FragmentActivity.onCreate(FragmentActivity.java:313)
        at androidx.appcompat.app.AppCompatActivity.onCreate(AppCompatActivity.java:118)
        at com.lib.base.BaseActivity.onCreate(BaseActivity.java:38)
        at com.changjian.anyeerong.supportBase.SupportBaseActivity.onCreate(SupportBaseActivity.java:80)
        at android.app.Activity.performCreate(Activity.java:8592)
        at android.app.Activity.performCreate(Activity.java:8565)
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1344)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:4744)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:4994)
        at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:123)
        at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:149)
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:103)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:3070)
        at android.os.Handler.dispatchMessage(Handler.java:117)
        at android.os.Looper.loopOnce(Looper.java:205)
        at android.os.Looper.loop(Looper.java:293)
        at android.app.ActivityThread.loopProcess(ActivityThread.java:9961)
        at android.app.ActivityThread.main(ActivityThread.java:9950)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:586)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1240)
     Caused by: java.lang.ClassNotFoundException: Didn't find class "com.hjq.window.draggable.SpringDraggable" on path: DexPathList[[zip file "/data/app/~~P8iW32qZu8oiNW-Pxj8LwQ==/com.changjian.anyeerong-0Vr7Ja2vNAqLa8e1J6oUFg==/base.apk"],nativeLibraryDirectories=[/data/app/~~P8iW32qZu8oiNW-Pxj8LwQ==/com.changjian.anyeerong-0Vr7Ja2vNAqLa8e1J6oUFg==/lib/arm64, /data/app/~~P8iW32qZu8oiNW-Pxj8LwQ==/com.changjian.anyeerong-0Vr7Ja2vNAqLa8e1J6oUFg==/base.apk!/lib/arm64-v8a, /system/lib64, /hw_product/lib64, /system/lib64/module/multimedia, /system/product/lib64]]
        at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:218)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:379)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:312)
        at com.hjq.logcat.LogcatWindow.<init>(LogcatWindow.java:33) 
        at com.hjq.logcat.LogcatDispatcher.onActivityCreated(LogcatDispatcher.java:25) 
        at android.app.Application.dispatchActivityCreated(Application.java:360) 
        at android.app.Activity.dispatchActivityCreated(Activity.java:1407) 
        at android.app.Activity.onCreate(Activity.java:1692) 
        at androidx.core.app.ComponentActivity.onCreate(ComponentActivity.java:85) 
        at androidx.activity.ComponentActivity.onCreate(ComponentActivity.java:149) 
        at androidx.fragment.app.FragmentActivity.onCreate(FragmentActivity.java:313) 
        at androidx.appcompat.app.AppCompatActivity.onCreate(AppCompatActivity.java:118) 
        at com.lib.base.BaseActivity.onCreate(BaseActivity.java:38) 
        at xxx.SupportBaseActivity.onCreate(SupportBaseActivity.java:80) 
        at android.app.Activity.performCreate(Activity.java:8592) 
        at android.app.Activity.performCreate(Activity.java:8565) 
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1344) 
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:4744) 
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:4994) 
        at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:123) 
        at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:149) 
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:103) 
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:3070) 
        at android.os.Handler.dispatchMessage(Handler.java:117) 
        at android.os.Looper.loopOnce(Looper.java:205) 
        at android.os.Looper.loop(Looper.java:293) 
        at android.app.ActivityThread.loopProcess(ActivityThread.java:9961) 
        at android.app.ActivityThread.main(ActivityThread.java:9950) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:586) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1240) 

提供截图或视频

No response

提供解决方案

降级到10.3版本是ok的;
10.5开始库里面的 Lcom/hjq/window/draggable/SpringDraggable ;SpringDraggable类名改为了SpringBackDraggable,所以找不到这个类,报错

小米系列手机应用外悬浮弹窗无法启动应用内activtiy

就是我用的是悬浮窗,当我收到在系统桌面或者是其他应用内的时候,点击悬浮窗的按钮,无法启动应用的activity,但是在应用内是可以启动的

目前测试华为、1 + 手机应用内外都可以启动activity

请问是什么原因

[疑惑]:正常弹出窗之后,能否实现点击弹窗外区域关闭弹窗功能

问题描述【必填】

不是悬浮弹窗,点击弹窗周围,无法关闭弹窗

框架文档是否提及了该问题【必答】

是否已经查阅框架文档但还未能解决的【必答】

issue 列表中是否有人曾提过类似的问题【必答】

是否已经搜索过了 issue 列表但还未能解决的【必答】

竖屏切换至横屏之后悬浮窗位置显示异常

【警告:请务必按照 issue 模板填写,不要抱有侥幸心理,一旦发现 issue 没有按照模板认真填写,一律直接关闭】

问题描述

  • 框架版本【必填】:v8.5

  • 问题描述【必填】:悬浮窗在横屏状态下显示之后然后将屏幕切为横屏模式,悬浮窗位置显示异常。

  • 复现步骤【必填】:竖屏状态下显示悬浮穿,然后将应用切换为横屏显示,悬浮窗位置发生变化。

  • 是否必现【必填】:是

  • 出现问题的手机信息【必填】:所有机型

  • 出现问题的安卓版本【必填】:所有版本

请回答

  • 是部分机型还是所有机型都会出现【必答】:全部

  • 框架最新的版本是否存在这个问题【必答】:是

  • 是否已经查阅框架文档还未能解决的【必答】:是

  • issue 是否有人曾提过类似的问题【必答】:否

  • 是否可以通过 Demo 来复现该问题【必答】:是

  • 使用原生的 WindowManager 是否也会出现该问题【非必答】:是

其他

  • 提供报错堆栈(如果有报错的话必填,注意不要拿被混淆过的代码堆栈上来)

  • 提供截图或视频(根据需要提供,此项不强制)

1664787220061224.mp4
  • 提供解决方案(如果已经解决了的话,此项不强制)

请教关于点击穿透

  • issue 是否有人曾提过类似的问题? 没有

  • 你觉得框架有什么不足之处? 没有

好哥哥,点击穿透悬浮窗,执行悬浮窗下面的按钮或者其他,
能实现吗,可以帮帮我吗.

build写法在kotlin上会出现神奇的bug, 使用apply就不会了, 建议首页文档推荐使用apply写法

我使用kotlin这样写的话, 编译时会出现问题

XToast<XToast<*>>(context)
    .setView(R.layout.float_layout)
    .setAnimStyle(android.R.style.Animation_Translucent)
    .setDuration(3000)
    .show()
e: org.jetbrains.kotlin.codegen.CompilationException: Back-end (JVM) Internal error: Failed to generate expression: KtCallExpression

而使用Java或者先实例化再逐个调用都不会出现这个问题

val xToast = XToast<XToast<*>>(App.getInstance())
        xToast.setView(R.layout.float_layout)
        xToast.setAnimStyle(android.R.style.Animation_Translucent)
        xToast.setDuration(3000)
        xToast.show()

最后从百度得知kotlin自带builder模式写法, 改成了

XToast<XToast<*>>(App.getInstance()).apply {
    setView(R.layout.float_layout)
    setAnimStyle(android.R.style.Animation_Translucent)
    setDuration(3000)
}.show()

这样写问题就解决了, 虽然不知道是为什么, 目前我的kotlin版本是1.4.10, 之前好像是1.3.x, 因为出现这个版本才升级的, 但改版本好像没有解决问题, 改写法才解决了

MIX2s手机的问题

MIX2s手机的问题3.0弹不出弹窗,如果遇到了,升级到3.5就可以了

[疑惑]:请问如何在某些页面隐藏悬浮窗

问题描述【必填】

请问如何在某些页面不显示(隐藏)悬浮窗呢?我以为是通过setWindowAlpha,但这样即使alpha为0 在页面不显示,但是还是会点击到

框架文档是否提及了该问题【必答】

是否已经查阅框架文档但还未能解决的【必答】

issue 列表中是否有人曾提过类似的问题【必答】

是否已经搜索过了 issue 列表但还未能解决的【必答】

[Bug]:内存泄漏

框架版本【必填】

10.2

问题描述【必填】

Demo在多点击几次之后LeakCanary弹出提示

复现步骤【必填】

Demo点击任意弹窗十余次之后便可复现

是否必现【必填】

项目 targetSdkVersion【必填】

33

出现问题的手机信息【必填】

Pixel 6a

出现问题的安卓版本【必填】

13

问题信息的来源渠道【必填】

自己遇到的

是部分机型还是所有机型都会出现【必答】

全部

框架最新的版本是否存在这个问题【必答】

框架文档是否提及了该问题【必答】

是否已经查阅框架文档但还未能解决的【必答】

issue 列表中是否有人曾提过类似的问题【必答】

是否已经搜索过了 issue 列表但还未能解决的【必答】

是否可以通过 Demo 来复现该问题【必答】

提供报错堆栈

====================================
HEAP ANALYSIS RESULT
====================================
1 APPLICATION LEAKS
References underlined with "~~~" are likely causes.
Learn more at https://squ.re/leaks.
61776 bytes retained by leaking objects
Displaying only 1 leak trace out of 8 with the same signature
Signature: e8dc1830298c83e1d8626e8cc73bd4a093182a68
┬───
│ GC Root: Thread object
│
├─ android.os.HandlerThread instance
│    Leaking: NO (PathClassLoader↓ is not leaking)
│    Thread name: 'LeakCanary-Heap-Dump'
│    ↓ Thread.contextClassLoader
├─ dalvik.system.PathClassLoader instance
│    Leaking: NO (EasyWindow↓ is not leaking and A ClassLoader is never leaking)
│    ↓ ClassLoader.runtimeInternalObjects
├─ java.lang.Object[] array
│    Leaking: NO (EasyWindow↓ is not leaking)
│    ↓ Object[104]
├─ com.hjq.window.EasyWindow class
│    Leaking: NO (a class is never leaking)
│    ↓ static EasyWindow.sWindowInstanceSet
│                        ~~~~~~~~~~~~~~~~~~
├─ java.util.ArrayList instance
│    Leaking: UNKNOWN
│    Retaining 108 B in 2 objects
│    ↓ ArrayList[0]
│               ~~~
├─ com.hjq.window.EasyWindow instance
│    Leaking: UNKNOWN
│    Retaining 8.0 kB in 138 objects
│    mContext instance of com.hjq.window.demo.MainActivity with mDestroyed = false
│    ↓ EasyWindow.mDecorView
│                 ~~~~~~~~~~
╰→ com.hjq.window.WindowLayout instance
​     Leaking: YES (ObjectWatcher was watching this because com.hjq.window.WindowLayout received
​     View#onDetachedFromWindow() callback)
​     Retaining 7.7 kB in 133 objects
​     key = c05f72df-b79b-4a7d-b27b-aba366361563
​     watchDurationMillis = 7698
​     retainedDurationMillis = 2687
​     View not part of a window view hierarchy
​     View.mAttachInfo is null (view detached)
​     View.mWindowAttachCount = 1
​     mContext instance of com.hjq.window.demo.MainActivity with mDestroyed = false
====================================
0 LIBRARY LEAKS
A Library Leak is a leak caused by a known bug in 3rd party code that you do not have control over.
See https://square.github.io/leakcanary/fundamentals-how-leakcanary-works/#4-categorizing-leaks
====================================
0 UNREACHABLE OBJECTS
An unreachable object is still in memory but LeakCanary could not find a strong reference path
from GC roots.
====================================
METADATA
Please include this in bug reports and Stack Overflow questions.
Build.VERSION.SDK_INT: 33
Build.MANUFACTURER: Google
LeakCanary version: 2.12
App process name: com.hjq.window.demo
Class count: 24306
Instance count: 193837
Primitive array count: 131621
Object array count: 28361
Thread count: 20
Heap total bytes: 25415644
Bitmap count: 5
Bitmap total bytes: 373071
Large bitmap count: 0
Large bitmap total bytes: 0
Stats: LruCache[maxSize=3000,hits=111188,misses=193892,hitRate=36%]
RandomAccess[bytes=9671177,reads=193892,travel=79192133444,range=30789647,size=38123703]
Heap dump reason: 7 retained objects, app is visible
Analysis duration: 4860 ms
Heap dump file path: /storage/emulated/0/Download/leakcanary-com.hjq.window.demo/2023-07-11_14-14-10_838.hprof
Heap dump timestamp: 1689056058581
Heap dump duration: 1709 ms
====================================

提供截图或视频

No response

提供解决方案

No response

[Bug]:内存泄漏,必现

框架版本【必填】

api 'com.github.getActivity:EasyWindow:10.3'

问题描述【必填】

内存泄漏,必现

复现步骤【必填】

  • 直接调用api展示后,弹窗消失后,内存泄漏
 EasyWindow.with(UiKit.getApplication())
            .setContentView(R.layout.layout_notification_cstom_top_bar)
            .setAnimStyle(R.style.TopInOutAnimStyle)
            .setGravity(Gravity.TOP or Gravity.CENTER_HORIZONTAL)
            .setOutsideTouchable(true)
            .setDuration(3000)
            .show()

是否必现【必填】

项目 targetSdkVersion【必填】

30

出现问题的手机信息【必填】

华为 AGS5Z-W09

出现问题的安卓版本【必填】

12

问题信息的来源渠道【必填】

自己遇到的

是部分机型还是所有机型都会出现【必答】

所有

框架最新的版本是否存在这个问题【必答】

框架文档是否提及了该问题【必答】

是否已经查阅框架文档但还未能解决的【必答】

issue 列表中是否有人曾提过类似的问题【必答】

是否已经搜索过了 issue 列表但还未能解决的【必答】

是否可以通过 Demo 来复现该问题【必答】

提供报错堆栈

看截图,内存泄漏并不会造成崩溃

提供截图或视频

提供解决方案

No response

全局模式悬浮窗的触摸式事件无法透传到桌面

全局模式悬浮窗的触摸式事件无法透传到桌面

  • 框架版本【必填】:implementation 'com.github.getActivity:XToast:8.9'

  • 问题描述【必填】:我要做一个护眼蒙层,全局的那种,使用时发现悬浮窗的触摸式事件无法透传到桌面

  • 复现步骤【必填】:

  • 是否必现【必填】:是,

  • 出现问题的手机信息【必填】:华为荣耀30pro

  • 出现问题的安卓版本【必填】:鸿蒙os 3.0

  • 问题信息的来源渠道【必填】:自己遇到的

请回答

  • 是部分机型还是所有机型都会出现【必答】:全部,所有机型都不能透传事件

  • 使用原生的 WindowManager 是否也会出现该问题【非必答】:鸿蒙2.0不会出现,鸿蒙3.0会,Android部分机型荣耀50系列会出现

XToast<XToast<*>>(this.application).apply {
val coverLayout = FrameLayout(this)
contentView = coverLayout
setWidth( XDisplayHelper.dp2px(applicationContext,180f))
setHeight( XDisplayHelper.dp2px(applicationContext,180f))
coverLayout.setBackgroundColor(Color.RED)
setGravity(Gravity.TOP or Gravity.START)
setOutsideTouchable(true)
setDraggable(null)
setOnTouchListener { toast, view, event ->
false
}
show()
}

使用方式如上,悬浮窗 内的触摸事件无法透传下去。
请大佬看看!

[Bug]:窗口会自动上下浮动

框架版本【必填】

10.3

问题描述【必填】

在设置多个全局窗口时,设置的窗口会跟随activity启动上下浮动。如果自己定义全局弹出不会出现该问题。可以确定时框架的问题,初步判断时安卓自带的虚拟按键隐藏和显示影响上下浮动。demo的为隐藏和显示虚拟按键不存在改问题

VID_20231021_162228_0_COMPRESSED.mp4

复现步骤【必填】

使用以下代码,然后在welCome Activity界面初始化就必现,如果自己定义的全局不会出现这个问题
代码如下
image
image

是否必现【必填】

项目 targetSdkVersion【必填】

30

出现问题的手机信息【必填】

这里没

出现问题的安卓版本【必填】

8.1

问题信息的来源渠道【必填】

自己遇到的

是部分机型还是所有机型都会出现【必答】

自己android定制系统8.1

框架最新的版本是否存在这个问题【必答】

框架文档是否提及了该问题【必答】

是否已经查阅框架文档但还未能解决的【必答】

issue 列表中是否有人曾提过类似的问题【必答】

是否已经搜索过了 issue 列表但还未能解决的【必答】

是否可以通过 Demo 来复现该问题【必答】

提供报错堆栈

未报错,初步判断问题是系统自带虚拟按键隐藏和显示时候就会出现上下浮动。

提供截图或视频

No response

提供解决方案

No response

提 issue 需知

Github沟通效率实在是很低下,大家伙有问题或者Bug直接到Q群78797078私信给我反馈就OK,我会尽快答复你的问题

[疑惑]:实现不需要权限的全局悬浮窗,显示在Dialog上

问题描述【必填】

现在的框架在Activity中显示没有问题。
我有一个面积很大的Dialog,宽度=屏幕宽,高度=屏幕高的一半,显示在屏幕正中。
现在悬浮窗只能显示在Dialog下面的Activity上,我想在Dialog上也能显示悬浮窗。并且在关闭这个dialog后,在其他Activity上也保留悬浮窗,请问有没有什么解决办法?

框架文档是否提及了该问题【必答】

是否已经查阅框架文档但还未能解决的【必答】

issue 列表中是否有人曾提过类似的问题【必答】

是否已经搜索过了 issue 列表但还未能解决的【必答】

请教一下

在悬浮窗上面放输入框可以直接编辑文本吗

[Bug]:横竖屏切换,悬浮窗不会自动贴边

框架版本【必填】

10.3

问题描述【必填】

使用全局可拖拽的悬浮窗,横竖屏切换时候,悬浮窗不会自动贴边

复现步骤【必填】

demo--全局可拖拽的悬浮窗
1.竖屏情况下,拖拽悬浮窗到任意位置(中间等等)。
2.切换到横屏,会发现悬浮窗停留在刚刚切换的任意位置(中间等等),而不是自动贴边。

是否必现【必填】

项目 targetSdkVersion【必填】

33

出现问题的手机信息【必填】

红米K40 S

出现问题的安卓版本【必填】

13

问题信息的来源渠道【必填】

自己遇到的

是部分机型还是所有机型都会出现【必答】

全部

框架最新的版本是否存在这个问题【必答】

框架文档是否提及了该问题【必答】

是否已经查阅框架文档但还未能解决的【必答】

issue 列表中是否有人曾提过类似的问题【必答】

是否已经搜索过了 issue 列表但还未能解决的【必答】

是否可以通过 Demo 来复现该问题【必答】

提供报错堆栈

No response

提供截图或视频

No response

提供解决方案

No response

[Bug]:移动、横竖屏后不贴边

框架版本【必填】

10.3

问题描述【必填】

竖屏下生成全局可拖拽悬浮窗,移动后,再切换横屏后不贴边,再次切换竖屏也不会贴边

复现步骤【必填】

使用提供的demo,竖屏下生成全局可拖拽悬浮窗,移动后,再切换横屏后不贴边,再次切换竖屏也不会贴边

是否必现【必填】

项目 targetSdkVersion【必填】

33

出现问题的手机信息【必填】

readme k40

出现问题的安卓版本【必填】

13

问题信息的来源渠道【必填】

自己遇到的

是部分机型还是所有机型都会出现【必答】

全部

框架最新的版本是否存在这个问题【必答】

框架文档是否提及了该问题【必答】

是否已经查阅框架文档但还未能解决的【必答】

未选择

issue 列表中是否有人曾提过类似的问题【必答】

是否已经搜索过了 issue 列表但还未能解决的【必答】

是否可以通过 Demo 来复现该问题【必答】

提供报错堆栈

No response

提供截图或视频

https://img.qiaoxuesi.com/files/977_Screenrecorder-2023-11-15-22-12-53-339_0_COMPRESSED.mp4

https://github.com/lihui68/GkTest/blob/main/mp4/Screenrecorder-2023-11-15-22-12-53-339_0_COMPRESSED.mp4

提供解决方案

No response

在webview所在的activity中使用时,屏幕截图然后返回桌面,NullPointerException异常,具体在描述里。

【警告:请务必按照 issue 模板填写,不要抱有侥幸心理,一旦发现 issue 没有按照模板认真填写,一律直接关闭】

问题描述

  • 框架版本【必填】:10.0

  • 问题描述【必填】:webView所在的activity因为存在全屏播放,设置了android:configChanges="orientation|screenSize",如标题所描述,截图后返回桌面,(后台悬浮窗权限已开)悬浮窗会报错
    java.lang.NullPointerException: Attempt to invoke virtual method 'void android.view.View.getWindowVisibleDisplayFrame(android.graphics.Rect)' on a null object reference

  • 复现步骤【必填】:webview所在的activity屏幕截图然后返回桌面

  • 是否必现【必填】:是

  • 项目 targetSdkVersion【必填】:31

  • 出现问题的手机信息【必填】:一加11 OnePlus PHB110

  • 出现问题的安卓版本【必填】:Android13

  • 问题信息的来源渠道【必填】:自己遇到的

请回答

  • 是部分机型还是所有机型都会出现【必答】:部分

  • 框架最新的版本是否存在这个问题【必答】:是

  • 是否已经查阅框架文档还未能解决的【必答】:是

  • issue 是否有人曾提过类似的问题【必答】:否

  • 是否可以通过 Demo 来复现该问题【必答】:是

  • 使用原生的 WindowManager 是否也会出现该问题【非必答】:

其他

  • 提供报错堆栈 --

  • 提供截图或视频

5b45c57fff259b2f0cdff9cfff1058e

  • 提供解决方案 暂无

android 6.0版本兼容问题

image

用Demo测试 6.0以下用activity创建,Toast结束会导致退出程序:测试机系统是Android 4.4.4

6.0以上用Application创建,Toast不会出现:测试机 系统是 Android 8.1.0

TimerTask是异步执行的,这么cancel有问题吧

Timer.schedule(ToastDismissTask)这个,因为ToastDismissTask是在异步线程里执行的,虽然WindowManager里调用removeView不会出问题,但是cancel涉及到线程同步吧,isShow就会出现状态不准的情况。

EasyWindow 和 Toaster 该如何选择?

建议收集

  • 你觉得框架有什么不足之处?(必答项,你可以描述框架有什么令你不满意的地方)
    EasyWindow 和 Toaster 这两个命名,Toaster 好理解 ,就是 Toast 专用的,但是 EasyWindow 他可以用于悬浮窗,也可以实现PopupWindow,也可以实现 Toast ,这不知道该如何选择。总感觉 Toaster 是基于 EasyWindow 实现的。

  • 你觉得该怎么去完善会比较好?(非必答项,你可以提供一下自己的想法或者做法供作者参考)
    我只是一个想法,可不可以将他两整合在一起呢?这样就不用再纠结,该使用哪个,不该使用哪个。既然 EasyWindow 都能实现了,之前引的 Toaster,是不是有点多余呢?但是把 Toaster 全部替换成 EasyWindow 还有点工作量。

自定义布局

填充自定义布局,里面有个进度条pb,怎么动态去获取子view更新进度

不设置点击事件就无法拖动?

拖动模式使用的SpringDraggable();但是很奇怪不设置xToast的setOnClickListener就无法拖动悬浮窗,demo中也是一样,目前需求是做个类似于微信视频通话的悬浮窗

自定义动画问题

前段时间接到个需求,需要自定义toast弹出动画。我们都知道原生的toast是不支持的,就算反射修改也不行,具体为什么我没找到源码,但我揣测只要type为toast的window,系统在加载动画时根本不管你设置的什么,只会取系统的动画。所以想到你这种用WindowManager来实现,但在已经弹出popup时再弹自定义的toast是会被popup遮挡的,尽管我设置的type比popup的大,也会被遮挡,使用你这个库也是一样的,大佬还有其他什么方法吗?

点击悬浮窗会跳动

实际使用过程中发现悬浮窗在屏幕左边贴边的时候点击会左右跳动一下,在右边就不会,demo中是一样的,并且demo中的全局悬浮窗点击跳转拨号相当难成功,应该是有事件冲突了

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.