-
什么是Scroller?
- 翻譯為彈性滑動(dòng)對(duì)象,可以實(shí)現(xiàn)View的彈性滑動(dòng)動(dòng)畫,與Scroller相關(guān)的就是大家比較熟悉的scrollTo和scrollBy方法卑笨,可以用來(lái)實(shí)現(xiàn)View的滑動(dòng),但是它們的缺點(diǎn)就是瞬間完成仑撞,無(wú)法很平滑地過(guò)渡赤兴,而Scroller可以幫助我們很平滑地進(jìn)行彈性滑動(dòng)。
-
Scroller類的介紹
- 我們知道想把一個(gè)View偏移至指定坐標(biāo)(x,y)處隧哮,利用scrollTo()方法直接調(diào)用就OK了桶良,但我們不能忽視的是,該方法本身
來(lái)的的副作用:非常迅速的將View/ViewGroup偏移至目標(biāo)點(diǎn)沮翔,而沒(méi)有對(duì)這個(gè)偏移過(guò)程有任何控制艺普,對(duì)用戶而言可能是不太友好的。于是鉴竭,基于這種偏移控制歧譬,Scroller類被設(shè)計(jì)出來(lái)了,該類的主要作用是為偏移過(guò)程制定一定的控制流程(后面我們知道的更多)搏存,從而使偏移更流暢瑰步,更完美。
- 我們知道想把一個(gè)View偏移至指定坐標(biāo)(x,y)處隧哮,利用scrollTo()方法直接調(diào)用就OK了桶良,但我們不能忽視的是,該方法本身
-
DIYView.java(自定義View)
public class DIYView extends LinearLayout{
// 創(chuàng)建一個(gè)Scroller
private Scroller mScroller;
public DIYView(Context context)
{
this(context, null);
}
// 1璧眠、創(chuàng)建Scroller
public DIYView(Context context, AttributeSet attrs)
{
super(context, attrs);
mScroller = new Scroller(context);
}
// 2缩焦、觸摸回調(diào),每次X軸方向加100责静,然后調(diào)用smoothScrollTo
@Override
public boolean onTouchEvent(MotionEvent event)
{
int disX = mScroller.getFinalX() + 100;
Log.e("===============", "onTouchEvent");
smoothScrollTo(disX, 0);
return super.onTouchEvent(event);
}
// 3袁滥、根據(jù)坐標(biāo)差 調(diào)用smoothScrollBy
public void smoothScrollTo(int fx, int fy)
{
int dx = fx - mScroller.getFinalX();
int dy = fy - mScroller.getFinalY();
smoothScrollBy(dx, dy);
}
// 4、調(diào)用startScroll設(shè)置坐標(biāo)灾螃,然后invalidate重繪
public void smoothScrollBy(int dx, int dy)
{
// 參數(shù)一:startX 參數(shù)二:startY為開(kāi)始滾動(dòng)的位置题翻,dx,dy為滾動(dòng)的偏移量, 1500ms為完成滾動(dòng)的時(shí)間
mScroller.startScroll(mScroller.getFinalX(), mScroller.getFinalY(), dx,
dy, 3000);
//調(diào)用這個(gè)函數(shù)后會(huì)刷新整個(gè)矩形客戶區(qū),或者部分指定的客戶區(qū),區(qū)域?qū)?huì)重繪
invalidate();
}
// 5、重繪過(guò)程會(huì)調(diào)用computeScroll 真正調(diào)用scrollTo進(jìn)行滾動(dòng) 然后再進(jìn)行重繪
@Override
public void computeScroll()
{
// 判斷滾動(dòng)是否完成 true就是未完成
if (mScroller.computeScrollOffset())
{
scrollTo(mScroller.getCurrX(), mScroller.getCurrY());
// 本案例中 調(diào)用postInvalidate和invalidate都可以
invalidate();
}
super.computeScroll();
}
}
-
布局文件
<com.example.scrollerview.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="#f0ece0" >
<!-- 提示文本 -->
<TextView
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="#d8a89a"
android:gravity="center"
android:text="請(qǐng)向左滑動(dòng)"
android:textSize="30sp" />
</com.example.scrollerview.DIYView>
-
主Activity不需進(jìn)行任何改動(dòng)
-
演示
Scroller.gif
-
摘自親愛(ài)的輔導(dǎo)員(yungfan)