gpt4 book ai didi

android - 确定触摸输入消费者

转载 作者:行者123 更新时间:2023-11-29 02:40:58 25 4
gpt4 key购买 nike

我有一个观点大致定义为

class MyView1 extends LinearLayout {
// for debugging, not actually needed
@Override public boolean onTouchEvent(MotionEvent event) {
Log.d(getClass().getSimpleName(), "");
}

// also for debugging, not actually needed
@Override public boolean onInterceptTouchEvent(MotionEvent ev){
boolean handle = super.onInterceptTouchEvent(ev);
Log.v(getClass().getSimpleName(), "handle?=" + handle);
return handle;
}
}
}

和一个 TouchListener/Behavior 作为

class TouchBehavior implements View.OnTouchListener {
View myView; // assigned in ctor
public void attach() { myView.setOnTouchListener( this ); }
@Override public boolean onTouch(View v, MotionEvent event) {
Log.d(getClass().getSimpleName(), "log just for detection");
// actual logic...
}

附加到 MyView1(通过日志记录验证)。此逻辑适用于另一个 View MyView2(它还扩展了 LinearLayout)但不适用于 MyView1,原因我尚未确定。在 MyView1 中,触摸事件(点击布局中的任意位置)在 onInterceptTouchEvent 中检测到,但在 onTouchEvent 中检测不到。 TouchBehavior.onTouchEvent()TouchBehavior 附加到 MyView1 时永远不会被调用,无论 onInterceptTouchEventonTouchEvent 是在 MyView1 上定义的。

来自 Android 文档的 Managing Touch Events in a ViewGroup据我了解,当在 ViewGroup 中检测到触摸事件时调用 onInterceptTouchEvent() 并且它可以返回 true 以指示它将拦截/消耗事件而不传播给它的 child 。在我的示例中,MyView1.onInterceptTouchEvent 使用其父类(super class)逻辑返回 false,这意味着它可供自身或子级使用。但是,由于未调用 MyView1.onTouchEvent,我认为该事件由 subview 消耗。

说了这么多,也许这个问题对其他人来说是显而易见的,但它让我认为该事件被 subview 或它的一个听众消耗了,所以我一直在寻找一种方法来确定最终的MotionEvent 的使用者。 MyView1MyView2 各有 8-10 个 subview (布局/小部件/等)并且在结构上有很大不同。

那么我如何确定哪个View消耗了一些输入事件(MotionEvent)?

最佳答案

您可以按照以下步骤进行操作。在 ViewGroup.dispatchTouchEvent 方法中设置断点。如果您使用的是 SDK 25,那么您可以使用第 2266 行。child View 是消费触摸事件的对象。

您还可以在那里配置断点,以便 IDE 将日志记录到控制台。

关于android - 确定触摸输入消费者,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44138192/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com