package androidx.transition; import android.annotation.SuppressLint; import android.graphics.Matrix; import android.graphics.drawable.Drawable; import android.os.Build; import android.widget.ImageView; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.annotation.RequiresApi; import java.lang.reflect.Field; public class ImageViewUtils { private static Field sDrawMatrixField = null; private static boolean sDrawMatrixFieldFetched = false; private static boolean sTryHiddenAnimateTransform = true; private ImageViewUtils() { } public static void animateTransform(@NonNull ImageView imageView, @Nullable Matrix matrix) { if (Build.VERSION.SDK_INT >= 29) { imageView.animateTransform(matrix); } else if (matrix == null) { Drawable drawable = imageView.getDrawable(); if (drawable != null) { drawable.setBounds(0, 0, (imageView.getWidth() - imageView.getPaddingLeft()) - imageView.getPaddingRight(), (imageView.getHeight() - imageView.getPaddingTop()) - imageView.getPaddingBottom()); imageView.invalidate(); } } else { hiddenAnimateTransform(imageView, matrix); } } private static void fetchDrawMatrixField() { if (!sDrawMatrixFieldFetched) { try { Field declaredField = ImageView.class.getDeclaredField("mDrawMatrix"); sDrawMatrixField = declaredField; declaredField.setAccessible(true); } catch (NoSuchFieldException unused) { } sDrawMatrixFieldFetched = true; } } @RequiresApi(21) @SuppressLint({"NewApi"}) private static void hiddenAnimateTransform(@NonNull ImageView imageView, @Nullable Matrix matrix) { if (sTryHiddenAnimateTransform) { try { imageView.animateTransform(matrix); } catch (NoSuchMethodError unused) { sTryHiddenAnimateTransform = false; } } } }