《Android开发艺术探索》——view
view的概念这里就不说了,这里介绍一下View的几个实用的知识点:
TouchSlop是指View上用户点滑动的最小距离,当手指在屏幕上滑动时,如果两次滑动之间的距离小于这个常量那么系统就不认为你是在进行滑动操作。
这是一个常量,和设备有关,在不同的设备上这个值不同,可以通过
ViewConfiguration.get(getContext()).getScaledTouchSlop()获取。
View常用的API
VelocityTracker、GestureDetector、Scroller
VelocityTracker可以用来获取手机滑动过程中的速度,获取水平向滑动速度和竖直向滑动速度如下
VelocityTracker velocityTracker = VelocityTracker.obtain();
velocityTracker.addMovement(event);
velocityTracker.computeCurrentVelocity(1000);//这里的速度是指一段时间内手指所滑动的像素数这里的是1s的滑动速度
int xVelocity = (int)velocityTracker.getXVelocity();
int yVelocity = (int)velocityTracker.getYVelocity();
GestureDetector手势检测用于辅助检测用户的单击、滑动、长按、双击等行为具体的实现过程可以参考网络
Scroller用于实现View的弹性滑动
当使用View的scrollTo/scrollBy方法来进行滑动时,其过程是瞬间完成的,这个没有过渡效果的滑动用户体验不好。这个时候可以使用Scroller来实现有过渡效果的滑动。
Scroller本身无法让View弹性滑动,他需要和View的computeScroll方法配合使用.
View滑动
View的滑动可以通过scrollTo、scrollBy、动画以及改变view布局位置的方式移动
scrollTo绝对滑动、scrollBy相对滑动,在scrollBy内部调用了scrollTo的实现
其中scrollTo以及scrollBy移动的只是View的内容,view本身的位置不移动。View事件分发机制
所谓的事件分发,其实就是对MotionEvent事件的分发过程,即当一个MotionEvent产生了以后,系统需要把这个事件传递给一个具体的View
而这个传递的过程就是分发过程。点击事件的分发过程由三个很重要的方法共同完成:dispatchTouchEvent/onInterceptTouchEvent和onTouchEvent。
dispatchTouchEvent用来进行事件的分发。如果事件能够传递给当前View,那么此方法一定会被调用,返回结果受当前View的onTouchEvent和下级View的dispatchTouchEvent方法的影响,表示是否消耗当前事件。
onInterceptTouchEvent在上述方法内部调用,用来判断是否拦截某个事件,如果当前View拦截了某个事件那么在同一个事件序列当中,此方法不会被再次调用,返回结果表示是否拦截当前事件。
onTouchEvent在dispatchTouchEvent方法中调用,用来处理点击事件,返回结果表示是否消耗当前事件,如果不消耗,则在同一个事件序列中,当前View无法再次接受事件。
三个方法的关系如下伪代码所示:
如果在当前的ViewGroup中拦截,那么就执行onTouchEvent方法消耗掉点击事件。
如果在当前的ViewGroup中不拦截则执行ViewGroup的内部的子view执行子View的分发方法,执行过程也是一样。
@Override public boolean dispatchTouchEvent(MotionEvent ev) { boolean consume = false; if (onInterceptTouchEvent(ev)){ consume = onTouchEvent(ev); }else{ consume = child.dispatchTouchEvent(ev); } return consume; }
View的工作原理
未完待续。。。。