Giter Site home page Giter Site 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

我是一名热爱 Android 技术的程序员,平时爱造轮子,人送外号轮子哥

我的理想是让这个世界没有难开发的安卓项目,消灭一切难维护的代码。

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

设置全屏显示的悬浮窗

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

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

问题描述【必填】

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

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

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

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

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

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

建议收集

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

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

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

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

WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS

请教关于点击穿透

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

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

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

[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

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

问题描述【必填】

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

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

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

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

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

[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,所以找不到这个类,报错

[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

请教一下

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

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

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

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

请问是什么原因

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

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

问题描述

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

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

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

  • 是否必现【必填】:是

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

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

请回答

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

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

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

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

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

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

其他

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

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

1664787220061224.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 列表但还未能解决的【必答】

[建议]:优化调用写法

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

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

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

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

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

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

EasyWindow.with(context).***

在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

  • 提供解决方案 暂无

EasyWindow 和 Toaster 该如何选择?

建议收集

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

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

[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

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

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

android 6.0版本兼容问题

image

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

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

做了个悬浮菜单栏

建议收集

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

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

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

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

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

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

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, 因为出现这个版本才升级的, 但改版本好像没有解决问题, 改写法才解决了

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

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

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

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

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

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

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

No response

内存泄露

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

[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

点击悬浮窗会跳动

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

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

框架版本【必填】

10.3

问题描述【必填】

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

复现步骤【必填】

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

是否必现【必填】

项目 targetSdkVersion【必填】

33

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

红米K40 S

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

13

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

自己遇到的

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

全部

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

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

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

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

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

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

提供报错堆栈

No response

提供截图或视频

No response

提供解决方案

No response

MIX2s手机的问题

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

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

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

  • 框架版本【必填】: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()
}

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

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

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

自定义动画问题

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

自定义布局

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

提 issue 需知

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

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

问题描述【必填】

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

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

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

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

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

全局悬浮窗拖动卡顿

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

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

  • 框架版本【必填】:8.6

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

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

  • 是否必现【必填】:是

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

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

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

请回答

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

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

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

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

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

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

其他

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

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

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

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.