private void applyLayoutRecursive(ReactShadowNode toUpdate, int x, int y) { if (!toUpdate.isLayoutOnly() && toUpdate.getNativeParent() != null) { int tag = toUpdate.getReactTag(); mUIViewOperationQueue.enqueueUpdateLayout( toUpdate.getNativeParent().getReactTag(), tag, x, y, toUpdate.getScreenWidth(), toUpdate.getScreenHeight()); return; } for (int i = 0; i < toUpdate.getChildCount(); i++) { ReactShadowNode child = toUpdate.getChildAt(i); int childTag = child.getReactTag(); if (mTagsWithLayoutVisited.get(childTag)) { continue; } mTagsWithLayoutVisited.put(childTag, true); int childX = child.getScreenX(); int childY = child.getScreenY(); childX += x; childY += y; applyLayoutRecursive(child, childX, childY); } }
private void applyLayoutBase(ReactShadowNode node) { int tag = node.getReactTag(); if (mTagsWithLayoutVisited.get(tag)) { return; } mTagsWithLayoutVisited.put(tag, true); ReactShadowNode parent = node.getParent(); // We use screenX/screenY (which round to integer pixels) at each node in the hierarchy to // emulate what the layout would look like if it were actually built with native views which // have to have integral top/left/bottom/right values int x = node.getScreenX(); int y = node.getScreenY(); while (parent != null && parent.isLayoutOnly()) { // TODO(7854667): handle and test proper clipping x += Math.round(parent.getLayoutX()); y += Math.round(parent.getLayoutY()); parent = parent.getParent(); } applyLayoutRecursive(node, x, y); }