scrollBy()和scrollTo()方法
scrollBy()和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();
}
}
}
/**
* 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有两个方法scrollBy()和scrollTo(),这两个方法移动的都是View的内容。
- 如果是ViewGroup,比如LinearLayout,使用上述两个方法将会移动LinearLayout的整个内容,可以用于实现下拉刷新时整体内容的移动效果
- 如果是View,比如TextView,那么移动的就是TextView的内容,可以用于实现TextView的字体滚动显示效果
- scrollTo()使用的具体的坐标而scrollBy()使用的偏移量,scrollBy()默认偏移量是0,这两个方法的传入的坐标参考的都是调用此方法view的视图坐标系
- 两个方法的调用会触发onScrollChanged()回调
实现View的滑动系列一 的效果,修改onTouchEvent部分代码:
@Override
public boolean onTouchEvent(MotionEvent event) {
int action = event.getAction();
int x = (int) event.getX();
int y = (int) event.getY();
switch (action) {
case MotionEvent.ACTION_DOWN:
lastX = x;
lastY = y;
break;
case MotionEvent.ACTION_MOVE:
int offsetX = x - lastX;
int offsetY = y - lastY;
//获取当前view的父view对象,需要强转成View对象去使用这两个方法
View parent = (View) getParent();
//偏移量为正给我们的视觉效果就是内容往左移动,为负值视觉效果就是内容在往右移动。
//所以计算出偏移量是正值,我们期待的视觉效果是内容往右移动,所以需要加上负号,切记,切记!
parent.scrollBy(-offsetX, -offsetY);
break;
case MotionEvent.ACTION_UP:
break;
}
//想接受一个触摸事件的全部事件序列,此处必须返回true,
//否则就只能接收到ACTION_DOWN事件
return true;
关于View和其内容的关系理解
- View可以理解是一个可见的视图,但是其内容可以比视图大。
比如:view 我们设置其宽和高都是100dp,我们的内容宽和高大小是1000dp。我们肉眼可见的视图区域就是view的宽和高设置的大小就是100dp,但是我们实际的内容比这个大的多,我们通过监听view的触摸事件来让view的内容进行移动,然后我们就可以看到其他的内容。