在上一篇我介紹過Scroller類中常用的兩個方法scrollTo和scrollBy,如果你還不太清楚這兩個方法的用法,你可以去看一下《Android Scroller入門之ScrollTo、ScrollBy》,這篇博客要介紹一下關於Scroller類的簡單使用。
首先介紹一下要使用到的API
getFinalX:返回滾動結束位置(得到當前X距離原始位置的值).僅針對"fling"滾動有效.
getCurrX:返回當前滾動 X方向的偏移
invalidate方法和postInvalidate方法:invalidate()在UI線程自身中使用;postInvalidate()在非UI線程中使用.
startScroll(int startX, int startY, int dx, int dy, int duration): 第一,二個參數起始位置;第三,四個滾動的偏移量;第五個參數持續時間
我們先來看一下Scroller的繪製流程
下面通過一個小Demo來講解,先看一下效果圖
1. 自定義類集成LinearLayout,重寫構造方法並初始化Scroller和手勢識別GestureDetector
private Scroller mScroller;
private GestureDetector mGestureDetector;
public ScrollerLinearLayout(Context context) {
this(context, null);
}
public ScrollerLinearLayout(Context context, AttributeSet attrs) {
this(context, attrs,0);
}
public ScrollerLinearLayout(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
setClickable(true);
setLongClickable(true);
mScroller = new Scroller(context);
mGestureDetector = new GestureDetector(context, new MyGestureListener());
}
2,手指按下並滾動
class MyGestureListener extends GestureDetector.SimpleOnGestureListener {
@Override
public boolean onDown(MotionEvent e) {
return true;
}
@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
int disY = (int) ((distanceY - 0.5) / 2);
beginScroll(0, disY);
return false;
}
}
//設置滾動的相對偏移
protected void beginScroll(int dx, int dy) {
//第一,二個參數起始位置;第三,四個滾動的偏移量
mScroller.startScroll(mScroller.getFinalX(), mScroller.getFinalY(), dx, dy);
//必須執行invalidate()從而調用computeScroll()
invalidate();
}
3,調用invalidate方法會觸發computeScroll方法的調用,只要computeScrollOffset方法返回false,就標誌滾動沒有結束
@Override
public void computeScroll() {
if (mScroller.computeScrollOffset()) {
scrollTo(mScroller.getCurrX(), mScroller.getCurrY());
postInvalidate();
}
super.computeScroll();
}
4.以上邏輯是處理手指按下的邏輯,手指擡起的邏輯我們可以重寫onTouchEvent
@Override
public boolean onTouchEvent(MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_UP:
//手指擡起時回到最初位置
prepareScroll(0, 0);
break;
default:
//其餘情況交給GestureDetector手勢處理
return mGestureDetector.onTouchEvent(event);
}
return super.onTouchEvent(event);
}
5.獲取到我們擡起是的最終位置,從這裏開始回滾
//滾動到目標位置
protected void prepareScroll(int fx, int fy) {
int dx = fx - mScroller.getFinalX();
int dy = fy - mScroller.getFinalY();
beginScroll(dx, dy);
}
這樣就完成整個效果了。