Files
react-native/ReactAndroid/src/main/java/com/facebook/react/flat
David Vacca 6b45fb2cb1 Create UIManager interface and extract common classes in uimanager/common
Reviewed By: achen1

Differential Revision: D7102674

fbshipit-source-id: e14b6782ad102ec1c3d37988df4bbd4190511f09
2018-03-01 10:33:21 -08:00
..
2018-02-08 09:47:28 -08:00
2016-12-19 16:58:30 -08:00

Nodes

Nodes is an experimental, alternate version of UIImplementation for ReactNative on Android. It has two main advantages over the existing UIImplementation:

  1. Support for overflow:visible on Android.
  2. More efficient generation of view hierarchies.

The intention is to ultimately replace the existing UIImplementation on Android with Nodes (after all the issues are ironed out).

How to test

In a subclass of ReactNativeHost, add this:

@Override
protected UIImplementationProvider getUIImplementationProvider() {
  return new FlatUIImplementationProvider();
}

How it Works

The existing UIImplementation maps all non-layout tags to Views (resulting in an almost 1:1 mapping of tags to Views, with the exception of some optimizations for layout only tags that don't draw content). Nodes, on the other hand, maps react tags to a set of DrawCommands. In other words, an <image> tag will often be mapped to a Drawable instead of an ImageView and a <text> tag will be mapped to a Layout instead of a TextView. This helps flatten the resulting View hierarchy.

There are situations where DrawCommands are promoted to Views:

  1. Existing Android components that are wrapped by React Native (for example, ViewPager, ScrollView, etc).
  2. When using a View is more optimal (for example, opacity, to avoid unnecessary invalidations).
  3. To facilitate the implementation of certain features (accessibility, transforms, etc).

This means that existing custom ViewManagers should continue to work as they did with the existing UIImplementation.

Limitations and Known Issues

  • LayoutAnimations are not yet supported
  • zIndex is not yet supported