實(shí)現(xiàn)一個(gè)跟手滑動(dòng)的效果碘梢,這一定是個(gè)自定義View州邢,拖動(dòng)它可以讓它在整個(gè)屏幕上隨意滑動(dòng)。這個(gè)View實(shí)現(xiàn)起來很簡單辙诞,我們只要重寫它的onTouchEvent方法并處理ACTION_MOVE事件辙售,根據(jù)兩次滑動(dòng)之間的距離就可以實(shí)現(xiàn)它的滑動(dòng)了。為了實(shí)現(xiàn)全屏滑動(dòng)飞涂,此采用動(dòng)畫的方式來實(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;
}
通過上述代碼可以看出较店,這一全屏滑動(dòng)的效果實(shí)現(xiàn)起來相當(dāng)簡單士八。首先我們通過getRawX和getRawY方法來獲取手指當(dāng)前的坐標(biāo),注意不能用getX和getY方法梁呈,因?yàn)檫@個(gè)是要全屏滑動(dòng)的婚度,所以需要獲取當(dāng)前點(diǎn)擊事件再屏幕中的坐標(biāo)而不是相對于位移,View本身的坐標(biāo)官卡;其次陕见,我們要得到兩次滑動(dòng)之間的位移秘血,
有了這個(gè)位移就可以移動(dòng)當(dāng)前的View,移動(dòng)方法采用的是動(dòng)畫兼容庫 nineoldandroids 中的 ViewHelper 類所提供的 setTranslationX 和setTranslationY 方法评甜。實(shí)際上灰粮,ViewHelper 類提供了一系列 get/set方法,因?yàn)?View 的 setTrainslationX 和 setTranslationY 只能在 Android3.0 及以上版本才能使用忍坷,但是ViewHelper所提供的方法是沒有版本要求的粘舟,與此類似的還有 setX、setScaleX佩研、setAlpha等方法柑肴。
效果如下。
注:以上內(nèi)容摘自《Android 開發(fā)藝術(shù)探索》 —— 任玉剛
此篇僅作筆記使用旬薯。