1、view 的事件分发机制理解三个概念:dispatchKeyEvent、onTouchEvent与onInterceptTouchEvent
用伪代码总结为:
dispatchkeyevent(event) {
if(onInteceptTouchEvent(event)) {
return onTouchEvent(event);
} else {
return childview.dispatchkeyEvent(event)
}
}
2、view的onTouch比onTouchEvent方法优先级高,如果view有设置ontouchListener则执行onTouch方法
3、Scroller类的理解
scroller类实际在view的滑动过程中并没有实际去操作view的滑动,它本身担当的角色是一个指导员的角色,引导view去进行怎样的滑动,实际的滑动是调用了view 的scrollto或者scrollby的方法,scrollto是指滑动到一个坐标点,scrollby是指滑动了多少距离到达某一个点,需要注意的是这里移动的都是view的内容,并没有移动view本身的位置;
public void scrollTo(int x, int y) { if (mScrollX != x || mScrollY != y) { int oldX = mScrollX; int oldY = mScrollY; mScrollX = x; mScrollY = y; onScrollChanged(mScrollX, mScrollY, oldX, oldY); invalidate(); } }
public void scrollBy(int x, int y) { scrollTo(mScrollX + x, mScrollY + y); }
从源码可以看出scrollBy最终也是调用了scrollto的方法,对同一个view调用两次scrollTo(10,10)只会移动一次,而调用两次scrollBy(10,10)会移动两次,实际x方向移动的距离为20.y方向也为20
通常Android上应用一些炫酷的拖动的界面都是继承重写了viewgroup的一些方法, view 的computescroll方法会在父容器重绘时调用到(viewgroup的重绘必定会引起外层父容器的重绘,而父容器的重绘会在drawchild()方法中调用到child.computeScroll()).
4、view类中的mScrollX与mScrollY:scrollx、scrolly分别为屏幕左边缘在整个view的坐标点的x、y坐标,view的原点为界面初始化时与屏幕左边缘重叠时的点