2017-04-18 49 views
0

就我的理解而言,FlatViewManager會將其所有子級和自身平放爲一個名爲FlatViewGroup的視圖。但後來我發現RCTTextManager返回RCTText作爲它的影子節點,而RCTText不是虛擬節點。所以RCTTextManager將作爲viewInstance返回FlatViewGroup?並且在FlatViewGroup中會有視圖層次結構嗎?我不知道平板是什麼意思。FlatViewManager在反應原生android中的用途是什麼?

回答

2

你的理解是正確的,但是有一些你錯過了。

FlatViewGroup本身不會執行或繪製任何內容。您可以注意到,每個View實際上都是一個FlatViewGroup(文本,圖像,視圖 - 所有內容都映射到FlatViewGroup)。

但是,泛型FlatViewGroup如何繪製圖像,文本,邊框等等?事情是,它不知道任何。

它的工作方式是View,Image和Text在後臺線程中準備內容,對其進行優化並嘗試儘可能少地使用資源(Android Views)。在許多情況下,它可以將數百個元素放入一個FlatViewGroup中。

但在某些情況下,更多視圖更好。例如,它有一個元素,你變異很多,最好如果該元素被移出到它自己的視圖,以便當該元素更改時,我們只能重繪該元素。

每個FlatShadowNode中都有一個標誌,它們控制我們是否可以將元素平鋪到父項中。

因此,當FlatShadowNode確實將mMountsToView標誌設置爲true時,我們應該使用哪個View?那麼,這是ViewManager.createViewInstance()踢入的地方。

現在我可以回答你的問題。是的,RCTViewManager將爲RCTText返回FlatViewGroup,但不會爲 RCTText返回。大多數文本將將mMountsToView設置爲false,從而變爲父項。

你困惑的事情是虛擬節點vs安裝到視圖。

虛擬節點是Flexbox的事情,它表示節點不是獨立的節點,並且不能被測量。這有一個副作用,它總是與父非虛擬節點合併。這與Flat實現無關。

平面UI管理器將節點展平到一個全新的水平。它增加了這個mMountsToView標誌,控制節點是否會進一步變平。如果節點發生大量變異並導致其兄弟無緣無故重繪,則將其設置爲true。

爲了幫助你更多地理解,想象你想優化RCTText。您注意到它有時會掛載到FlatViewGroup,但由於它不能包含任何子級,因此它不一定是ViewGroup。你可以添加一個FlatView(或者甚至更專門的東西,比如FlatTextView),將FlatViewGroup的內容複製到它中,刪除所有的子級管理邏輯,修改RCTTextManager以返回你的View並且它將工作。如果你重新運行你的React,你會注意到一些文本現在正在使用你的新視圖,但只有那些將mMountsToView標誌設置爲true的文本(你可以通過例如將文本不透明度設置爲0.99來觸發它)。其餘部分將被拼合成可能仍在使用FlatViewGroup的父級。

希望有所幫助。

+0

謝謝你的耐心和優秀的解釋。我仍然有問題: *如果在開始時將mMountsToView標誌設置爲false的RCTText,相應的FlatViewGroup是否也會創建,並且除了FlatViewGroup(RCTText)從其父項開始,或者它不會在Android View樹中存在,直到該標誌設置爲true。 *假設'ReactSliderShadowNode'在RCTView中,RCTView的mMountsToView將被設置爲true或false。以及如何在flatshadow節點中繪製一個非flatshadow節點。 – York

+0

否,如果mMountsToView爲false,則不會創建FlatViewGroup。 – user2662514

+0

每當您添加需要Android視圖的節點(例如ReactSliderShadowNode)時,它都將使用NativeViewWrapper進行包裝。 ReactSliderShadowNode沒有mMountsToView標誌,所以我們需要用一個包含它的節點來包裝它。 NativeViewWrapper將mMountsToView設置爲true,並且其ViewManager將視圖創建委託給底層包裝節點。 – user2662514

相關問題