From 61da183c59b6b1e3a9e521c0793be2a87f9c536e Mon Sep 17 00:00:00 2001 From: Howard Yeh Date: Tue, 26 Apr 2016 21:49:26 -0700 Subject: [PATCH] Android shouldn't dispatch onLayout if frame didn't change --- .../react/uimanager/ReactShadowNode.java | 25 +++++++++++++++---- .../react/uimanager/UIImplementation.java | 4 +-- 2 files changed, 22 insertions(+), 7 deletions(-) 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 df8ad675d294..b3089d1e0ed1 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/uimanager/ReactShadowNode.java +++ b/ReactAndroid/src/main/java/com/facebook/react/uimanager/ReactShadowNode.java @@ -191,7 +191,7 @@ public void onAfterUpdateTransaction() { public void onCollectExtraUpdates(UIViewOperationQueue uiViewOperationQueue) { } - /* package */ void dispatchUpdates( + /* package */ boolean dispatchUpdates( float absoluteX, float absoluteY, UIViewOperationQueue uiViewOperationQueue, @@ -201,12 +201,27 @@ public void onCollectExtraUpdates(UIViewOperationQueue 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 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 20df2a161eb4..a8335a924a9d 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/uimanager/UIImplementation.java +++ b/ReactAndroid/src/main/java/com/facebook/react/uimanager/UIImplementation.java @@ -755,14 +755,14 @@ protected void applyUpdatesRecursive( 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()) { + if (frameDidChange && cssNode.shouldNotifyOnLayout()) { eventDispatcher.dispatchEvent( OnLayoutEvent.obtain( tag,