首先,看源码:框架
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); if (!awakenScrollBars()) { invalidate(); } } }
public void scrollBy(int x, int y) { scrollTo(mScrollX + x, mScrollY + y); }
从源码中能够看到,scrollBy()的内部实际上是调用了scrollTo()。在scrollTo()中,调用了onScrollChanged()和invalidate()。onScrollChanged()的做用就是告诉系统(能够理解为Android框架),这个View的scrollTo()或scrollBy()曾经被调用过;而invalidate()是告诉系统,这个View须要被从新绘制。code
mScrollX:表示离视图起始位置的x水平方向的偏移量 mScrollY:表示离视图起始位置的y垂直方向的偏移量
分别经过getScrollX() 和getScrollY()方法得到。 注意:mScrollX和mScrollY指的并非坐标,而是偏移量。get
scrollTo(int x,int y):
若是偏移位置发生了改变,就会给mScrollX和mScrollY赋新值,改变当前位置。 #####注意:x,y表明的不是坐标点,而是偏移量。 例如: 我要移动view到坐标点(100,100),那么个人偏移量就是:原位置坐标-目标位置坐标=偏移量 (0,,0) - (100,100) = (-100 ,-100) ,我就要执行view.scrollTo(-100,-100),达到这个效果。源码
scrollBy(int x,int y):
从源码中看出,它其实是调用了scrollTo(mScrollX + x, mScrollY + y); mScrollX + x和mScrollY + y,即表示在原先偏移的基础上在发生偏移,通俗的说就是相对咱们当前位置偏移。 因为sctrollTo只是移动了内容content,因此是父类VIEW里面的全部子控件在移动,而父容器ViewGroup并无移动,也就是说位置它还占用着,移动子控件的时候,子控件只能在容器里面移动,若是子控件移动到了超出的地方(父控件的范围),那么超出的位置就不会显示了。容器