Android View的scrollTo()、scrollBy() 和Scroller类总结
View
的scrollTo()
、scrollBy()
使用介绍
scrollTo()
和scrollBy()
实践,自定义滑动效果
Scroller
滑动辅助类,startScroll()
和computeScrollOffset()
使用介绍
Scroller
实践,使用示例
- 总结
一、View的scrollTo()、scrollBy()
1.1 scrollTo scrollBy 使用说明
scrollTo()
、scrollBy()
方法是View
中的,因此任何的View都可以通过这两种方法进行移动。首先要明白的是,scrollTo、scrollBy滑动的是View中的内容(而且还是整体滑动),而不是View本身。我们的滑动控件如SrollView可以限定宽、高大小,以及在布局中的位置,但是滑动控件中的内容(或者里面的childView)可以是无限长、宽的,我们调用View的scrollTo、scrollBy方法,相当于是移动滑动控件中的画布Canvas
,然后进行重绘,屏幕上也就显示相应的内容。
1.2 scrollTo使用介绍
- 调用
scrollTo(100,0)
表示将View中的内容移动到距离内容初始显示位置的x=100,y=0
的地方,效果如下图:
- 调用
scrollTo(0,100)
效果如下图:
- 调用
scrollTo(100,100)
效果如下图:

1.3 scrollBy使用介绍
- 调用
scrollBy(0,100)
表示将View
中的内容移动到原内容基础上x=x + 0,y=y + 100
的地方,所以scrollBy是在原来的基础上移动的,效果如下图:
scrollBy()
的源码中其实也非常简单调用的就是scrollTo()
,只不过是加上了当前的mScrollX
或者 mScrollY
public void scrollBy(int x, int y) {
scrollTo(mScrollX + x, mScrollY + y);
}
二、scrollTo和scrollBy实践,自定义滑动效果
- 通过上面几个图,可以清楚看到scrollTo和scrollBy的作用和滑动坐标系的关系。在实际使用中,我们一般是在
onTouchEvent()
方法中处理滑动事件,在MotionEvent.ACTION_MOVE
时调用scrollTo(int x,int y)
进行滑动,在调用scrollTo(int x,int y)
前,我们先要计算出两个参数值,即水平和垂直方向需要滑动的距离,如下:
public class ScrollActivity extends AppCompatActivity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_scroll);
}
private int mLastX;
private int mLastY;
@Override
public boolean onTouchEvent(MotionEvent event) {
int y = (int) event.getY();
int x = (int) event.getX();
int action = event.getAction();
View decorView = getWindow().getDecorView();
switch (action) {
case MotionEvent.ACTION_DOWN:
mLastY = y;
mLastX = x;
break;
case MotionEvent.ACTION_MOVE:
<