关于这个类网上的讲的大多没有把难点说出来下面我就剖析下这个类
1:首先scrollTo;这里的两个参数是滑动到的意思;这两个参数是目的。
/**
* Set the scrolled position of your view. 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();
}
}
}
2:scrollBy这两个入参数是过程。就是位移。
/**
* Move the scrolled position of your view. 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 by horizontally
* @param y the amount of pixels to scroll by vertically
*/
public void scrollBy(int x, int y) {
scrollTo(mScrollX + x, mScrollY + y);
}
重要理解思想:一个View都是因为限定了其长宽高的时候,显示的时候屏幕就像是拿着望远镜看事物一样的
一、不使用Scroller单纯的view 滚动就会出现被自己父类限定的位置遮挡。
当然也通常在让要滚动的view match_parent 这样view 调用scrollTo和scrollBy的时候不会遮挡;实现一个直接滚动到某处的效果;就像ScrollView scrollTo 那样的效果;
二、Scroller 是一个提供滑动的类;这个类是个工具;他帮忙计算过程。
startScroll(int startX, int startY, int dx, int dy, int duration);
//postInvalidate();
实现的是从前两个是执行此方法;此viewGroup 就会到滚到这里的初始值;//只是设置个值,并没有直接执行操作
此viewGroup要滚动的位移;//这里也是只是设置个值并没有执行
问题来啦;怎么滚动;
@Override
public void computeScroll() {
// 如果返回true,表示动画还没有结束
// 因为前面startScroll,所以只有在startScroll完成时 才会为false
Scroller.computeScrollOffset()
// 重写这个完成滚动这个方法;这个方法虽然叫完成滚动但是他却会在滚动的时候被多次调用;是一个过程量;所有的滚动操作就是在这里面完成的
// 在这个时候scroller 获取当前的位置getCurrX 和getcurry;
//让子类view 执行scrollTo 的时候就能实现子类的滚动//viewGroup 执行scrollTo 就会把所有这个viewGroup 的子类进行滚动;viewGroup 不执行scrollTo 就没有效果此效果。
//postInvalidate();
}
代码地址:http://download.csdn.net/detail/u012629497/8340883