scroller分析

彈性滑動(dòng)

這個(gè)類(lèi)不持有View,也沒(méi)有定時(shí)器通知View刷新,里面只是根據(jù)當(dāng)前時(shí)間來(lái)計(jì)算當(dāng)前View應(yīng)該在的位置
使用方法

Scroller  scroller = new Scroller(context);
scroller.startScroll(開(kāi)始坐標(biāo),結(jié)束坐標(biāo),時(shí)間);
invalidate();//這個(gè)一定要調(diào)用
//接下來(lái)我們要重寫(xiě)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)不起作用

最后編輯于
?著作權(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)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

  • 什么是View View 是 Android 中所有控件的基類(lèi)。 View的位置參數(shù) View 的位置由它的四個(gè)頂...
    acc8226閱讀 1,409評(píng)論 0 7
  • 本文分析版本: Android API 22 1.簡(jiǎn)介 Android開(kāi)發(fā)中,如果我們希望使一個(gè)View滑動(dòng)的話,...
    SkyKai閱讀 2,449評(píng)論 2 24
  • 導(dǎo)語(yǔ) 滑動(dòng)算是Android比較常用的效果了,滑動(dòng)的操作具有很好的用戶體驗(yàn)性。 主要內(nèi)容 滑動(dòng)效果是如何產(chǎn)生的 實(shí)...
    一個(gè)有故事的程序員閱讀 6,564評(píng)論 3 11
  • 本文參加# 印象青農(nóng),萌有感受#活動(dòng),本文承諾,文章內(nèi)容為原創(chuàng),且未在其他平臺(tái)發(fā)表過(guò)” 來(lái)到青農(nóng)之前,我還是一個(gè)懵...
    王姍姍lh閱讀 247評(píng)論 0 2
  • ——讀《約翰·克里斯托夫》有感 約翰·克里斯托夫是個(gè)天才的音樂(lè)家,但他的愛(ài)情之路卻似乎一直找不...
    水水5253閱讀 511評(píng)論 0 2

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