-
Notifications
You must be signed in to change notification settings - Fork 25k
feat(android): percentage support in translate #43193
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from 11 commits
145a69d
42ebf7c
e1f6c08
e1948d9
f25cf04
4faf27e
91812cd
274ba79
f6a528c
eaee88b
55e2453
6b1a151
bf8e03b
5e70511
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -148,7 +148,7 @@ protected T prepareToRecycleView(@NonNull ThemedReactContext reactContext, T vie | |
| return view; | ||
| } | ||
|
|
||
| // Currently. onLayout listener is only attached when transform origin prop is being used. | ||
| // Currently, layout listener is only attached when transform or transformOrigin is set. | ||
| @Override | ||
| public void onLayoutChange( | ||
| View v, | ||
|
|
@@ -171,7 +171,7 @@ public void onLayoutChange( | |
| if ((currentHeight != oldHeight || currentWidth != oldWidth)) { | ||
| ReadableArray transformOrigin = (ReadableArray) v.getTag(R.id.transform_origin); | ||
| ReadableArray transformMatrix = (ReadableArray) v.getTag(R.id.transform); | ||
| if (transformMatrix != null && transformOrigin != null) { | ||
| if (transformMatrix != null || transformOrigin != null) { | ||
| setTransformProperty((T) v, transformMatrix, transformOrigin); | ||
| } | ||
| } | ||
|
|
@@ -197,18 +197,15 @@ public void setFilter(@NonNull T view, @Nullable ReadableArray filter) { | |
| public void setTransform(@NonNull T view, @Nullable ReadableArray matrix) { | ||
| view.setTag(R.id.transform, matrix); | ||
| view.setTag(R.id.invalidate_transform, true); | ||
| view.addOnLayoutChangeListener(this); | ||
|
||
| } | ||
|
|
||
| @Override | ||
| @ReactProp(name = ViewProps.TRANSFORM_ORIGIN) | ||
| public void setTransformOrigin(@NonNull T view, @Nullable ReadableArray transformOrigin) { | ||
| view.setTag(R.id.transform_origin, transformOrigin); | ||
| view.setTag(R.id.invalidate_transform, true); | ||
| if (transformOrigin != null) { | ||
| view.addOnLayoutChangeListener(this); | ||
| } else { | ||
| view.removeOnLayoutChangeListener(this); | ||
| } | ||
| view.addOnLayoutChangeListener(this); | ||
| } | ||
|
|
||
| @Override | ||
|
|
||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -103,14 +103,36 @@ public static void processTransform( | |
| MatrixMathHelper.applyScaleY(helperMatrix, transform.getDouble(transformType)); | ||
| } else if ("translate".equals(transformType)) { | ||
| ReadableArray value = transform.getArray(transformType); | ||
| double x = value.getDouble(0); | ||
| double y = value.getDouble(1); | ||
| double x = 0; | ||
| if (value.getType(0) == ReadableType.String) { | ||
| x = parsePercentageToValue(value.getString(0), viewWidth); | ||
| } else { | ||
| x = value.getDouble(0); | ||
| } | ||
| double y = 0; | ||
| if (value.getType(1) == ReadableType.String) { | ||
| y = parsePercentageToValue(value.getString(1), viewHeight); | ||
| } else { | ||
| y = value.getDouble(1); | ||
| } | ||
| double z = value.size() > 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 = parsePercentageToValue(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 = parsePercentageToValue(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,14 @@ public static void processTransform( | |
| } | ||
| } | ||
|
|
||
| private static double parsePercentageToValue(String stringValue, double dimension) { | ||
| if (stringValue.endsWith("%")) { | ||
|
||
| double percentage = Double.parseDouble(stringValue.substring(0, stringValue.length() - 1)); | ||
| return percentage * dimension / 100.0; | ||
| } else { | ||
| return Double.parseDouble(stringValue); | ||
| } | ||
| } | ||
| private static float[] getTranslateForTransformOrigin( | ||
| float viewWidth, float viewHeight, ReadableArray transformOrigin) { | ||
| if (transformOrigin == null || (viewHeight == 0 && viewWidth == 0)) { | ||
|
|
||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This isn't a matrix most of the time, right? Can we rename?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Agree, renamed to
transformssince it's an array.