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 4a68601a1..520ced417 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/uimanager/ReactShadowNode.java +++ b/ReactAndroid/src/main/java/com/facebook/react/uimanager/ReactShadowNode.java @@ -237,7 +237,10 @@ public class ReactShadowNode extends CSSNodeDEPRECATED { public void onCollectExtraUpdates(UIViewOperationQueue uiViewOperationQueue) { } - /* package */ void dispatchUpdates( + /** + * @return true if layout (position or dimensions) changed, false otherwise. + */ + /* package */ boolean dispatchUpdates( float absoluteX, float absoluteY, UIViewOperationQueue uiViewOperationQueue, @@ -247,12 +250,27 @@ public class ReactShadowNode extends CSSNodeDEPRECATED { } 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 newLeft = Math.round(absoluteX + getLayoutX()); + float newTop = Math.round(absoluteY + getLayoutY()); + float newRight = Math.round(absoluteX + getLayoutX() + getLayoutWidth()); + float newBottom = Math.round(absoluteY + getLayoutY() + getLayoutHeight()); + + if (newLeft == mAbsoluteLeft && + newRight == mAbsoluteRight && + newTop == mAbsoluteTop && + newBottom == mAbsoluteBottom) { + return false; + } + + mAbsoluteLeft = newLeft; + mAbsoluteTop = newTop; + mAbsoluteRight = newRight; + mAbsoluteBottom = newBottom; nativeViewHierarchyOptimizer.handleUpdateLayout(this); + return true; + } else { + return false; } } diff --git a/ReactAndroid/src/main/java/com/facebook/react/uimanager/UIImplementation.java b/ReactAndroid/src/main/java/com/facebook/react/uimanager/UIImplementation.java index 3ab74e8e0..d43391eed 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/uimanager/UIImplementation.java +++ b/ReactAndroid/src/main/java/com/facebook/react/uimanager/UIImplementation.java @@ -789,14 +789,16 @@ public class UIImplementation { int tag = cssNode.getReactTag(); if (!mShadowNodeRegistry.isRootNode(tag)) { - cssNode.dispatchUpdates( + boolean frameDidChange = cssNode.dispatchUpdates( absoluteX, absoluteY, mOperationsQueue, mNativeViewHierarchyOptimizer); - // notify JS about layout event if requested - if (cssNode.shouldNotifyOnLayout()) { + // Notify JS about layout event if requested + // and if the position or dimensions actually changed + // (consistent with iOS). + if (frameDidChange && cssNode.shouldNotifyOnLayout()) { mEventDispatcher.dispatchEvent( OnLayoutEvent.obtain( tag,