本章主要介绍:
view基础,MotionEvent,TouchSlop,VelocityTracker,GestureDetetor,Scroller,view滑动,弹性滑动,事件分发机制
1.view的基础概念
view:android中所有控件的基类。
viewGroup:控件组。
2.view的位置几种表示法:
①.view.getLeft(),view.getRight(),view.getTop(),view.getBottom() 相对父布局的位置参数
②.view.getX(),view.getY() 相对屏幕左上角坐标
③.view.getTranslationX(),view.getTranslationY() 相对父布局左上角的坐标
④.event.getX(),event.getY() 相对父布局左上角的坐标(view中motionEvent参数的位置)
⑤.event.getRawX,event.getRawY() 相对屏幕左上角的坐标(view中motionEvent参数的位置)
3.MotionEvent和TouchSlop
MotionEvent常用的事件类型:
ACTION_DOWN:手指刚触摸屏幕
ACTION_MOVE:手指在屏幕上移动
ACTION_UP:手指离开屏幕的一瞬间
ACTION_CANCEL:被取消的事件(比如:action_down分发给了子控件,action_move和action_up没有分发给子控件,此时子控件的ACTION_CANCEL会被调用)
TouchSlop:最小滑动距离(为了提升用户体验如果滑动距离小于这个值可以默认没滑动)
4.VelocityTracker、GestureDetector、OnDoubleTapListener和Scroller
VelocityTracker:速度追踪。
GestureDetector:监听单击双击滑动长按等动作。
OnDoubleTapListener:监听双击动作。
Scroller:弹性滑动对象,用于实现弹性滑动的。
5.view的滑动
①.ScrollTo、ScrollBy:
(1)都是对view的内容进行滑动;
(2)ScrollBy本质调用了ScrollTo;
(3)注意滑动时向左(向上)为正值,向右(向下)为负值
②.动画:
(1)view动画(并没有真正改变位置)
(2)属性动画(真正改变位置)
③.布局位置(layout,offsetLeftAndRight,offsetTopAndBottom)
④.布局参数(LayoutParams)
6.view的弹性滑动
①Scroller+computeScroll+scrollTo
②动画
③延时策略(Handler,view.postDelayed)
7.事件分发机制(重点):事件分发过程dispatchTouchEvent,onIntercepteTouchEvent,onTouchEvent;
①一个事件序列一旦被某个view拦截,那么后续的事件都交给他处理。
②如果view的某个事件不消耗ACTION_DOWN,那么同一个事件的其他事件都不会交给他处理,会交给他的父布局处理。
③如果view的某个事件不消耗除ACTION_DOWN之外的事件,那么这个事件会消失,最后消失的点击事件会交给Activity处理。
④viewGroup默认不拦截事件。
⑤view没有OnInterceptTouchEvent方法,一旦点击事件传给他,就会调用他的OnTouchEvent方法。
⑥view的Ontouchevent默认消耗事件。
⑦onclick发生的前提是当前事件是可点击的。
⑧子view可以通过requestDisallowInterceptTouchEvent方法干预父元素的事件分发过程,但ACTION_DOWN除外。
⑨源码分析可得事件优先级OnTouch---->OnTouchEvent---->OnClick。
8.事件滑动冲突
①外部拦截法(通过父布局的OnIntercepteTouchEvent方法)
②内部拦截法(通过子view的OnTouchEvent方法和requestDisallowInterceptTouchEvent及父布局的OnIntercepteTouchEvent)