Permalink
Browse files

Android shouldn't dispatch onLayout if frame didn't change

Summary:
Fixes [#7202 Android Redundant onLayout event](#7202)
Closes #7250

Differential Revision: D4104066

Pulled By: mkonicek

fbshipit-source-id: 383efdb4b4881aa7d7e508d61c9c01165bcf7bb6
  • Loading branch information...
1 parent 9833e1b commit d4b8ae7a8a3de314b5813e0bfcdf5fb265129d43 @hayeah hayeah committed with Facebook Github Bot Oct 31, 2016
@@ -237,7 +237,10 @@ public void onAfterUpdateTransaction() {
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 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;
}
}
@@ -789,14 +789,16 @@ 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()) {
+ // 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,

1 comment on commit d4b8ae7

@mkonicek
Contributor
mkonicek commented on d4b8ae7 Dec 5, 2016 edited

@hayeah Looks like this introduced another bug and was partially reverted, see issue #11096, revert: #11222

Please sign in to comment.