View类ScrollTo的源码
public void scrollTo(int x, int y) {
//当传进来的参数与当前的mScrollX或mScrollY不一样才进行改变
if (mScrollX != x || mScrollY != y) {
//定义oldX,oldY来接收原来的ScrollX,ScrollY
int oldX = mScrollX;
int oldY = mScrollY;
//将传进来的参数赋值给没ScrollX,ScrollY
mScrollX = x;
mScrollY = y;
invalidateParentCaches();//刷新页面
//这是一个回调方法,用protected修饰,外部不能调用,用于自定义View复写
onScrollChanged(mScrollX, mScrollY, oldX, oldY);
if (!awakenScrollBars()) {
postInvalidateOnAnimation();
}
}
}
View类ScrollBy的源码
public void scrollBy(int x, int y) {
//在原来的基础上增加x,y个像素,实际上还是调用ScrollTo方法
scrollTo(mScrollX + x, mScrollY + y);
}
下面来说一说什么是ScrollX和ScrollY,对应View类的字段mScrollX,mScrollY
View类还提供了setScrollX,setScrollY,getScrollX,getScrollY方法
public void setScrollX(int value) {
//从这里可以看出,setScrollX方法也还是调用scrollTo方法,只不过在y方向,也就是ScrollY不变,
//只是将X方向移动到指定位置
scrollTo(value, mScrollY);
}
//setScrollY方法同setScrollX方法
public void setScrollY(int value) {
scrollTo(mScrollX, value);
}
//getScrollX,getScrollY将mScrollX,mScrollY返回,获取当前的位置
public final int getScrollX() {
return mScrollX;
}
public final int getScrollY() {
return mScrollY;
}
//onScrollChanged为回调方法,用于自定义View复写,具体调用在scrollTo中,当视图发生改变时回调该方法该方法前两个参数实际就是mScrollX,和mScrollY ;后两个参数分别是原来的ScrollX,ScrollY
protected void onScrollChanged(int l, int t, int oldl, int oldt) {
if (AccessibilityManager.getInstance(mContext).isEnabled()) {
postSendViewScrolledAccessibilityEventCallback();
}
mBackgroundSizeChanged = true;
final AttachInfo ai = mAttachInfo;
if (ai != null) {
ai.mViewScrollChanged = true;
}
}
ScrollTo和ScrollBy的区别
最新推荐文章于 2021-11-01 21:33:25 发布