Scroller、scrollBy scrollTo
摘要:
public class MyView extends android.support.v7.widget.AppCompatTextView {
private Scroller scroller;
public MyView(Context context) {
...
public class MyView extends android.support.v7.widget.AppCompatTextView { private Scroller scroller; public MyView(Context context) { super(context); } public MyView(Context context, @Nullable AttributeSet attrs) { super(context, attrs); scroller = new Scroller(context); } /** * 緩慢滾動到指定位置 * * @param destX 目的x * @param destY 目的y */ public void smoothScrollTo(int destX, int destY) { //原本內容在X軸的偏移量 int scrollX = getScrollX(); //原本內容在Y軸的偏移量 int scrollY = getScrollY(); //偏移量 -為正方向 +為反方向 int deltaX = scrollX - destX; int deltaY = scrollY - destY; scroller.startScroll(scrollX, scrollY, deltaX, deltaY, 1500); invalidate(); } @Override public void computeScroll() { //先判斷mScroller滾動是否完成 if (scroller.computeScrollOffset()) { //這裡呼叫View的scrollTo()完成實際的滾動 scrollTo(scroller.getCurrX(), scroller.getCurrY()); //必須呼叫該方法,否則不一定能看到滾動效果 postInvalidate(); } super.computeScroll(); } }
final RelativeLayout rl = findViewById(R.id.rl); final MyView myView = findViewById(R.id.txtOne); rl.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { //使用scrollTo或scrollBy來實現view的滑動,只能將view的內容進行滑動,並不能將view本身進行移動 so -為正方向 +為反方向 //scrollTo()方法是讓View相對於初始的位置滾動某段距離,由於View的初始位置是不變的,因此不管我們點選多少次scrollTo按鈕滾動到的都將是同一個位置。 // 而scrollBy()方法則是讓View相對於當前的位置滾動某段距離,那每當我們點選一次scrollBy按鈕,View的當前位置都進行了變動. rl.scrollBy(100, 0); //rl.scrollTo(0, 0); } }); myView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { myView.smoothScrollTo(100, 50); } });