getActivity / EasyWindow

Android 悬浮窗框架,好用不解释
Apache License 2.0
1.46k stars 162 forks source link

[Bug]:拖拽过程中触发了子 View 的长按事件 #71

Open pansong291 opened 2 months ago

pansong291 commented 2 months ago

框架版本【必填】

10.62

问题描述【必填】

子 View 注册了一个长按事件,并且启用了悬浮窗的可拖拽,如果恰好按在注册了长按事件的子 View 上进行拖拽,就会在拖拽的过程中触发长按事件。

复现步骤【必填】

setDraggable(SpringBackDraggable())
setOnLongClickListener(
    R.id.btn,
    EasyWindow.OnLongClickListener { easyWindow, view: Button ->
        Log.i(TAG, "长按事件")
        true
    })

是否必现【必填】

项目 targetSdkVersion【必填】

34

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

Xiaomi 13

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

14

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

自己遇到的

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

不清楚,我只有一个手机,没有模拟器。

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

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

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

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

有个点击的,不过测试点击是没问题的,长按就会出现此问题。

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

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

提供报错堆栈

No response

提供截图或视频

No response

提供解决方案

No response

pansong291 commented 2 months ago

https://github.com/user-attachments/assets/97049139-d89a-402b-a9f2-9ecbfdfe43bd

getActivity commented 2 months ago

你可以在 onLongClick 中通过调用 Draggable 类中的 isTouchMoving 方法来判断当前是否移动状态,如果是则不往下执行。

pansong291 commented 1 month ago

你可以在 onLongClick 中通过调用 Draggable 类中的 isTouchMoving 方法来判断当前是否移动状态,如果是则不往下执行。

这样也会有概率触发长按事件,只要触发长按的瞬间松手就会。有个动画结束的回调,我也试过了,跟视频里一样。

https://github.com/user-attachments/assets/e487b85f-e42b-4724-94c8-0165c640adef

getActivity commented 1 month ago

你说的这种场景很难触发吧?我按照你的要求进行测试,试了十几次才试出来一次,这种需要卡特定节点才能复现,即松手的时间刚好是长按设定的秒数。

getActivity commented 1 month ago

目前针对这个问题,没有发现好的解决方案,如果你有的话,欢迎你提供给我。

pansong291 commented 1 month ago

你说的这种场景很难触发吧?我按照你的要求进行测试,试了十几次才试出来一次,这种需要卡特定节点才能复现,即松手的时间刚好是长按设定的秒数。

主要是我想长按的时候弹个对话框,但是如果随手一拖再松开时恰好弹出对话框,有点影响体验,用户也会迷惑。

还有就是我试了 SpringBack 动画的结束回调,但是也是松开一瞬间就触发长按了,动画结束的回调是松开时就被调用了的吗?

pansong291 commented 1 month ago

目前针对这个问题,没有发现好的解决方案,如果你有的话,欢迎你提供给我。

用户开始拖动时,移除长按事件,拖动结束再设回长按事件。不知道可不可行

试过了,不行 😑😑