view 之touchSlop
touchSlop 是指系统所能识别出被认为滑动的最小距离,如果小于这个距离,系统则不认为发生了滑动。这是一个常量,与设备有关,在不同的设备上
这个值是不同的,通过viewconfiguration.get(getcontext()).getScaledTouchSlop().当我们处理滑动时就可以利用这个常量做一下过滤。
view 之velocityTracker,gestureDetector和scroller
velocityTracker 速度追踪,手指在滑动时的速度追踪,包括水平和竖直方向。
velocityTracker velocityTracker=velocityTracker.obtain();
velocityTracker.addMovement(event);
采用如下方式获得当前的速度
velocityTracker.computeCurrentvelocity(1000);
int xvelocity=velocityTracker.getXvelocity
int yvelocity=velocityTracker.getyvelocity();
获取速度之前必须先要计算出速度,及getXvelocity(),getyvelocity()之前必须要调用computeCurrentvelocity方法。注意,这里的 1000 代表z
在1000毫秒内手指划过的像素点。
view 之gestureDetector
手势检测,检测用户的单击,双击,滑动,长按等行为。
view的滑动
实现滑动共有三种方式:
1 通过view本身提供的scrollto,scrollby方法来实现滑动
2 通过动画给view施加平移效果来实现滑动
3 通过改变view的layoutParams使得view重新布局实现滑动
使用第一种方式时,mscrollx,mscrolly 可通过getscrollX()和getScrollY()来获取。scrollTo 和scrollBy只能改变view内容的位置而不能改变原来view
在原布局中的位置。如果从左向右滑动时,那么scrollX的指为负指,如果从上往下滑动时,那么mscrollY 为负值,反之为正值。
view的事件分发机制
点击事件的分发过程由三个很重要的方法来共同完成:dispatchTouchEvent(),onInterceptTouchEvent和onTouchEvent
dispatchTouchevent()用来进行事件的分发,onInterceptTouchEvent 用来判断是否拦截某个事件,onTouchEvent用来处理点击事件。
我们可以大致了解点击事件的传递规则;对于一个根viewgroup来说,点击事件产生后,首先会传递给它,这时他的dispatchTouchEvent 会被调用,如果这个veiwgroup的OnInterceptTouchEvent
方法返回true就表示他要拦截这个事件,接着事件就会交给这个viewgroup处理,即他的onTouchEvent方法就会被调用,如果这个viewgroup的onInterceptTouchEvent返回false的话,就表示它不拦截这个事件
这时这个事件就会继续传递给他的子元素,接着dispatchTouchEvent 方法就会被调用。
当一个view 需要处理事件时,如果它设置了onTouchListener,那么OnTouchListener中的onTouch方法会被回调,这时候如何处理要看Ontouch的返回值,如果返回false,则当前的view的onTouchEvent
方法会被调用,如果返回true,那么onTouchEvent方法讲不会被调用。由此可见,给view设置的OntouchListener,他的优先级比onTouchEvent更高。
事件分发的源码分析
1 Activity 对点击事件的分发过程
点击事件用MotionEvent来表示,当一个点击操作发生时,事件最先传递给当前的Activity,由Activity的disPatchTouchEvent来进行事件的分发,具体的工作是由Activity内部的window来完成。
window会将事件传递给decor view ,decorview一般就是当前界面的底层容器,通过Activity.getWindow.getDecorView()可以获得。
首先事件开始交给Activity所附属的window进行分发,如果返回true,整个事件循环就结束了,返回false意味这事件没有人处理,所有的view的onTouchEvent都返回false,那么Activity的onTouchEvent 就会重新被调用。
1670

被折叠的 条评论
为什么被折叠?



