基本的滑動操作是通過ScrollTo() 和 ScrollBy()實現。
關於這兩個方法的理解:
很多人對這兩個方法的理解一般從在誤區,起初我對這兩個方法的理解也有問題。我當時以爲這個兩個方法其實移動的就是我們要移動的View ,其實這是有問題的,這兩個方法移動的是承載我們要移動的view的容器。所以正負值和我們一般理解的正負值是正好相反的。
可以這樣理解,相當於我們要移動的view是固定不動的,我們來挪動它的容器以實現移動view的目的。列如我們想讓我們的view向右移動的話,view是固定的,那我們的容器必須向左移動,而向左移動的話以屏幕座標來說是負值,所以我們傳負數。
而這兩個方法是點到點的移動,所以我們通過Scroller實現平滑的移動。
例如側滑關閉頁面,當我們拖拽的距離大於屏幕一般的寬度時我們關閉頁面,否則將頁面滾動到初始位置,而這個滾動的操作就藉助Scroller實現:
private class ScrollPager extends FrameLayout {
private final Scroller scroller;
public ScrollPager(@NonNull Context context) {
super(context);
scroller = new Scroller(context);
}
private float startX;
private float lastX;
int disX = 0;//移動距離
@Override
public boolean onTouchEvent(MotionEvent event) {
int action = event.getAction();
startX = event.getRawX();
switch (action) {
case MotionEvent.ACTION_DOWN:
lastX = startX;
disX = 0;
scroller.abortAnimation();
break;
case MotionEvent.ACTION_MOVE:
disX = (int) (lastX - startX);
scrollBy(disX, 0);
lastX = startX;
break;
case MotionEvent.ACTION_UP:
if (Math.abs(getScrollX()) > width / 2) {
scroller.startScroll(getScrollX(), 0, -(width-Math.abs(getScrollX())), 0,1000);
} else {
scroller.startScroll(getScrollX(),0, Math.abs(getScrollX()),0,1000);
}
invalidate();
break;
}
return true;
}
@Override
public void computeScroll() {
if (scroller.computeScrollOffset()) {
scrollTo(scroller.getCurrX(), scroller.getCurrY());
postInvalidate();
}
}
}