歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

Android View 的刷新機制

今天學習Android VIEW的刷新機制,之前一直以為是調用VIEW的刷新就自己調用刷新函數。今天學習了一下view的刷新機制,還是表示學習到很多的知識啊。

感想就是自己要多閱讀android的源代碼,其實很多的消息傳遞等等的機制,都是通過閱讀android的源代碼得到的,所以有事沒事就去看源代碼玩吧~

好了,來到正題,關鍵的一句話就是:

在Android的布局體系中,父View負責刷新、布局顯示子View;而當子View需要刷新時,則是通知父View來完成。

步驟就是:

1、調用子View的invalidate()

2、跳轉到上一層的invalidateChild函數中區

3、在一次調用invalidateChildInParent的函數一次層層刷新

4、具體的刷新後續操作,我就不清楚了,調用invalidate最終在代碼上就在invalidateChild終止了的,所以表示有點點不清晰,求各位大牛介紹一下吧。。。。。?在此謝過了。。

讓我來閱讀源代碼:

首先在View類中:

/**
     * Invalidate the whole view. If the view is visible, {@link #onDraw} will
     * be called at some point in the future. This must be called from a
     * UI thread. To call from a non-UI thread, call {@link #postInvalidate()}.
     */
    public void invalidate() {
        if (ViewDebug.TRACE_HIERARCHY) {
            ViewDebug.trace(this, ViewDebug.HierarchyTraceType.INVALIDATE);
        }

        if ((mPrivateFlags & (DRAWN | HAS_BOUNDS)) == (DRAWN | HAS_BOUNDS)) {
            mPrivateFlags &= ~DRAWN & ~DRAWING_CACHE_VALID;

            final ViewParent p = mParent; //獲得父類View的對象
            final AttachInfo ai = mAttachInfo;//獲得匹配
            if (p != null && ai != null) {
                final Rect r = ai.mTmpInvalRect;  
                r.set(0, 0, mRight - mLeft, mBottom - mTop);//設置本View的尺寸,其實就是大小沒有設置位置

                // Don't call invalidate -- we don't want to internally scroll
                // our own bounds
                p.invalidateChild(this, r); //調用父類的刷新函數
            }
        }
    }

下面我們來到Viewgroup對象:

Copyright © Linux教程網 All Rights Reserved