android之ViewPager修改滑動速度

來源:互聯網
上載者:User

標籤:方法   動畫   內容   override   etc   距離   scrollto   cat   .com   

在android中,使用過viewpager的人都清楚,我們如果使用viewpager進行滑動時,如果通過手指滑動來進行的話,可以根據手指滑動的距離來實現,但是如果通過setCurrentItem函數來實現的話,則會發現沒有過度動畫的效果,而是直接閃過去的,那麼在有時我們就會遇到一個需求,比如說我們想要通過使用setCurrentItem函數來進行viewpager的滑動,並且需要有過度滑動的動畫,那麼,該如何做呢?首先我們大致看下viewpager的原始碼:

首先我們看下setCurrentItem的執行了什嗎?

我們繼續往下看setCurrentItemInternal的函數,

繼續往下看setCurrentItemInternal的函數內容,

看到這個一大坨代碼後是不是有點慌,別怕,我們其實看到這個函數就夠了scrollToItem,然後我們看這個函數具體執行的是:

這個函數中,其實我們最主要關心的也是smoothScrollTo函數就好了,我們具體看下這個函數,

 

 

然後這個函數中,其實我們看到具體執行滑動的其實就一句話,就是mScroller.startScroll(sx, sy, dx, dy, duration);

那麼我們可以看到,是mScroller這個對象進行滑動的,那麼,最簡單粗暴的方法就是重寫這個類,並且重寫後怎麼付給viewpager呢,這就是接下來講的,這其中用到了java的反射機制,我們來看下:

public class FixedSpeedScroller extends Scroller {    private int mDuration = 1500;                                                                                                               public FixedSpeedScroller(Context context) {        super(context);    }                                                                                                               public FixedSpeedScroller(Context context, Interpolator interpolator) {        super(context, interpolator);    }                                                                                                               @Override    public void startScroll(int startX, int startY, int dx, int dy, int duration) {        // Ignore received duration, use fixed one instead        super.startScroll(startX, startY, dx, dy, mDuration);    }                                                                                                               @Override    public void startScroll(int startX, int startY, int dx, int dy) {        // Ignore received duration, use fixed one instead        super.startScroll(startX, startY, dx, dy, mDuration);    }                                                                                                               public void setmDuration(int time) {        mDuration = time;    }                                                                                                               public int getmDuration() {        return mDuration;    }}

這是我們重寫的scroller的類,其實比較簡單,我們只是將原來滑動的方法進行修改,滑動的具體時間,改為我們自己設定的,傳入的參數作廢即可。這樣的話,我們通過自己自訂滑動的時間,就可以控制滑動的速度。然後下一步就是如何將其賦值給原先的viewpager類,這裡呢,就用到了java的反射的機制,我們看具體的代碼:

try {    Field field = ViewPager.class.getDeclaredField("mScroller");    field.setAccessible(true);    FixedSpeedScroller scroller = new FixedSpeedScroller(mViewPager.getContext(),    new AccelerateInterpolator());    field.set(mViewPager, scroller);    scroller.setmDuration(2000);} catch (Exception e) {     }

這呢,就是通過反射的機制,將我們自訂的scroller傳進去,從而實現了我們自己控制滑動速度。

 

android之ViewPager修改滑動速度

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.