Android Touch事件传递

来源:互联网 发布:帝国cms城市切换 编辑:程序博客网 时间:2024/04/29 14:32

android系统中每个ViewGroup的子类都具有下面3个和TouchEvent处理相关的方法:

1. dispatchTouchEvent(MotionEvent ev) 在Activity中可以看到

public boolean dispatchTouchEvent(MotionEvent ev) {
if (ev.getAction() == MotionEvent.ACTION_DOWN) {
onUserInteraction();
}
if (getWindow().superDispatchTouchEvent(ev)) {
return true;
}
return onTouchEvent(ev);
}

这个方法是从父类Window的 dispatchTouchEvent(MotionEvent ev)传递过来的,根据返回值,确定事件的分发

2.在ViewGroup中独有的方法 onInterceptTouchEvent(MotionEvent ev) :

public boolean onInterceptTouchEvent(MotionEvent ev)
这个方法的返回值决定了是否拦截触摸事件,当返回true便交给自己的
onTouchEvent(MotionEvent ev)去处理,false就继续向下,传递给子孩子

3.public boolean onTouchEvent(MotionEvent ev):

一般我们用于重写此方法处理响应的点击事件,返回值决定是否消耗此事件,true表示消耗此事件
false表示继续传递
事件传递过程:
事件传递过程:

通过重写onInterceptTouchEvent以及onTouchEvent达到不处理点击事件,进行事件的传递,以下是
自定义ViewPager示例代码:

package com.cf.zhbj.view;import android.content.Context;import android.support.v4.view.ViewPager;import android.util.AttributeSet;import android.view.MotionEvent;/** * Created by chenfan on 2016/7/17. * 禁止滑动的ViewPager */public class NoScrollViewPager extends ViewPager {    public NoScrollViewPager(Context context) {        super(context);    }    public NoScrollViewPager(Context context, AttributeSet attrs) {        super(context, attrs);    }    @Override    public boolean onTouchEvent(MotionEvent ev) {        //重写父类onTouchEvent,拦截触摸操作        return true;    }    //事件中断,拦截    @Override    public boolean onInterceptTouchEvent(MotionEvent ev) {        //true将此事件拦截,false不拦截        //标签页的ViewPager不拦截内部子控件ViewPager        return false;    }}

当子控件不希望父控件以及父控件的上层拦截时候可以使用如下示例代码:

//事件处理:dispatchTouchEvent->onInterceptceptTouchEvent->onTouchEvent    //事件分发    @Override    public boolean dispatchTouchEvent(MotionEvent ev) {        //请求父控件和祖宗控件(父控件的父控件...)不要拦截事件        getParent().requestDisallowInterceptTouchEvent(true);        return super.dispatchTouchEvent(ev);    }
0 0