自定义View
文末附源码地址
1.滑动时onTouchEvent的调用过程 - Log说明一切!
//截取了部分LOG信息
04-27 09:02:23.607 12110-12110/com.hero D/123: onTouchEvent 04-27 09:02:23.607 12110-12110/com.hero I/123: ACTION_DOWN //可见,DOWN只执行了一次,DOWN在break之后,
//再重新走onTouchEvent方法,并开始进入MOVE方法;
//MOVE中重复执行:MOVE-》break-》onTouchEvent-》MOVE。
04-27 09:02:23.651 12110-12110/com.hero D/123: onTouchEvent 04-27 09:02:23.652 12110-12110/com.hero V/123: ACTION_MOVE... 04-27 09:02:23.652 12110-12110/com.hero E/123: 0 --- 0 //这个是做的offset偏移量,下面的scroll会用到 04-27 09:02:23.668 12110-12110/com.hero D/123: onTouchEvent 04-27 09:02:23.668 12110-12110/com.hero V/123: ACTION_MOVE... 04-27 09:02:23.668 12110-12110/com.hero E/123: 0 --- 0 04-27 09:02:23.684 12110-12110/com.hero D/123: onTouchEvent 04-27 09:02:23.684 12110-12110/com.hero V/123: ACTION_MOVE... 04-27 09:02:23.684 12110-12110/com.hero E/123: 0 --- 0 04-27 09:02:23.701 12110-12110/com.hero D/123: onTouchEvent 04-27 09:02:23.701 12110-12110/com.hero V/123: ACTION_MOVE... 04-27 09:02:23.701 12110-12110/com.hero E/123: 0 --- 0 04-27 09:02:23.718 12110-12110/com.hero D/123: onTouchEvent
2.scrollTo与scrollBy - 核心一句话“左加右减,上加下减”
摘要
- scrollBy是内部就是调用的scrollTo方法:scrollTo(mScrollX + x, mScrollY + y); ;
- scrollTo、scrollBy方法移动的是View的content,即让View的内容移动;如果在ViewGroup中使用scrollBy、scrollTo方法,那么移动的是该ViewGroup中所有的子View,但如果在View中使用,那么移动的将是View的内容。例如:TextView,content就是他的文本,ImageView,content就是它的drawable对象。
MyView内部调用:
((View) getParent()).scrollBy(offsetX, offsetY);
外部调用:
((View) myView.getParent()).scrollBy(offsetX, offsetY);
相当于MyView的content上有一层带眼儿的盖板(MyView本身),当调用scrollTo、scrollBy方法时,移动的是盖板。
- scrollTo、scrollBy 向右或向下移动是负值,向上或向左移动传正值;
mScrollX与mScrollY
- mScrollX 表示的是view的左边缘到view的内容的左边缘的水平距离,类似的,mScrollY表示的是view的上边缘与view内容的上边缘的竖直方向的距离;
- 二者分别通过getScrollX() 和getScrollY()方法获得;
- mScrollX和mScrollY指的并不是坐标,而是偏移量(距离)。
参考:android 布局之滑动探究 scrollTo 和 scrollBy 方法使用说明
Android中滑屏初探 ---- scrollTo 以及 scrollBy方法使用说明
3.Scroller
参考:Android Scroller与computeScroll的调用机制关系