scrollTo 和srollBy是View的两个方法。用来改变控件内容的位置。只是内容的位置移动,所属的View的位置是不变的。
/**
* Set the scrolled position of yourview. This will cause a call to
* {@link #onScrollChanged(int,int, int, int)} and the view will be
* invalidated.
* @param x the x position to scroll to
* @param y the y position to scroll to
*/
public void scrollTo(int x, int y) {
if (mScrollX != x|| mScrollY != y) {
int oldX = mScrollX;
int oldY = mScrollY;
mScrollX = x;
mScrollY = y;
invalidateParentCaches();
onScrollChanged(mScrollX, mScrollY, oldX, oldY);
if (!awakenScrollBars()) {
postInvalidateOnAnimation();
}
}
}
/**
* Move the scrolled position of yourview. This will cause a call to
* {@link #onScrollChanged(int,int, int, int)} and the view will be
* invalidated.
* @param x the amount of pixels to scroll byhorizontally
* @param y the amount of pixels to scroll byvertically
*/
public void scrollBy(int x, int y) {
scrollTo(mScrollX + x, mScrollY + y);
}
通过源码可以发现
scrollBy实际上调用了srcollTo方法。
再来说说scrollX,scrollY这两个变量:
这两个变量记录View内容相对于所在View的位置。注意:记录的是View内容的位置!而不是View本身的位置。
通过getScrollX( )和getScrollY( )方法可以获得这两个变量。
下面给出实例:
我们先来测试scrollTo方法:
当button点击!
textview里面的文字内容位置发生了变化。
控制台输出:
我们发现textview的内容向左上分别移动了10个像素。
再次点击按钮:
没有发生任何变化!控制台输出同样的内容!
接下来我们看看scrollBy方法:
button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // textView.scrollTo(10,10); textView.scrollBy(10,10); Log.e("scrollX",textView.getScrollX()+""); Log.e("scrollY",textView.getScrollY()+""); } });
点击button
再次点击
再次点击
从三次点击log输出可以发现:scrollX,和scrollY的值一直发生改变。
每次点击textview内容的位置都会发生改变。
说明scrollBy方法位置移动是相对于上一次的scrollX,scrollY的位置的,而scrollTo相对的是初始位置。
总结:
1. scrollTo 和srollBy是View的两个方法。用来改变控件内容的位置。只是内容的位置移动,所属的View的位置是不变的。
2. scrollBy实际上调用了srcollTo方法。
3. scrollX,scrollY这两个变量记录View内容相对于所在View的位置。注意:记录的是View内容的位置!而不是View本身的位置。
4. scrollBy方法位置移动是相对于上一次的scrollX,scrollY的位置的,而scrollTo相对的是初始位置。