关于scrollTo()和scrollBy()方法介绍

不管是scrollTo()还是scrollBy(),它们移动的都是View或ViewGroup中的内容,而不是view或viewGroup本身。并且这个移动过程是瞬间完成的,因此,为了实现更好的移动效果,他们一般需要与Scroller类结合使用,关于Scroller类的介绍请看:https://blog.****.net/guolin_blog/article/details/48719871

在介绍scrollTo()和scrollBy()方法区别之前,我们先看下Android坐标系的定义规则:
关于scrollTo()和scrollBy()方法介绍
如图所示,android坐标系的原点在手机屏幕的左上角,x轴左→右为正,y轴从上→下为正。但是这并不适用于scrollTo()和scrollBy(),scrollTo()和scrollBy()刚好相反,即x轴左→右为负,y轴从上→下为负,这一点请注意。

现在说下scrollTo()和scrollBy()方法的区别:
ScrollTo()方法是让View相对于初始的位置移动一段距离,scrollBy()方法则是让View相对于当前的位置移动一段距离。现在通过一个例子实验一下。

布局:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:onClick="scrollTo"
        android:text="scrollTo"/>

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:onClick="scrollBy"
        android:text="scrollBy"/>

</LinearLayout>

代码:

public class TestActivity extends AppCompatActivity {

    private LinearLayout layout;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_test);

        layout =  findViewById(R.id.layout);
    }

    public void scrollTo(View view){
        layout.scrollTo(-60, -100);
    }

    public void scrollBy(View view){
        layout.scrollBy(-60, -100);
    }
}

看下效果:
关于scrollTo()和scrollBy()方法介绍
可以看到,scrollTo按钮第一次点击移动了一段距离,后面再点击就不动了,因为scrollTo按钮的初始位置没变。scrollBy按钮每次点击都会移动,是因为scrollBy的当前的位置一直在变。另外不管是scrollTo还是scrollBy,移动的都是layout里的内容,所以两个按钮一起在移动