确定触摸输入消费者

时间:2017-05-23 14:50:47

标签: 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 as

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(通过日志记录验证)。由于我尚未确定的原因,此逻辑适用于另一个视图MyView2(也扩展LinearLayout)但不适用于MyView1。在MyView1 onInterceptTouchEvent中检测到onTouchEvent触摸事件(点击布局内的任何位置),但未在TouchBehavior.onTouchEvent()中检测到。 TouchBehavior附加到MyView1后永远不会调用onInterceptTouchEvent,无论onTouchEventMyView1中是否定义了onInterceptTouchEvent()ViewGroup

来自Android文档' Managing Touch Events in a ViewGroup我的理解是trueMyView1.onInterceptTouchEvent中检测到触摸事件时调用MyView1.onTouchEvent并且它可以返回MotionEvent以表示它将拦截/消耗该事件,不要传播给它的孩子。在我的示例中,MyView1使用其超类逻辑返回false,这意味着它可供自己或子级使用。但是,由于未调用MyView2,我认为该事件由子子视图使用。

说完所有这些之后,也许这个问题对其他人来说是显而易见的,但它让我认为该事件是由子子视图或其中一个听众所消耗的,所以他们已经找到了确定最终结果的方法。那个View的消费者。 MotionEvent[ngClass]每个都有8-10个子视图(布局/小部件/等),并且在结构上非常不同。

那么如何确定哪个[ngClass]="counter>=20?'green':counter>=10?'orange':'red'" 消耗了一些输入事件(getColor(counter){ return counter>=20?'green':counter>=10?'orange':'red'; } )?

2 个答案:

答案 0 :(得分:0)

public class Myview extends LinearLayout {
    public Myview(Context context) {
        super(context);
    }

    public Myview(Context context, AttributeSet attrs) {
        super(context, attrs);

    }

    public Myview(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);

    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        Toast.makeText(getContext(), "onTouchEvent", Toast.LENGTH_SHORT).show();
        return super.onTouchEvent(event);
    }
    @Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {
        Toast.makeText(getContext(), "onInterceptTouchEvent", Toast.LENGTH_SHORT).show();
        boolean handle = super.onInterceptTouchEvent(ev);
        return handle;
    }


}

在上面的TouchBehavior类OnTouch方法中,您应该返回false 如果您返回true,则只会触发onInterceptTouchEvent方法。如果您返回false,则onInterceptTouchEventonTouchEvent将触发

答案 1 :(得分:0)

你可以这样做。在ViewGroup.dispatchTouchEvent方法设置一个突破点。如果您使用的是SDK 25,则可以使用第2266行。child View有一个人使用触摸事件。

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