3.1 View基础知识
主要内容分为:View的位置参数、MotionEvent和TouchSlop、VelocityTracker,GestureDetector和Scroller对象。
3.1.1 什么是View
View是Android中所有控件的基类。
3.1.2 View的位置参数
由它的四个属性决定:top,left,right,bottom,这些坐标相对于父容器来说的。3.0以后增加了x,y,translationX和translationY属性。translationX和translationY是相对于父容易的偏移量,这几个属性有如下关系:
x = left+translationX;
y = top+translationY;
3.1.3 MotionEvent和TouchSlop
MotionEvent(在手指接触屏幕后所产生的一系列事件)
ACTION_DOWN:手指刚接触屏幕
ACTION_MOVE:手指在屏幕上移动
ACTION_UP:手指在屏幕上松开一瞬间
通过MotionEvent可以得到单机事件发生的x和y坐标。两组方法:getX/getY和getRawX/getRawY。getX/getY是相对于当前View的左上角的x和y坐标,而getRawX/getRawY返回的是相对于手机屏幕左上角的x和y坐标。
TouchSlop:
TouchSlop是系统所能识别出的被认为是滑动的最小距离,常量和设备无关。通过ViewConfiguration.get(context).getScaledTouchSlop()来获取这个常量。
3.1.4 VelocityTracker、GuestureDetector和Scroller
VelocityTracker:用于追踪手指在滑动过程中的速度,包括水平和竖直方向的速度。
GuestureDetector:用于手势检测,用于辅助检测用户的单击、滑动、长按、双击等行为。
Scroller:弹性滑动对象,用于实现View的弹性滑动。因为View自带的scrollTo和scrollBy方法滑动,其过程是瞬间完成的,这个没有过渡效果的滑动用户体验不好,这个时候就可以使用Scroller来完成过度效果滑动。
3.2 View的滑动
通过三种方式实现View的滑动:
1,View本身的scrollTo/scrollBy方法来实现滑动,这种方式只能改变View内容的位置,而不能改变View在布局中的位置。
2,通过动画给View施加平移效果来实现滑动,View动画是对View的影相做操作,它并不能真正改变View的位置参数,包括宽/高。属性动画在3.0以后是改变View的位置。
3,通过改变View的LayoutParams使得View重新布局实现滑动。
3.3 弹性滑动
将一次大的滑动分成若干次小的滑动,并在一段时间内完成。
使用Scroller
Scroller本身并不能实现View的滑动,它需要配合View的computScroll方法才能完成弹性滑动的效果,它不断地让View重回,通过时间间隔计算出滑动距离,通过scrollTo进行小幅度滑动。
通过动画
使用延时策略
3.4 View的事件分发机制
3.4.1 点击事件的传递规则
点击事件的分发过程由三个很重要的方法来共同完成:dispatchTouchEvent、onInterceptTouchEvent和onTouchEvent,伪代码关系如下:
public boolean dispatchTouchEvent(MotionEvent ev){
boolean consume = false;
if(onInterceptTouchEvent(ev)){
consume = onTouchEvent(ev);
}else{
consume = child.onInterceptTouchEvent(ev);
}
return consume;
}
3.5 View的滑动冲突
常见滑动冲突场景
1、外部滑动方向和内部滑动方向不一致;
2,外部滑动方向和内部滑动方向一致
3,上述两种嵌套
解决方法:外部拦截法和内部拦截法