ViewFlipper探索與使用——順便實現Android圖片輪播

若是本文幫助到你,本人不勝榮幸,若是浪費了你的時間,本人深感抱歉。 但願用最簡單的大白話來幫助那些像我同樣的人。若是有什麼錯誤,請必定指出,以避免誤導你們、也誤導我。 本文來自:www.jianshu.com/users/320f9… 感謝您的關注。git

前段時間偶然看到一個使用 ViewFlipper 實現圖片輪播的。 我認可,以前我是沒有聽過 ViewFlipper 這個東西的。那麼我腦海中就出現了一個問題:ViewFlipper 是個什麼東西?爲何繼承它能實現圖片的輪播。而後有了以後的探索,咱們一塊兒來看看。github


分析 ViewFlipper

在 studio 中 F4 查看層級關係,通過一番尋找以後有了下圖。 呦呵,看到了熟人。ViewFlipper 我沒見過,可是我見過 TextSwitcher 和 ImageSwitcher 啊,他兩都是內容改變時有個動畫的效果。ide

分析 TextSwitcher 、ImageSwitcher

層級關係

首先看上圖最右邊的層級關係,經過 ViewFlipper 找到了 TextSwitcher 和ImageSwitcher 。他們有一個共同的父類 ViewAnimator ,也就是說他們確定是有關聯的,並且應該是很相近。動畫

提供的功能

既然 TextSwitcher 和 ImageSwitcher ,咱們認識,那麼咱們就小小的分析一下這兩個類。他兩提供的功能基本相同,只不過一個針對文字,一個對圖片。這兩個類自己也是很是簡單,提供的方法在左邊的目錄能夠看到,還有一些在父類裏。this

內容

由於類自己比較簡單,因此類裏面的代碼也沒有多少。 咱們看中間的代碼窗口,除了構造器剩餘的方法一目瞭然。 能夠發現,最終都是調用了 showNext() 顯示切換後的內容,而 showNext() 是由他們的共同父類 ViewAnimator 執行的,而 ViewAnimator 自己就是一個管理動畫的類。spa

也就是說,咱們今天的主角 ViewFlipper 最終應該也是調用 showNext() 來執行動畫的。 那 ViewFlipper 跟他們到底有什麼區別呢? 咱們來看下面的圖,對 ViewFlipper 的分析。code

層級關係

這個咱們以前已經看過了。cdn

提供的功能

能夠看到最左邊的目錄明顯比上面要多不少東西(其實上面兩個是有個父類幫他們分擔了,可是這個功能仍是比他多(^__^))。blog

內容

那最根本的區別究竟是什麼呢? 看中間的內容,咱們就發現,在這個類當中是有個 Handler Message 存在的。也就是說咱們能夠設置定時播放動畫,也正是基於此,該類才比上面多了一些功能。 開始、結束動畫,是否自動播放,間隔時間,都是上面的所不具有的。繼承

這樣一波看下來,咱們大概就知道了 ViewFlipper 爲何能用來實現輪播了。

那 ViewFlipper 到底該怎麼使用呢?


使用 ViewFlipper 實現輪播

嗯....... 仍是直接上代碼吧,註釋很詳細一目瞭然。

private void setViewFlipper() {
    mViewFlipper = (ViewFlipper) findViewById(R.id.flipper);

    //添加要滾動的View
    mViewFlipper.addView(getImageView(R.drawable.abcde_a));
    mViewFlipper.addView(getImageView(R.drawable.abcde_b));
    mViewFlipper.addView(getImageView(R.drawable.abcde_c));

    //設置開始和結束動畫
    mViewFlipper.setInAnimation(this, R.anim.push_up_in);
    mViewFlipper.setOutAnimation(this, R.anim.push_up_out);

    //設置間隔時間
    mViewFlipper.setFlipInterval(3000);

    //動畫的監聽
    mViewFlipper.getInAnimation().setAnimationListener(new Animation.AnimationListener() {
        @Override
        public void onAnimationStart(Animation animation) {
            //動畫開始時
        }

        @Override
        public void onAnimationEnd(Animation animation) {
            //動畫結束時
        }

        @Override
        public void onAnimationRepeat(Animation animation) {
            //重複
        }
    });

    //開始輪播
    mViewFlipper.startFlipping();
}

private ImageView getImageView(int res) {
    ImageView imageView = new ImageView(this);
    imageView.setBackgroundResource(res);
    return imageView;
}
複製代碼

有了 setInAnimation() 、 setOutAnimation(),這兩個方法的存在,咱們就能夠設置各類各樣的本身想要的動畫效果,而其他提供的方法,更是讓咱們很是方便的控制動畫。有沒有以爲很不錯呢?

你有沒有什麼好的想法? 能夠本身去動手實踐看看。


ViewFlipper 經常使用方法

setInAnimation      設置View進入屏幕時候使用的動畫
setOutAnimation     設置View退出屏幕時候使用的動畫
showPrevious        顯示ViewFlipper裏面的上一個View
showNext            顯示ViewFlipper裏面的下一個View
setFlipInterval     設置View之間切換的時間間隔
startFlipping       使用setFlipInterval方法設置的時間間隔來開始切換全部的View,切換會循環進行
stopFlipping        中止View切換
isFlipping          用來判斷View切換是否正在進行
setDisplayedChild   切換到指定子View
複製代碼

***

以前在羣裏,聽到有人問:已經有 ViewPager 了,ViewFlipper還有沒有存在的必要? 看完本篇以後,還有沒有這樣的疑問? ViewFlipper 是爲了動畫而生的,可是 ViewPager 呢?

好了,本篇就到這裏。 O(∩_∩)O

相關代碼ViewAnimation github.com/Wing-Li/And…

相關文章
相關標籤/搜索