Android Scroller入門(二)

在上一篇我介紹過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);
}

這樣就完成整個效果了。

下載Demo請猛戳


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章