Android触摸事件传递机制触摸事件传递机制
主要介绍了Android触摸事件传递机制,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小
编过来看看吧
前言:在Android开发中,经常会遇到触摸事件冲突,比如ViewPager的轮播图跟Fragment的划动事件冲突,或者轮播图跟下
拉事件冲突,自定义view的事件处理等,本文章将会详细介绍Activity、View、ViewGroup三者的触摸事件传递机制,传递包
括三个阶段:分发、拦截、消费。
本文章将会详细介绍Activity、View、ViewGroup三者的触摸事件传递机制,传递包括三个阶段:分发、拦截、消费。
一一.触摸事件的类型触摸事件的类型
触摸事件对应的是 MotionEvent 类,事件类型主要有三种:
1. ACTION_DOWN:用户按下操作,表示一次触摸事件的开始。
2. ACTION_MOVE:在按下的情况下,进行移动。轻微的移动都会传递到该事件。
3. ACTION_UP:用户手指离开屏幕,表示一次触摸事件的
注 :如果用户仅仅的是点击而已,则只会执行到 ACTION_DOWN 和 ACTION_UP 两个事件,不会执行到 ACTION_MOVE
事件。所以 ACTION_DOWN 和 ACTION_UP 是事件是必须的。
二二.触摸事件的传递阶段触摸事件的传递阶段
1.分发(分发(Dispatch))
在Android系统中所有的触摸事件都是由 dispatchTouchEvent 方法进行分发的。该方法中判断事件是被消费( return true
),还是继续分发给子视图处理( return super.dispatchTouchEvent ),如果当前视图是ViewGroup或者其子类,则会调用
onInterceptTouchEvent 判断是否截拦。
@Override
public boolean dispatchTouchEvent(MotionEvent event) {
return super.dispatchTouchEvent(event);
}
2.截拦(截拦(Intercept))
事件的截拦 InterceptTouchEvent 只存在于ViewGroup及其子类,activity和View是不存在该方法。该方法判断事件是被截拦
( return true )并交给自身的 OnToucEvent 方法进行消费,还是继续传递给子视图( return super.InterceptTouchEvent 或
者 return false )。
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
return super.onInterceptTouchEvent(ev);
}
3.消费(消费(Consume))
事件的消费通过 OnTouchEvent 方法判断,是被消费( return true ),还是不处理( return false )并将事件传递给父视图的
OnTouchEvent 方法进行处理。
@Override
public boolean onTouchEvent(MotionEvent event) {
return super.onTouchEvent(event);
}
所有拥有事件传递能力的类:
Activity: 拥有dispatchTouchEvent 、OnTouchEvent
ViewGroup: 拥有dispatchTouchEvent 、OnInterceptTouchEvent 、OnTouchEvent
View:拥有dispatchTouchEvent 、OnTouchEvent
三、三、View的事件传递机制的事件传递机制
3.1 dome
虽然说ViewGroup是View的子类,但是这是说的View指的是除ViewGroup之外的View控件子类,首先定义一个MyTextView继
承TextView,打印每次事件的触发以变了解事件传递的流程。
MyTextView 类