Android Touch事件传递
2016-07-19 15:45
302 查看
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); }
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件
- SourceProvider.getJniDirectories