平時我們在使用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