什麼是Scroller?
翻譯為彈性滑動對象,可以實作View的彈性滑動動畫,與Scroller相關的就是大家比較熟悉的scrollTo和scrollBy方法,可以用來實作View的滑動,但是它們的缺點就是瞬間完成,無法很平滑地過渡,而Scroller可以幫助我們很平滑地進行彈性滑動。
使用
一般使用在自定義View中較多,可以實作View的彈性滑動效果
1、自定義一個View,注釋很詳細
/**
* 自定義View 裡面有個Scroller 它能實作非常平滑的滾動效果 就像動畫一樣 可以控制在多長時間内滾動到指定位置
*
* @author yangfan
*
*/
public class DIYView extends LinearLayout
{
// 建立一個Scroller
private Scroller mScroller;
public DIYView(Context context)
{
this(context, null);
}
// 1、建立Scroller
public DIYView(Context context, AttributeSet attrs)
{
super(context, attrs);
mScroller = new Scroller(context);
}
// 2、觸摸回調,每次X軸方向加100,然後調用smoothScrollTo
@Override
public boolean onTouchEvent(MotionEvent event)
{
int disX = mScroller.getFinalX() + 100;
Log.e("***************", "onTouchEvent");
smoothScrollTo(disX, 0);
return super.onTouchEvent(event);
}
// 3、根據坐标差 調用smoothScrollBy
public void smoothScrollTo(int fx, int fy)
{
int dx = fx - mScroller.getFinalX();
int dy = fy - mScroller.getFinalY();
smoothScrollBy(dx, dy);
}
// 4、調用startScroll設定坐标,然後invalidate重繪
public void smoothScrollBy(int dx, int dy)
{
// 參數一:startX 參數二:startY為開始滾動的位置,dx,dy為滾動的偏移量, 1500ms為完成滾動的時間
mScroller.startScroll(mScroller.getFinalX(), mScroller.getFinalY(), dx,
dy, 3000);
invalidate();
}
// 5、重繪過程會調用computeScroll 真正調用scrollTo進行滾動 然後再進行重繪
@Override
public void computeScroll()
{
// 判斷滾動是否完成 true就是未完成
if (mScroller.computeScrollOffset())
{
scrollTo(mScroller.getCurrX(), mScroller.getCurrY());
// 本案例中 調用postInvalidate和invalidate都可以
invalidate();
}
super.computeScroll();
}
}
2、布局中使用自定義View
<com.abc.edu.scroll.DIYView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="#ffffff" >
<!-- 弄一個提示文本 -->
<TextView
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="#ff0000"
android:gravity="center"
android:text="請向左滑動"
android:textSize="30sp" />
</com.abc.edu.scroll.DIYView>
3、測試運作,然後用手指在螢幕滑動幾下
Scroller.gif
注意點
Scroller本身并不能實作View的滑動,本質還是讓View重繪,重繪中調用View的computeScroll方法,在該方法中進行滑動方法的具體實作,然後再調用重繪函數,如此反複才會在界面上形成不斷滑動的動畫。