Touch 事件相关方法 |
方法功能 |
ViewGroup |
View |
Activity |
public boolean dispatchTouchEvent(MotionEvent ev) |
事件分发 | Yes | Yes | Yes |
public boolean onInterceptTouchEvent(MotionEvent ev) |
事件拦截 | Yes | No | No |
public boolean onTouchEvent(MotionEvent ev) |
事件响应 | Yes | Yes |
Yes |
事件分发:public
boolean dispatchTouchEvent(MotionEvent ev)
:由最外层传入内层,由父控件传给子控件。
return true:由当前dispatchTouchEvent消费,并将停止向下传递,事件到此结束;
return false:事件将返回给父空间或activity(向外传递)的onTouch消费;
如果返回系统默认的 super.dispatchTouchEvent(ev),事件会自动的分发给当前 View 的 onInterceptTouchEvent 方法。
事件拦截:public
boolean onInterceptTouchEvent(MotionEvent ev)
:当外层事件拦截方法返回值为默认时,事件会自动分发给当前的拦截方法:
return true:对当前事件进行拦截,交给本view的onTouchEvent处理
return false:不对事件进行拦截 交给子view的分发事件处理‘;
return 系统默认:交给子view的分发事件处理;
事件响应:public
boolean onTouchEvent(MotionEvent ev)
return true: 不再向上传递给上一层view的onTouch事件
return false: 返回给上一层view的onTouc事件
return 系统默认:返回给上一层view的onTouch事件
附部分源码:
public class MyViewPager extends android.support.v4.view.ViewPager {
public MyViewPager(Context context) {
super(context);
}
public MyViewPager(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
return super.dispatchTouchEvent(ev);
}
@Override
public boolean onTouchEvent(MotionEvent arg0) {
return super.onTouchEvent(arg0);
}
@Override
public boolean onInterceptTouchEvent(MotionEvent arg0) {
if (arg0.getY() < 300 && this.getCurrentItem() == 0 ) {
return false;
}
return super.onInterceptTouchEvent(arg0);
}
}