彈性滑動(dòng)
這個(gè)類不持有View,也沒(méi)有定時(shí)器通知View刷新礼殊,里面只是根據(jù)當(dāng)前時(shí)間來(lái)計(jì)算當(dāng)前View應(yīng)該在的位置
使用方法
Scroller scroller = new Scroller(context);
scroller.startScroll(開始坐標(biāo),結(jié)束坐標(biāo)砌函,時(shí)間);
invalidate();//這個(gè)一定要調(diào)用
//接下來(lái)我們要重寫View的computeScroll()方法
@Override
public void computeScroll() {
if (scroller.computeScrollOffset()) {//計(jì)算當(dāng)前應(yīng)該在的坐標(biāo)
scrollTo(-scroller.getCurrX(), -scroller.getCurrY());
}
}
實(shí)際上這個(gè)的原理就是帜消,調(diào)用完invalidate就會(huì)draw,然后就會(huì)調(diào)用computeScroll设褐,里面進(jìn)行滑動(dòng)颠蕴,然后scrollTo滑動(dòng),里面又會(huì)調(diào)用invalidate助析,就這么一直循環(huán)犀被,一直到scroller.computeScrollOffset為false,也就是滑動(dòng)結(jié)束
慣性滑動(dòng)
我們需要計(jì)算速度外冀,然后調(diào)用fling方法即可
@Override
public boolean onTouchEvent(MotionEvent event) {
if (tracker == null) {
tracker = VelocityTracker.obtain();
}
tracker.addMovement(event);
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
rawX = event.getRawX();
rawY = event.getRawY();
scroller.abortAnimation();
break;
case MotionEvent.ACTION_MOVE:
float crawX = event.getRawX();
float crawY = event.getRawY();
float dy = crawY - rawY;
float dx = crawX - rawX;
scrollBy((int) -dx, (int) -dy);
rawX = event.getRawX();
rawY = event.getRawY();
break;
case MotionEvent.ACTION_UP:
tracker.computeCurrentVelocity(1000);
float xVelocity = tracker.getXVelocity();
float yVelocity = tracker.getYVelocity();
//關(guān)鍵的是這里寡键,這里fling方法前兩個(gè)參數(shù)是要fling的起始坐標(biāo),一般就是當(dāng)前的滑動(dòng)坐標(biāo)
//第二三個(gè)參數(shù)就是velocitytracker得到的速度
//后面參數(shù)是慣性滑動(dòng)的范圍雪隧,也就是滑動(dòng)終點(diǎn)的范圍
scroller.fling(-getScrollX(), -getScrollY(), (int) xVelocity , (int) yVelocity , 0, width , 0, height);
invalidate(); //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!這里很重要西轩,fling后一定要手動(dòng)刷新!
tracker.clear();
tracker.recycle();
tracker = null;
break;
}
return true;
}
這里注意一點(diǎn)脑沿,就是scroller的坐標(biāo)是正的藕畔,然后yVelocity的速度的正負(fù)也要搞清。否則滑動(dòng)不起作用