歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Android View 的刷新機制

Android View 的刷新機制

日期:2017/3/1 10:17:16   编辑:Linux編程

今天學習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