From e76f475f180db334aafa529bfe030e40cddefea3 Mon Sep 17 00:00:00 2001 From: Oskar Eichler <62393985+OskarEichler@users.noreply.github.com> Date: Fri, 28 Aug 2026 03:25:15 +0300 Subject: [PATCH] perf(android): avoid redundant traversal and transform allocations --- .../greweb/reactnativeviewshot/ViewShot.java | 54 ++++++------------- 1 file changed, 16 insertions(+), 38 deletions(-) diff --git a/android/src/main/java/fr/greweb/reactnativeviewshot/ViewShot.java b/android/src/main/java/fr/greweb/reactnativeviewshot/ViewShot.java index bd309a6a..87516bdb 100644 --- a/android/src/main/java/fr/greweb/reactnativeviewshot/ViewShot.java +++ b/android/src/main/java/fr/greweb/reactnativeviewshot/ViewShot.java @@ -4,7 +4,6 @@ import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.Color; -import android.graphics.Matrix; import android.graphics.Paint; import android.graphics.Point; import android.net.Uri; @@ -41,7 +40,6 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; -import java.util.LinkedList; import java.util.List; import java.util.Locale; import java.util.Set; @@ -511,24 +509,20 @@ public void run() { @NonNull static List getAllChildren(@NonNull final View v) { - if (!(v instanceof ViewGroup)) { - final ArrayList viewArrayList = new ArrayList<>(); - viewArrayList.add(v); - - return viewArrayList; - } - final ArrayList result = new ArrayList<>(); + collectChildren(v, result); + return result; + } - ViewGroup viewGroup = (ViewGroup) v; - for (int i = 0; i < viewGroup.getChildCount(); i++) { - View child = viewGroup.getChildAt(i); - - //Do not add any parents, just add child elements - result.addAll(getAllChildren(child)); + private static void collectChildren(@NonNull final View v, @NonNull final List result) { + if (!(v instanceof ViewGroup)) { + result.add(v); + } else { + final ViewGroup group = (ViewGroup) v; + for (int i = 0; i < group.getChildCount(); i++) { + collectChildren(group.getChildAt(i), result); + } } - - return result; } /** @@ -860,7 +854,7 @@ public void onPixelCopyFinished(int copyResult) { */ @NonNull static List walkAncestors(@NonNull final View child, @NonNull final View root) { - final LinkedList ms = new LinkedList<>(); + final List ms = new ArrayList<>(); if (child == root) { return ms; } @@ -876,21 +870,11 @@ static List walkAncestors(@NonNull final View child, @NonNull final View r /** * Concat all the transformation matrix's from parent to child. */ - @NonNull - @SuppressWarnings("UnusedReturnValue") - private Matrix applyTransformations(final Canvas c, @NonNull final View root, @NonNull final View child) { - final Matrix transform = new Matrix(); - final LinkedList ms = new LinkedList<>(walkAncestors(child, root)); - if (ms.isEmpty()) { - return transform; - } - + private void applyTransformations(final Canvas c, @NonNull final View root, @NonNull final View child) { + final List ms = walkAncestors(child, root); // apply transformations from parent --> child order - Collections.reverse(ms); - - for (final View v : ms) { - c.save(); - + for (int i = ms.size() - 1; i >= 0; i--) { + final View v = ms.get(i); // apply each view transformations, so each child will be affected by them final float dx = v.getLeft() + ((v != child) ? v.getPaddingLeft() : 0) + v.getTranslationX(); final float dy = v.getTop() + ((v != child) ? v.getPaddingTop() : 0) + v.getTranslationY(); @@ -898,13 +882,7 @@ private Matrix applyTransformations(final Canvas c, @NonNull final View root, @N c.rotate(v.getRotation(), v.getPivotX(), v.getPivotY()); c.scale(v.getScaleX(), v.getScaleY()); - // compute the matrix just for any future use - transform.postTranslate(dx, dy); - transform.postRotate(v.getRotation(), v.getPivotX(), v.getPivotY()); - transform.postScale(v.getScaleX(), v.getScaleY()); } - - return transform; } @SuppressWarnings("unchecked")