View的事件体系
View的定义:
可以把View理解成组合模式里的叶子结点和有枝节点的关系,本质ViewGroup和View都是View,遍历的时候不用关注是怎样的结点.
View的位置参数:
- View的宽高和坐标关系:width = right - left,height = top - bottom。
- View在平移过程中,top和left表示的是原始左上角的位置信息,其值不会改变,发生改变的是x、y、translationX、translationY这四个参数,x是View左上角的坐标,translation是view移动后相对于父容器(左上角)的偏移量, x = left + translationX。y的原理相同.
MotionEvent典型事件:ACTION_DOWN, ACTION_MOVE, ACTION_UP。
TouchSlop:系统所能识别的被认为是滑动的最小距离,用这个常量来判断用户的滑动是否达到阈值,提升用户体验。获取方法:ViewConfiguration.get(getContext()).getScaledTouchSlop()。
VelocityTracker加速度追踪:一般建议类似ViewPager这样的空间,将时间间隔设置为1000(也就是1秒)时,加速度阈值设为1000-2000左右体验较好.
View的滑动:
当某个ViewGroup在内部的layout的时候设置margin为负值的View时,0点会在可见top上方的高度(或宽度)为margin的地方. 参考headerView的设置。竖向滑动时,上滑ScrollY不断增加(所以应该传正值),下滑时ScrollY不断减少(所以应该传负值);同理,横向滑动时,左滑ScrollX不断增加,右滑不断减少。注意View动画的View移动只是位置移动,其本身还是在原来位置,会导致一些bug。
View拦截事件
如果当前View拦截事件,就交给自己的onTouchEvent去处理,否则就丢给子View继续走相同的流程。
- onTouchListener优先级高于onTouchEvent。
- 事件传递顺序:Activity -> Window -> View,如果View都不处理,最终将由Activity的onTouchEvent处理。
- 一些结论:拦截的一定是事件序列;不消耗ACTION_DOWN,则事件序列都会由其父元素处理;只消耗ACTION_DOWN事件,该事件会消失,消失的事件最终会交给Activity来处理;requestDisallowInterceptTouchEvent方法可以在子元素中干预父元素的事件分发过程,除了ACTION_DOWN;
网友评论