Only send layout update operation to nativehierarchymanager when layout actually changes.

Reviewed By: andreicoman11

Differential Revision: D2679408

fb-gh-sync-id: 7f0a972e9e12f70402e2d285edef458a61ca1c39
This commit is contained in:
Krzysztof Magiera 2015-11-20 07:54:43 -08:00 committed by facebook-github-bot-9
parent 06e514076b
commit 0c8850f3a7
2 changed files with 28 additions and 22 deletions

View File

@ -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.

View File

@ -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();
}