Android对onTouch触摸事件的处理

在Android对onTouch主要调用三个方法对触摸传递:
1、public boolean dispatchTouchEvent(MotionEvent ev)      //在触摸时,Android首先调用的是这个方法,其分配何时调用onInterceptTounch和onTouchEvent,单纯的返回true和false是不行的,不会调用者2个方法。当必须重写这方法,又要调用其他2个触摸方法是,必须return super.dispatchTouchEvent(ev)。


2、public boolean onInterceptTouchEvent(MotionEvent ev)    // 这个方法主要用于父类对触摸事件的拦截处理,看是否需要传递给子类,返回false表示事件没处理完,子类就可以接收到触摸事件了,所以这个类只有那种有可以有子控件的ViewGrop才有的,像LinearLayout就有,Button和TextView没有这个方法。


3、public boolean onTouchEvent(MotionEvent ev)     //处理事件


我写了个demo对触摸事件的研究,xml布局如下:
          android:id="@+id/mylinear"
        android:layout_width="fill_parent"
        android:orientation="vertical"
        android:layout_height="wrap_content">
                    android:layout_width="fill_parent"
            android:layout_height="50dp"
            android:layout_gravity="center_horizontal"
            android:background="@color/green"
            android:gravity="center"
            android:text="看看自定义控件,个方法运行顺序"/>
   



然后对于父控件MyLinear中重写了上面三个方法,对于不同的返回值也有备注,代码如下:


           @Override
public boolean onTouchEvent(MotionEvent event) {
System.out.println("-----------onTouchEvent----event事件没被子view拦截,就会在调用父控件的这个-----");
return super.onTouchEvent(event);
}


     @Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {
    System.out.println("-----------onInterceptTouchEvent---这个先------");
//     return super.onInterceptTouchEvent(ev);
//     return false; //返回false,事件会传递给子View 的onTouchEvent;
     
    return true;//返回true,事件不会传递给子View 的 onTouchEvent;这里执行完全了,
                //直接调用ViewGroup(即本控件)的onTouchEvent
    }


     @Override
    public boolean dispatchTouchEvent(MotionEvent ev) {
    // TODO Auto-generated method stub
    System.out.println("-----------dispatchTouchEvent---最开始调用,比onintercpetTounch先------");
    return super.dispatchTouchEvent(ev);
//     return true; //不会调用 onTouchEvent 和 onInterceptTouchEvent
//     return false; //也不会调用 onTouchEvent 和 onInterceptTouchEvent
    //所以自定义控件没必要重新这个类 .super.dispatchTouchEvent(ev)有机制什么时候调用哪个类 ,这个类本来就是用于 //用于事件的分发
    }


在子控件MyButton中重写了onTounchEvent方法:


         @Override
public boolean onTouchEvent(MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
System.out.println("---父viewoninterceptTounch返回false时-子view接到按下事件------------");
// return false; //返回false,父类的ontouch能接收到触摸事件,本view的move没有接收到触摸事件
return true;//父类的onTounch不能接受到触摸事件。本view的move可以接收到触摸事件
case MotionEvent.ACTION_MOVE:
      System.out.println("---子view的move,查看子view down返回有无事件返回---------");
default:
break;
}
return super.onTouchEvent(event);
}


其实关于android的onTouch触摸事件,在上面代码中的注释都写明白了。下面我们可以用文字总结下。
当我们触摸按下的时候。
1、首先执行父控件的dispatchTouchEvent------->父控件的onInterceptTouchEvent,if父控件返回true,触摸事件不会传递给子view,直接调用父控件的onTouchEvent。


2、首先执行父控件的dispatchTouchEvent------->父控件的onInterceptTouchEvent,if父控件返回false------>传递给子view的onTouchEvent,if子view返回false.
------->事件传递给父控件的onTouchEvent,子控件的onTouchEvent触摸事件消失,后续的move和up不会再执行了


3、首先执行父控件的dispatchTouchEvent------->父控件的onInterceptTouchEvent,if父控件返回false------>传递给子view的onTouchEvent,if子view返回true.
------->事件不会传递给父控件的onTouchEvent,子控件的onTouchEvent触摸事件还保留了,当move或者up的时候,触摸流程事件如第二条前面的部分,先执行父控件的
dispatchTouchEvent和onInterceptTouchEvent,然后根据情况再执行子控件的move或者up事件。









你可能感兴趣的:(Android对onTouch触摸事件的处理)