基本API
设置视图内容滚动到(x,y)
Set the scrolled position of your view. This will cause a call to
onScrollChanged(int, int, int, int) and the view will be invalidated.
在视图内容当前位置的基础上,在x轴方向上偏移dx,在y轴方向上偏移dy
Move the scrolled position of your view. This will cause a call to
onScrollChanged(int, int, int, int) and the view will be invalidated
参考系问题
1.scrollTo与scrollBy的参考系
注意
scrollTo(scrollX,scrollY);
现象
当scrollX为正,内容向左偏移(显示右侧内容);
当scrollX为负,内容向右偏移(显示左侧内容)。
看起来scrollTo的参考系方法是和android坐标系的方法相反的,其实本质的原因是因为内容的最终位置为left=originLeft-scrollX。见下面的源码分析源码解析 参考
内容的left为=l-scrollX
scrollX为正,left减小,内容向左偏移;
scrollX为负,left增大,内容向右偏移;
这就是为什么dx为正数是,内容向左偏移的原因。
if (p != null && ai != null && l < r && t < b) {
final int scrollX = mScrollX;
final int scrollY = mScrollY;
final Rect tmpr = ai.mTmpInvalRect;
tmpr.set(l - scrollX, t - scrollY, r - scrollX, b - scrollY);
p.invalidateChild(this, tmpr);
}
所以scrollTo(int scrollX,int scrollY)的参考系就是视图参考系,
只不过设置的scrollX不是最终的内容位置,
最终的内容位置为nowLeft-scrollX.
- 理解方法
可以理解为视图的内容的每一个点都有一个坐标,
这个坐标的坐标系和画布的坐标系一样,scrollTo(scrollX,scrollY)就是将坐标为(scrollX,scrollY)的内容点移动到视图坐标的原点处。
3.1 初始时
3.2 调用scrollTo以后
3.3 帮助理解的程序
代码地址
向右滑动,scrollX增大;
向左滑动scrollX减小。
2.触摸事件的参考系
触摸事件MotionEvent.get.X/Y()的参考系为触摸点所在视图的视图参考系。
总结
通常情况下
要根据手势的偏移(dy=nowY-lastY)去偏移视图内容的位置,
但是这两个的值正负又不一样
所以只要记得
scrollTo/scrollBy的偏移方向要和触摸事件的偏移相反就行了