Contents
  1. 1. OnTouchEvent的基本认识
  2. 2. 总结

OnTouchEvent的基本认识

  • 跟Touch相关的三个方法:
public boolean dispatchTouchEvent(MotionEvent ev);    //用来分派event
public boolean onInterceptTouchEvent(MotionEvent ev); //用来拦截event
public boolean onTouchEvent(MotionEvent ev);          //用来处理event 
  • onTouch方法优先于onClick方法

  • 只要触摸到了任何一个控件,就一定会调用该控件的dispatchTouchEvent方法

  • 用法:

    dispatchTouchEvent() 用来分派事件。
    其中调用了onInterceptTouchEvent()onTouchEvent(),一般不重写该方法
    

    .

    onInterceptTouchEvent()    用来拦截事件。
    ViewGroup类中的源码实现就是{return false;}表示不拦截该事件,
    事件将向下传递(传递给其子View);
    若手动重写该方法,使其返回true则表示拦截,事件将终止向下传递,
    事件由当前ViewGroup类来处理,就是调用该类的onTouchEvent()方法
    

    .

    onTouchEvent()    用来处理事件。
    返回true则表示该View能处理该事件,事件将终止向上传递(传递给其父View);
    返回false表示不能处理,则把事件传递给其父View的onTouchEvent()方法来处理
    

简单使用:

例如一个Activity里有一个LinearLayout、一个TextView
在Activity里重写OnTouchEvent 方法,TextView绑定onTouchLister
这样如果TextView重写的onTouch方法里返回了true,Activity里的OnTouchEvent
方法就不再执行。

tvTest.setOnTouchListener(new View.OnTouchListener() {
          @Override
          public boolean onTouch(View view, MotionEvent motionEvent) {
              Functions.toast(SettingActivity.this, "BTN-------Event");
              Logger.log("Erin","btn------event"+motionEvent.getAction());
              return true;
          }
      });

此处可能会调用多次ontouch方法,因为Action可能是按下、松开、移动三种情况。

总结

  • android 的分发事件先传递给ViewGroup,再由ViewGroup传给View。
  • 只要ViewGroup拦截了事件(onInterceptTouchEvent返回true) 事件就不会在往子View传递。
Contents
  1. 1. OnTouchEvent的基本认识
  2. 2. 总结