Android開(kāi)發(fā)藝術(shù)探索筆記-自定義View-跟手滑動(dòng)

實(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等方法。

效果如下。

QQ20170320-160636.gif

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容