1.什么是view
view是所有控件的基类。可以是单个控件也可以是组合控件。
2.view的基础知识
view的三个基本事件(MotionEvent):ACTION_DOWN,action_move,action_up。
getX是获取相对于父控件的值,getRawX是获取相对于屏幕左上角的值。
touchSlop是判定滑动的最小值。
VelocityTracker:单位时间内划过的像素值,先填上多长时间来规定单位时间,然后获取计算后的速度。
GestureDetector手势检测,用于辅助检测用户的单击、滑动、长按、双击等行为。
通过OnGestureListener、OnDoubleTapListener等监听事件来监听用户行为。
还可以接管目标View的onTouchEvent的
scroller:实现弹性滑动。
3.view的滑动
三种方式吧,第一种直接用view提供的scrollTo和scrollBy实现滑动。
第二种,使用动画的方式进行滑动,分为view的平移和view的属性动画,但是view的平移只是改变了视觉上的位置,点击事件只能在控件原来的位置上,而属性动画是在3.0之后有的,现在的机型一般都能使用了。
第三种,改变布局参数:直接用LayoutParams改变view的参数来实现滑动。
scroll本身不能实现弹性滑动,需要借助,computerScroll来计算单位时间内滑动多少距离,然后通过view重绘来实现弹性滑动。
动画也是根据每一帧到来的时候计算出要移动多少距离,然后通过scrollTo移动到相应的位置。
用延时策略来分段移动。
4.view的事件分发机制
viewGroup的点击事件产生后,dispatchTouchEvent就会被调用,然后判断自身是否拦截,onInterCeptTouchEvent为true就是要拦截,事件将交由onTouchEvent来处理,不拦截就将调用子节点的dispatchTouchEvent。
(1)同一事件序列是指手指从按下到放开这一个过程
(2)一个事件只能被一个view拦截并消耗。
(3)某个view一旦决定拦截,事件将只能由它来进行处理。
(4)某个view一旦开始处理事件,如果它不消耗Action_down事件,那么将交由他的父节点处理,并且同一事件序列的其他事件将不会再交给它处理。
(5)如果view不消耗action_down以外的事件,那么这些点击事件将会消失,并且交由Activity处理。
(6)viewGroup默认不拦截,onInterCeptTouchEvent默认为false
(7)view没有onInterCeptTouchEvent,事件交给它,就会触发onTouchEvent方法。
(8)view的onTouchEvent默认会消耗事件,除非clickable为false。
(9)view的enable不影响onTouchEvent的返回值,只要有clickable或者longclickable有一个返回true,那么onTouchEvent就返回true。
(10)onclick的前提是view是可点击的,并且他收到了down和up的事件。
(11)事件的传递都是从外向内的,requestdisAllowInterCeptTouchEvent方法可以在子元素中影响父元素的事件分发,Action_down除外。
5.view的滑动冲突
有三种滑动冲突,1.方向一致的,2方向相反的,3这两种的结合。
viewpager内部处理了和fragment组合的上下滑动和左右滑动的冲突。
网友评论