View的事件体系
-
View的基础知识
-
View的继承关系
-
ViewGroup:View:Object
-
-
View的位置参数
-
left、top、right、bottom【属于View的初始值,不会改变】
-
x、y、translationX、translationY【在View进行平移变化的时候会跟着改变】
-
-
MotionEvent:触摸屏幕后所产生的事件对象,有以下几个典型的事件
-
ACTION_DOWN
-
ACTION_MOVE
-
ACTION_UP
-
从手指按下触发ACTION_DOWN事件,到手指抬起触发ACTION_UP,是一个完整的触摸过程,这个过程产生的一系列事件都是通过MotionEvent来传递的
-
通过getX、getY可以得到在当前View中的坐标
-
通过getRawX、getRawY可以得到在手机屏幕中的坐标
-
-
TouchSlop:滑动的最小距离,和设备有关,是一个常量,单位是dp
-
View的滑动方式:
-
通过View本身提供的scrollTo/scrollBy滑动,这种滑动是瞬时完成的,没有过渡,并且这个方法只能让View的内容进行滑动,View本身是不会滑动的
-
设置平移动画
-
View动画
-
属性动画
-
-
改变View的LayoutParam使View重新布局
View的弹性滑动实现方式:
-
使用Scroller
-
Scroller本身只保存了一些滑动相关的参数
-
主要思想是将一次滑动分为很多次的小滑动,从而实现弹性的滑动
-
每次滑动一点距离就进行重绘直到滑动结束
-
-
使用动画
-
通过handler发送延时消息,然后在处理消息的时候进行绘制
-
-
-
View的事件分发机制
-
分发过程由这些方法共同完成
-
dispatchTouchEvent、onInterceptTouchEvent、onTouchEvent
-
-
dispatchTouchEvent:用于传递触摸事件
-
onInterceptTouchEvent:用于判断某个事件是否被拦截
-
onTouchEvent:用于处理一个事件
-
-
事件分发流程:
-
点击事件发生时,首先会传递给Activity,由Activity委派Window来完成,Window会将事件分发给DecorView,从DecorView开始真正的事件派发,如果最后返回了true说明事件被View消费,否则会调用Activity的onTouchEvent来处理事件
-
ViewGroup会先判断事件是否需要拦截,如果拦截,则事件由ViewGroup处理,否则ViewGroup会遍历所有子view,将事件传递给能够接收事件的子View上,这时子view的dispatchTouchEvent会被调用
-
如果子View是ViewGroup,则会重复上述过程,否则会直接调用view的onTouchEvent的方法,处理事件,这里onTouch方法会屏蔽onTouchEvent,而onClick方法则在最后调用。
-
-
有两种情况需要判断是否需要拦截,方法默认返回false,也就是不拦截
-
如果当前分发的事件是按下事件,则ViewGroup会判断是否拦截
-
或者当前分发的事件已经有子view处理成功,说明之前viewgroup并没有拦截事件,因此这里还会判断是否需要拦截
-
而假如上面的条件都不满足,说明viewgroup已经将事件拦截,那么接下来的其他事件都会直接交给viewgroup处理。
-
也就是说,如果没有拦截过事件,那么每次事件分发的时候都会判断是否要拦截,如果已经拦截了事件,那接下来的事件都会被viewgroup处理,并且不会再判断是否要拦截
-