我有一个观点大致定义为
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
时永远不会被调用,无论 onInterceptTouchEvent
和 onTouchEvent
是在 MyView1
上定义的。
来自 Android 文档的 Managing Touch Events in a ViewGroup据我了解,当在 ViewGroup
中检测到触摸事件时调用 onInterceptTouchEvent()
并且它可以返回 true
以指示它将拦截/消耗事件而不传播给它的 child 。在我的示例中,MyView1.onInterceptTouchEvent
使用其父类(super class)逻辑返回 false,这意味着它可供自身或子级使用。但是,由于未调用 MyView1.onTouchEvent
,我认为该事件由 subview 消耗。
说了这么多,也许这个问题对其他人来说是显而易见的,但它让我认为该事件被 subview 或它的一个听众消耗了,所以我一直在寻找一种方法来确定最终的MotionEvent
的使用者。 MyView1
和 MyView2
各有 8-10 个 subview (布局/小部件/等)并且在结构上有很大不同。
那么我如何确定哪个View
消耗了一些输入事件(MotionEvent
)?
最佳答案
您可以按照以下步骤进行操作。在 ViewGroup.dispatchTouchEvent
方法中设置断点。如果您使用的是 SDK 25,那么您可以使用第 2266 行。child
View
是消费触摸事件的对象。
您还可以在那里配置断点,以便 IDE 将日志记录到控制台。
关于android - 确定触摸输入消费者,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44138192/