2017-04-18 12 views
0

私の理解では、FlatViewManagerはFlatViewGroupという単一のビューとしてすべての子とフラットをフラットにします。しかし、私は、RCTTextManagerがそのシャドウ・ノードとしてRCTTextを返し、RCTTextが仮想ノードではないことを発見しました。 RCTTextManagerは、そのviewInstanceとしてFlatViewGroupを返しますか? FlatViewGroupにはビュー階層がありますか?私はの意味が何であるか分かりませんです。ネイティブのアンドロイドに反応するFlatViewManagerの目的は何ですか?

答えて

2

あなたの理解は間違いありませんが、欠落しているものがあります。

FlatViewGroupは単独で何も実行したり描画したりしません。すべてのビューは実際にはFlatViewGroup(テキスト、イメージ、ビュー - すべてがFlatViewGroupにマップされています)であることがわかります。

しかし、一般的なFlatViewGroupは、画像、テキスト、枠線などをどのように描画できますか?何か、それについては分かりません。

View、Image、Textはバックグラウンドスレッドでコンテンツを準備し、最適化し、可能な限り小さなリソース(Androidビュー)を使用しようとします。多くの場合、単一のFlatViewGroupに数百の要素を収めることができます。

しかし、いくつかのケースでは、より多くのビューが優れています。たとえば、要素が多数変更されている場合、その要素が独自のビューに移動され、その要素が変更されたときにその要素のみを再描画できるようにするのが最適です。

すべてのFlatShadowNodeに、要素を親にフラット化できるかどうかを制御するmMountsToViewを呼び出すフラグがあります。

したがって、FlatShadowNodeのmMountsToViewフラグがtrueに設定されている場合、どのViewを使用する必要がありますか?これは、ViewManager.createViewInstance()が起動する場所です。

ここで質問に答えることができます。はい、RCTViewManagerは、RCTTextの場合はFlatViewGroupを返しますが、の場合はすべて RCTTextでは返しません。ほとんどのテキストはmMountsToViewをfalseに設定し、親にフラット化されます。

あなたが混乱しているのは、仮想ノードとビューのマウントです。

仮想ノードはフレックスボックスのことであり、ノードが独立したものではなく、測定できないことを意味します。これには、親以外のノードと常にマージされるという副作用があります。これは、フラット実装に関係なく行われます。

フラットUIマネージャは、ノードの平坦化をまったく新しいレベルに引き上げます。ノードがさらに平坦化されるかどうかを制御するこのmMountsToViewフラグを追加します。ノードが多量に突然変異して、兄弟が何の理由もなく再描画された場合はtrueに設定します。

もう少し理解しやすくするために、RCTTextを最適化したいと考えてください。 FlatViewGroupにマウントされることがあることに気が付きましたが、子を含むことはできないため、ViewGroupである必要はありません。 FlatView(またはFlatTextViewのようなもっと特殊化されたもの)を追加し、FlatViewGroupの内容をその中にコピーし、すべての子管理ロジックを削除し、RCTTextManagerを変更してビューを返すことができます。 Reactを再実行すると、いくつかのテキストが新しいビューを使用していますが、mMountsToViewフラグがtrueに設定されているテキストだけが表示されます(テキスト不透明度を0.99に設定するなど)。残りはFlatViewGroupを使用している可能性が高い親にフラット化されます。

希望に役立ちます。

+0

患者と優れた説明をいただきありがとうございます。 *最初にmMountsToViewフラグがfalseに設定されたRCTTextは、対応するFlatViewGroupも作成され、FlatViewGroup(RCTText)は 'onDraw()'を受け取らないことを除いてRCTTextのすべてのスタイルとコンテンツを持ちます。その親からまたはそれがtrueに設定されるまで、アンドロイドのビューツリーでexsitしません。 * 'ReactSliderShadowNode'がRCTViewの内部にあると仮定すると、RCTViewのmMountsToViewはtrueまたはfalseに設定されます。 flatshadowNodeの中にnon-flatshadowNodeを描画する方法。 – York

+0

mMountsToViewがfalseの場合、FlatViewGroupは作成されません。 – user2662514

+0

Androidビューが必要なノード(ReactSliderShadowNodeなど)を追加すると、常にNativeViewWrapperでラップされます。 ReactSliderShadowNodeはmMountsToViewフラグを持っていないので、それを持っているノードでそれをラップする必要があります。 NativeViewWrapperはmMountsToViewをtrueに設定し、そのViewManagerはビューの作成を基になるラップされたノードに委譲します。 – user2662514

関連する問題