我是一名热爱 Android 技术的程序员,平时爱造轮子,人送外号轮子哥 。
我的理想是让这个世界没有难开发的安卓项目,消灭一切难维护的代码。
Android 悬浮窗框架,好用不解释
License: Apache License 2.0
如题,想设置全屏显示的悬浮窗
布局中设置match_parent无效,
XToast.setHeight+XToast.setWidth,也无效
请问有啥方法可以设置悬浮窗全屏显示吗?
请问如何在某些页面不显示(隐藏)悬浮窗呢?我以为是通过setWindowAlpha
,但这样即使alpha为0 在页面不显示,但是还是会点击到
否
是
否
是
看到 Toaster 已经迁移 Jitpack,EasyWindow 什么时候迁移?
就是想说一句
issue 是否有人曾提过类似的问题?
无
你觉得框架有什么不足之处?
能否支持view部分边界移动到屏幕外。
你觉得该怎么去完善会比较好?
支持FLAG_LAYOUT_NO_LIMITS
flag,目前我是通过设置这个flag,再在onTouch中处理边界问题。
WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS
issue 是否有人曾提过类似的问题? 没有
你觉得框架有什么不足之处? 没有
好哥哥,点击穿透悬浮窗,执行悬浮窗下面的按钮或者其他,
能实现吗,可以帮帮我吗.
api 'com.github.getActivity:EasyWindow:10.3'
内存泄漏,必现
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()
是
30
华为 AGS5Z-W09
12
自己遇到的
所有
是
否
否
否
是
是
看截图,内存泄漏并不会造成崩溃
No response
现在的框架在Activity中显示没有问题。
我有一个面积很大的Dialog,宽度=屏幕宽,高度=屏幕高的一半,显示在屏幕正中。
现在悬浮窗只能显示在Dialog下面的Activity上,我想在Dialog上也能显示悬浮窗。并且在关闭这个dialog后,在其他Activity上也保留悬浮窗,请问有没有什么解决办法?
否
是
否
是
startActivity(new Intent(this,TestActivity.class));
// 将 Toaster 中的 View 转移给 EasyWindow 来显示
new EasyWindow<>(this)
.setDuration(1000)
.setContentView(Toaster.getStyle().createView(this))
.setText(android.R.id.message, "跳转下一个页面")
.setGravity(Gravity.BOTTOM)
.setYOffset(100)
.show();
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,所以找不到这个类,报错
直接运行示例代码
是
30
华为mate60pro
Android12
自己遇到的
必须
是
否
否
否
否
未选择
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,所以找不到这个类,报错
10.3
在设置多个全局窗口时,设置的窗口会跟随activity启动上下浮动。如果自己定义全局弹出不会出现该问题。可以确定时框架的问题,初步判断时安卓自带的虚拟按键隐藏和显示影响上下浮动。demo的为隐藏和显示虚拟按键不存在改问题
使用以下代码,然后在welCome Activity界面初始化就必现,如果自己定义的全局不会出现这个问题
代码如下
是
30
这里没
8.1
自己遇到的
自己android定制系统8.1
是
否
是
否
是
是
未报错,初步判断问题是系统自带虚拟按键隐藏和显示时候就会出现上下浮动。
No response
No response
在悬浮窗上面放输入框可以直接编辑文本吗
就是我用的是悬浮窗,当我收到在系统桌面或者是其他应用内的时候,点击悬浮窗的按钮,无法启动应用的activity,但是在应用内是可以启动的
目前测试华为、1 + 手机应用内外都可以启动activity
请问是什么原因
框架版本【必填】:v8.5
问题描述【必填】:悬浮窗在横屏状态下显示之后然后将屏幕切为横屏模式,悬浮窗位置显示异常。
复现步骤【必填】:竖屏状态下显示悬浮穿,然后将应用切换为横屏显示,悬浮窗位置发生变化。
是否必现【必填】:是
出现问题的手机信息【必填】:所有机型
出现问题的安卓版本【必填】:所有版本
是部分机型还是所有机型都会出现【必答】:全部
框架最新的版本是否存在这个问题【必答】:是
是否已经查阅框架文档还未能解决的【必答】:是
issue 是否有人曾提过类似的问题【必答】:否
是否可以通过 Demo 来复现该问题【必答】:是
使用原生的 WindowManager 是否也会出现该问题【非必答】:是
提供报错堆栈(如果有报错的话必填,注意不要拿被混淆过的代码堆栈上来)
提供截图或视频(根据需要提供,此项不强制)
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}")
}
})
}
}
否
是
否
是
调用写法比较丑,EasyWindow<EasyWindow<*>>,建议优化一下,比如写成EasyWindow.with(actitvty)。
否
否
否
EasyWindow.with(context).***
我设置点击事件后就不能拖拽了,这个怎么处理
框架版本【必填】: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 是否也会出现该问题【非必答】:
提供报错堆栈 --
提供截图或视频
你觉得框架有什么不足之处?(必答项,你可以描述框架有什么令你不满意的地方)
EasyWindow 和 Toaster 这两个命名,Toaster 好理解 ,就是 Toast 专用的,但是 EasyWindow 他可以用于悬浮窗,也可以实现PopupWindow,也可以实现 Toast ,这不知道该如何选择。总感觉 Toaster 是基于 EasyWindow 实现的。
你觉得该怎么去完善会比较好?(非必答项,你可以提供一下自己的想法或者做法供作者参考)
我只是一个想法,可不可以将他两整合在一起呢?这样就不用再纠结,该使用哪个,不该使用哪个。既然 EasyWindow 都能实现了,之前引的 Toaster,是不是有点多余呢?但是把 Toaster 全部替换成 EasyWindow 还有点工作量。
可以适配状态栏吗?
10.3
竖屏下生成全局可拖拽悬浮窗,移动后,再切换横屏后不贴边,再次切换竖屏也不会贴边
使用提供的demo,竖屏下生成全局可拖拽悬浮窗,移动后,再切换横屏后不贴边,再次切换竖屏也不会贴边
是
33
readme k40
13
自己遇到的
全部
是
否
未选择
是
是
是
No response
https://img.qiaoxuesi.com/files/977_Screenrecorder-2023-11-15-22-12-53-339_0_COMPRESSED.mp4
No response
Timer.schedule(ToastDismissTask)这个,因为ToastDismissTask是在异步线程里执行的,虽然WindowManager里调用removeView不会出问题,但是cancel涉及到线程同步吧,isShow就会出现状态不准的情况。
我再全局弹框的布局中加入了一个edittext,输入法不能弹起
issue 是否有人曾提过类似的问题?(必答项,一旦出现重复提问我将不会再次解答)
你觉得框架有什么不足之处?(必答项,你可以描述框架有什么令你不满意的地方)
点击按钮 会展开菜单 但是目前想点击菜单外面 先收缩菜单 请问怎么实现
你觉得该怎么去完善会比较好?(非必答项,你可以提供一下自己的想法或者做法供作者参考)
拖动模式使用的SpringDraggable();但是很奇怪不设置xToast的setOnClickListener就无法拖动悬浮窗,demo中也是一样,目前需求是做个类似于微信视频通话的悬浮窗
aa
我使用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日志
否
否
是
No response
xtoast用的2.6版,xtoast内部会持有activity造成内存泄露
10.2
Demo在多点击几次之后LeakCanary弹出提示
Demo点击任意弹窗十余次之后便可复现
是
33
Pixel 6a
13
自己遇到的
全部
是
否
是
否
是
是
====================================
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中的全局悬浮窗点击跳转拨号相当难成功,应该是有事件冲突了
10.3
使用全局可拖拽的悬浮窗,横竖屏切换时候,悬浮窗不会自动贴边
demo--全局可拖拽的悬浮窗
1.竖屏情况下,拖拽悬浮窗到任意位置(中间等等)。
2.切换到横屏,会发现悬浮窗停留在刚刚切换的任意位置(中间等等),而不是自动贴边。
是
33
红米K40 S
13
自己遇到的
全部
是
否
是
否
是
是
No response
No response
No response
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。
有没有设置activity过滤的功能啊,大佬,就是在设定的那几个activity不显示悬浮窗
前段时间接到个需求,需要自定义toast弹出动画。我们都知道原生的toast是不支持的,就算反射修改也不行,具体为什么我没找到源码,但我揣测只要type为toast的window,系统在加载动画时根本不管你设置的什么,只会取系统的动画。所以想到你这种用WindowManager来实现,但在已经弹出popup时再弹自定义的toast是会被popup遮挡的,尽管我设置的type比popup的大,也会被遮挡,使用你这个库也是一样的,大佬还有其他什么方法吗?
填充自定义布局,里面有个进度条pb,怎么动态去获取子view更新进度
Github沟通效率实在是很低下,大家伙有问题或者Bug直接到Q群78797078私信给我反馈就OK,我会尽快答复你的问题
三星s8 设置自定义View 点击事件框会抖动 不响应具体View的事件 DEMO必现
不是悬浮弹窗,点击弹窗周围,无法关闭弹窗
否
否
否
是
框架版本【必填】:8.6
问题描述【必填】:全局可拖拽的悬浮窗,在应用至后台运行时,拖动悬浮窗之后回弹卡顿。
复现步骤【必填】:打开全局可拖拽悬浮窗,将应用放置后台运行,在桌面拖动悬浮窗,可看到悬浮窗回弹时卡顿。
是否必现【必填】:是
出现问题的手机信息【必填】:华为p40pro
出现问题的安卓版本【必填】:鸿蒙3.0 (android 12)
问题信息的来源渠道【必填】:本框架的demo以及自己的项目中使用时发现
是部分机型还是所有机型都会出现【必答】:部分/全部(例如:某为,某 Android 版本会出现)
框架最新的版本是否存在这个问题【必答】:是,旧版本无此问题
是否已经查阅框架文档还未能解决的【必答】:是
issue 是否有人曾提过类似的问题【必答】:否
是否可以通过 Demo 来复现该问题【必答】:是
使用原生的 WindowManager 是否也会出现该问题【非必答】:是/否(排查一下是不是框架的代码存在问题导致的)
提供报错堆栈(如果有报错的话必填,注意不要拿被混淆过的代码堆栈上来)
提供截图或视频(根据需要提供,此项不强制)
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.