diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/uimanager/BaseViewManager.java b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/uimanager/BaseViewManager.java index 4a28227d5ce..4012c71fe19 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/uimanager/BaseViewManager.java +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/uimanager/BaseViewManager.java @@ -148,7 +148,7 @@ public abstract class BaseViewManager 2 ? value.getDouble(2) : 0d; MatrixMathHelper.applyTranslate3D(helperMatrix, x, y, z); } else if ("translateX".equals(transformType)) { - MatrixMathHelper.applyTranslate2D(helperMatrix, transform.getDouble(transformType), 0d); + double translateValue = 0; + if (transform.getType(transformType) == ReadableType.String) { + translateValue = parseTranslateValue(transform.getString(transformType), viewWidth); + } else { + translateValue = transform.getDouble(transformType); + } + MatrixMathHelper.applyTranslate2D(helperMatrix, translateValue, 0d); } else if ("translateY".equals(transformType)) { - MatrixMathHelper.applyTranslate2D(helperMatrix, 0d, transform.getDouble(transformType)); + double translateValue = 0; + if (transform.getType(transformType) == ReadableType.String) { + translateValue = parseTranslateValue(transform.getString(transformType), viewHeight); + } else { + translateValue = transform.getDouble(transformType); + } + MatrixMathHelper.applyTranslate2D(helperMatrix, 0d, translateValue); } else if ("skewX".equals(transformType)) { MatrixMathHelper.applySkewX(helperMatrix, convertToRadians(transform, transformType)); } else if ("skewY".equals(transformType)) { @@ -130,6 +152,20 @@ public class TransformHelper { } } + private static double parseTranslateValue(String stringValue, double dimension) { + try { + if (stringValue.endsWith("%")) { + double percentage = Double.parseDouble(stringValue.substring(0, stringValue.length() - 1)); + return percentage * dimension / 100.0; + } else { + return Double.parseDouble(stringValue); + } + } catch (NumberFormatException e) { + FLog.w(ReactConstants.TAG, "Invalid translate value: " + stringValue); + } + return 0; + } + private static float[] getTranslateForTransformOrigin( float viewWidth, float viewHeight, ReadableArray transformOrigin) { if (transformOrigin == null || (viewHeight == 0 && viewWidth == 0)) {