diff --git a/ReactAndroid/src/main/java/com/facebook/react/uimanager/ReactShadowNode.java b/ReactAndroid/src/main/java/com/facebook/react/uimanager/ReactShadowNode.java index 73134194f..bbf33b7b2 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/uimanager/ReactShadowNode.java +++ b/ReactAndroid/src/main/java/com/facebook/react/uimanager/ReactShadowNode.java @@ -18,6 +18,7 @@ import com.facebook.csslayout.CSSNode; import com.facebook.infer.annotation.Assertions; import com.facebook.react.bridge.ReadableMap; import com.facebook.react.bridge.ReadableMapKeySetIterator; +import com.facebook.react.uimanager.events.EventDispatcher; /** * Base node class for representing virtual tree of React nodes. Shadow nodes are used primarily @@ -202,18 +203,37 @@ public class ReactShadowNode extends CSSNode { float absoluteX, float absoluteY, UIViewOperationQueue uiViewOperationQueue, - NativeViewHierarchyOptimizer nativeViewHierarchyOptimizer) { + NativeViewHierarchyOptimizer nativeViewHierarchyOptimizer, + EventDispatcher eventDispatcher) { if (mNodeUpdated) { onCollectExtraUpdates(uiViewOperationQueue); } if (hasNewLayout()) { - mAbsoluteLeft = Math.round(absoluteX + getLayoutX()); - mAbsoluteTop = Math.round(absoluteY + getLayoutY()); - mAbsoluteRight = Math.round(absoluteX + getLayoutX() + getLayoutWidth()); - mAbsoluteBottom = Math.round(absoluteY + getLayoutY() + getLayoutHeight()); + float absoluteLeft = Math.round(absoluteX + getLayoutX()); + float absoluteTop = Math.round(absoluteY + getLayoutY()); + float absoluteRight = Math.round(absoluteX + getLayoutX() + getLayoutWidth()); + float absoluteBottom = Math.round(absoluteY + getLayoutY() + getLayoutHeight()); + // If the layout didn't change this should calculate exactly same values, it's fine to compare + // floats with "==" in this case + if (absoluteLeft != mAbsoluteLeft || absoluteTop != mAbsoluteTop || + absoluteRight != mAbsoluteRight || absoluteBottom != mAbsoluteBottom) { + mAbsoluteLeft = absoluteLeft; + mAbsoluteTop = absoluteTop; + mAbsoluteRight = absoluteRight; + mAbsoluteBottom = absoluteBottom; - nativeViewHierarchyOptimizer.handleUpdateLayout(this); + nativeViewHierarchyOptimizer.handleUpdateLayout(this); + if (mShouldNotifyOnLayout) { + eventDispatcher.dispatchEvent( + OnLayoutEvent.obtain( + getReactTag(), + getScreenX(), + getScreenY(), + getScreenWidth(), + getScreenHeight())); + } + } } } @@ -264,10 +284,6 @@ public class ReactShadowNode extends CSSNode { mShouldNotifyOnLayout = shouldNotifyOnLayout; } - /* package */ boolean shouldNotifyOnLayout() { - return mShouldNotifyOnLayout; - } - /** * Adds a child that the native view hierarchy will have at this index in the native view * corresponding to this node. diff --git a/ReactAndroid/src/main/java/com/facebook/react/uimanager/UIManagerModule.java b/ReactAndroid/src/main/java/com/facebook/react/uimanager/UIManagerModule.java index b0d61f61f..a1d498e1c 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/uimanager/UIManagerModule.java +++ b/ReactAndroid/src/main/java/com/facebook/react/uimanager/UIManagerModule.java @@ -814,18 +814,8 @@ public class UIManagerModule extends ReactContextBaseJavaModule implements absoluteX, absoluteY, mOperationsQueue, - mNativeViewHierarchyOptimizer); - - // notify JS about layout event if requested - if (cssNode.shouldNotifyOnLayout()) { - mEventDispatcher.dispatchEvent( - OnLayoutEvent.obtain( - tag, - cssNode.getScreenX(), - cssNode.getScreenY(), - cssNode.getScreenWidth(), - cssNode.getScreenHeight())); - } + mNativeViewHierarchyOptimizer, + mEventDispatcher); } cssNode.markUpdateSeen(); }