深入瞭解ViewFlipper工作機制

來源:互聯網
上載者:User

平時我們在使用ViewFlipper的時候一方面感歎ViewFlipper的使用很簡單,另一方面,我們時常感歎ViewFlipper給我們的介面方法太少,很多常用的效果都不好做,很難施展拳腳,這篇文章將詳細介紹ViewFlipper的架構以及它的工作原理,相信看了這篇文章後你會發現ViewFlipper能展現的效果也可以很多,自己也可以根據自己的需求來定製屬於自己的ViewFlipper。
類的繼承關係圖:

由類的關係圖發現原來

其實

ViewFlipper

public void setFlipInterval(int milliseconds) {        mFlipInterval = milliseconds;    } 
 public void stopFlipping() {        mStarted = false;        updateRunning();    }
 
 private void updateRunning() {        boolean running = mVisible && mStarted && mUserPresent;        if (running != mRunning) {            if (running) {                showOnly(mWhichChild);                Message msg = mHandler.obtainMessage(FLIP_MSG);                mHandler.sendMessageDelayed(msg, mFlipInterval);            } else {                mHandler.removeMessages(FLIP_MSG);            }            mRunning = running;        }        if (LOGD) {            Log.d(TAG, "updateRunning() mVisible=" + mVisible + ", mStarted=" + mStarted                    + ", mUserPresent=" + mUserPresent + ", mRunning=" + mRunning);        }    } 

看這三個方法,我們就能知道不管是

private final Handler mHandler = new Handler() {        @Override        public void handleMessage(Message msg) {            if (msg.what == FLIP_MSG) {                if (mRunning) {                    showNext();                    msg = obtainMessage(FLIP_MSG);                    sendMessageDelayed(msg, mFlipInterval);                }            }        }    };

如果是

ViewAnimator中的主要方法:

 public void showNext() {        setDisplayedChild(mWhichChild + 1);    }


 

 public void setDisplayedChild(int whichChild) {        mWhichChild = whichChild;        if (whichChild >= getChildCount()) {            mWhichChild = 0;        } else if (whichChild < 0) {            mWhichChild = getChildCount() - 1;        }        boolean hasFocus = getFocusedChild() != null;        // This will clear old focus if we had it        showOnly(mWhichChild);        if (hasFocus) {            // Try to retake focus if we had it            requestFocus(FOCUS_FORWARD);        }    }


 

這兩個方法也就是計算出下一個

void showOnly(int childIndex) {        final int count = getChildCount();        for (int i = 0; i < count; i++) {            final View child = getChildAt(i);            final boolean checkForFirst = (!mFirstTime || mAnimateFirstTime);            if (i == childIndex) {                if (checkForFirst && mInAnimation != null) {                    child.startAnimation(mInAnimation);                }                child.setVisibility(View.VISIBLE);                mFirstTime = false;            } else {                if (checkForFirst && mOutAnimation != null && child.getVisibility() == View.VISIBLE) {                    child.startAnimation(mOutAnimation);                } else if (child.getAnimation() == mInAnimation)                    child.clearAnimation();                child.setVisibility(View.GONE);            }        }    }


 

這個方法主要的工作就是顯示

其實在

看完這個有沒有發現其實

 

今天就到這裡,下篇文章將會繼承ViewFlipper來重寫一個圖片瀏覽的組件,組件的主要功能有:1,能實現自動播放圖片;2,手指可以左右滑動瀏覽圖片;網上搜了有類似的例子,但是在手指滑動式圖片不會跟著變化,而是在手指滑動後動畫才開始。(體驗不好)組件其實已經寫好,只是今天沒時間說實現的原理,如果有需要的朋友,請留下郵箱我會發給你。

轉載請說明出處:http://blog.csdn.net/ff20081528

 

 

 

 

 

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.