android - 确定触摸输入消费者

标签 android event-handling touch

我有一个观点大致定义为

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/

相关文章:

java - 修改android首次安装时间

Android Studio 0.2.5 不将 Galaxy S4 视为设备

linux - Linux 下不支持 setGraphicsEventEnv() 吗?

c# - 防止用户控件中的 slider 在 WPF 中缩放

Xcode 7.2、iOS 8.X、SpriteKit、Sprite 无法识别任何触摸

java - LinkedList 与 ArrayList 在一个特定的 android 示例上

javascript - JS 对象字面量,this 上下文发生变化

javascript - 为什么 onclick 处理程序在 javascript 中与 innerHTML 一起使用时不起作用

随时随地快速检测触摸

Android Studio 3 Kotlin 版本