實(shí)現(xiàn)一個(gè)跟手滑動(dòng)的效果,這一定是個(gè)自定義View,拖動(dòng)它可以讓它在整個(gè)屏幕上隨意滑動(dòng)。這個(gè)View實(shí)現(xiàn)起來(lái)很簡(jiǎn)單,我們只要重寫它的onTouchEvent方法并處理ACTION_MOVE事件,根據(jù)兩次滑動(dòng)之間的距離就可以實(shí)現(xiàn)它的滑動(dòng)了。為了實(shí)現(xiàn)全屏滑動(dòng),此采用動(dòng)畫的方式來(lái)實(shí)現(xiàn)。核心代碼如下所示。
public boolean onTouchEvent(MotionEvent event) {
int x = (int) event.getRawX();
int y = (int) event.getRawY();
switch (event.getAction()){
case MotionEvent.ACTION_DOWN:
break;
case MotionEvent.ACTION_MOVE:
int deltaX = x - mLastX;
int deltaY = y - mLastY;
int translationX = (int) (ViewHelper.getTranslationX(this) + deltaX);
int translationY = (int) (ViewHelper.getTranslationY(this) + deltaY);
ViewHelper.setTranslationX(this,translationX);
ViewHelper.setTranslationY(this,translationY);
break;
case MotionEvent.ACTION_UP:
break;
default:
break;
}
mLastX = x;
mLastY = y;
return true;
}
通過(guò)上述代碼可以看出,這一全屏滑動(dòng)的效果實(shí)現(xiàn)起來(lái)相當(dāng)簡(jiǎn)單。首先我們通過(guò)getRawX和getRawY方法來(lái)獲取手指當(dāng)前的坐標(biāo),注意不能用getX和getY方法,因?yàn)檫@個(gè)是要全屏滑動(dòng)的,所以需要獲取當(dāng)前點(diǎn)擊事件再屏幕中的坐標(biāo)而不是相對(duì)于位移,View本身的坐標(biāo);其次,我們要得到兩次滑動(dòng)之間的位移,
有了這個(gè)位移就可以移動(dòng)當(dāng)前的View,移動(dòng)方法采用的是動(dòng)畫兼容庫(kù) nineoldandroids 中的 ViewHelper 類所提供的 setTranslationX 和setTranslationY 方法。實(shí)際上,ViewHelper 類提供了一系列 get/set方法,因?yàn)?View 的 setTrainslationX 和 setTranslationY 只能在 Android3.0 及以上版本才能使用,但是ViewHelper所提供的方法是沒(méi)有版本要求的,與此類似的還有 setX、setScaleX、setAlpha等方法。
效果如下。

注:以上內(nèi)容摘自《Android 開(kāi)發(fā)藝術(shù)探索》 —— 任玉剛
此篇僅作筆記使用。