diff --git a/android/src/main/java/com/swmansion/rnscreens/ScreenContainer.java b/android/src/main/java/com/swmansion/rnscreens/ScreenContainer.java index 216ee120..bf2a0ba5 100644 --- a/android/src/main/java/com/swmansion/rnscreens/ScreenContainer.java +++ b/android/src/main/java/com/swmansion/rnscreens/ScreenContainer.java @@ -33,6 +33,7 @@ public class ScreenContainer extends ViewGroup { private boolean mIsTransitioning; private boolean mLayoutEnqueued = false; + private final ChoreographerCompat.FrameCallback mFrameCallback = new ChoreographerCompat.FrameCallback() { @Override public void doFrame(long frameTimeNanos) { @@ -40,9 +41,9 @@ public class ScreenContainer extends ViewGroup { } }; - private final Runnable mLayoutRunnable = new Runnable() { + private final ChoreographerCompat.FrameCallback mLayoutCallback = new ChoreographerCompat.FrameCallback() { @Override - public void run() { + public void doFrame(long frameTimeNanos) { mLayoutEnqueued = false; measure( MeasureSpec.makeMeasureSpec(getWidth(), MeasureSpec.EXACTLY), @@ -66,9 +67,13 @@ public class ScreenContainer extends ViewGroup { public void requestLayout() { super.requestLayout(); - if (!mLayoutEnqueued) { + if (!mLayoutEnqueued && mLayoutCallback != null) { mLayoutEnqueued = true; - post(mLayoutRunnable); + // we use NATIVE_ANIMATED_MODULE choreographer queue because it allows us to catch the current + // looper loop instead of enqueueing the update in the next loop causing a one frame delay. + ReactChoreographer.getInstance().postFrameCallback( + ReactChoreographer.CallbackType.NATIVE_ANIMATED_MODULE, + mLayoutCallback); } } diff --git a/android/src/main/java/com/swmansion/rnscreens/ScreenStackHeaderSubview.java b/android/src/main/java/com/swmansion/rnscreens/ScreenStackHeaderSubview.java index 0a0c9e09..36937d24 100644 --- a/android/src/main/java/com/swmansion/rnscreens/ScreenStackHeaderSubview.java +++ b/android/src/main/java/com/swmansion/rnscreens/ScreenStackHeaderSubview.java @@ -43,18 +43,15 @@ public class ScreenStackHeaderSubview extends ReactViewGroup { @Override protected void onLayout(boolean changed, int left, int top, int right, int bottom) { - if (changed && (mType == Type.CENTER || mType == Type.TITLE)) { + if (changed && (mType == Type.CENTER)) { + // if we want the view to be centered we need to account for the fact that right and left + // paddings may not be equal. Measurements measurements = new Measurements(); - measurements.width = right - left; - if (mType == Type.CENTER) { - // if we want the view to be centered we need to account for the fact that right and left - // paddings may not be equal. - View parent = (View) getParent(); - int parentWidth = parent.getWidth(); - int rightPadding = parentWidth - right; - int leftPadding = left; - measurements.width = Math.max(0, parentWidth - 2 * Math.max(rightPadding, leftPadding)); - } + View parent = (View) getParent(); + int parentWidth = parent.getWidth(); + int rightPadding = parentWidth - right; + int leftPadding = left; + measurements.width = Math.max(0, parentWidth - 2 * Math.max(rightPadding, leftPadding)); measurements.height = bottom - top; mUIManager.setViewLocalData(getId(), measurements); }