From a87096d3eee6d80940384bcf88e08dea861d1b4f Mon Sep 17 00:00:00 2001 From: Mikael Sand Date: Thu, 11 Oct 2018 04:19:12 +0300 Subject: [PATCH] Implement useNativeDriver support for animation of some text properties --- .../horcrux/svg/RenderableViewManager.java | 14 +++++- .../java/com/horcrux/svg/TextShadowNode.java | 44 +++++++++++++++++-- ios/ViewManagers/RNSVGTextManager.m | 25 ++++++++++- 3 files changed, 75 insertions(+), 8 deletions(-) diff --git a/android/src/main/java/com/horcrux/svg/RenderableViewManager.java b/android/src/main/java/com/horcrux/svg/RenderableViewManager.java index bee3e761..8e06f6b5 100644 --- a/android/src/main/java/com/horcrux/svg/RenderableViewManager.java +++ b/android/src/main/java/com/horcrux/svg/RenderableViewManager.java @@ -112,12 +112,12 @@ class RenderableViewManager extends ViewGroupManager node, @Nullable ReadableArray positionX) { + public void setPositionX(RenderableView node, Dynamic positionX) { node.shadowNode.setPositionX(positionX); } @ReactProp(name = "positionY") - public void setPositionY(RenderableView node, @Nullable ReadableArray positionY) { + public void setPositionY(RenderableView node, Dynamic positionY) { node.shadowNode.setPositionY(positionY); } @@ -135,6 +135,16 @@ class RenderableViewManager extends ViewGroupManager node, @Nullable String content) { node.shadowNode.setContent(content); } + + @ReactProp(name = "positionX") + public void setPositionX(RenderableView node, Dynamic positionX) { + node.shadowNode.setPositionX(positionX); + } + + @ReactProp(name = "positionY") + public void setPositionY(RenderableView node, Dynamic positionY) { + node.shadowNode.setPositionY(positionY); + } }; } diff --git a/android/src/main/java/com/horcrux/svg/TextShadowNode.java b/android/src/main/java/com/horcrux/svg/TextShadowNode.java index f3ab4df3..91947c47 100644 --- a/android/src/main/java/com/horcrux/svg/TextShadowNode.java +++ b/android/src/main/java/com/horcrux/svg/TextShadowNode.java @@ -14,6 +14,8 @@ import android.graphics.Paint; import android.graphics.Path; import android.graphics.Region; +import com.facebook.react.bridge.Dynamic; +import com.facebook.react.bridge.JavaOnlyArray; import com.facebook.react.bridge.ReadableArray; import com.facebook.react.bridge.ReadableMap; import com.facebook.react.uimanager.ReactShadowNode; @@ -107,14 +109,48 @@ class TextShadowNode extends GroupShadowNode { } @ReactProp(name = "positionX") - public void setPositionX(@Nullable ReadableArray positionX) { - mPositionX = positionX; + public void setPositionX(Dynamic positionX) { + if (positionX.isNull()) { + mPositionX = null; + } else { + switch (positionX.getType()) { + case Array: { + mPositionX = positionX.asArray(); + break; + } + case String: { + mPositionX = JavaOnlyArray.of(positionX.asString()); + break; + } + case Number: { + mPositionX = JavaOnlyArray.of(String.valueOf(positionX.asDouble())); + break; + } + } + } markUpdated(); } @ReactProp(name = "positionY") - public void setPositionY(@Nullable ReadableArray positionY) { - mPositionY = positionY; + public void setPositionY(Dynamic positionY) { + if (positionY.isNull()) { + mPositionY = null; + } else { + switch (positionY.getType()) { + case Array: { + mPositionY = positionY.asArray(); + break; + } + case String: { + mPositionY = JavaOnlyArray.of(positionY.asString()); + break; + } + case Number: { + mPositionY = JavaOnlyArray.of(String.valueOf(positionY.asDouble())); + break; + } + } + } markUpdated(); } diff --git a/ios/ViewManagers/RNSVGTextManager.m b/ios/ViewManagers/RNSVGTextManager.m index fc154993..88e78f57 100644 --- a/ios/ViewManagers/RNSVGTextManager.m +++ b/ios/ViewManagers/RNSVGTextManager.m @@ -23,8 +23,29 @@ RCT_EXPORT_MODULE() RCT_EXPORT_VIEW_PROPERTY(textAnchor, RNSVGTextAnchor) RCT_EXPORT_VIEW_PROPERTY(deltaX, NSArray) RCT_EXPORT_VIEW_PROPERTY(deltaY, NSArray) -RCT_EXPORT_VIEW_PROPERTY(positionX, NSArray) -RCT_EXPORT_VIEW_PROPERTY(positionY, NSArray) +RCT_CUSTOM_VIEW_PROPERTY(positionX, id, RNSVGText) +{ + if ([json isKindOfClass:[NSArray class]]) { + NSArray *arrayValue = (NSArray *)json; + view.positionX = arrayValue; + } else if ([json isKindOfClass:[NSString class]]) { + view.positionX = [NSArray arrayWithObject:json]; + } else if ([json isKindOfClass:[NSNumber class]]) { + view.positionX = [NSArray arrayWithObject:[NSString stringWithFormat:@"%f", [json floatValue]]]; + } +} + +RCT_CUSTOM_VIEW_PROPERTY(positionY, id, RNSVGText) +{ + if ([json isKindOfClass:[NSArray class]]) { + NSArray *arrayValue = (NSArray *)json; + view.positionY = arrayValue; + } else if ([json isKindOfClass:[NSString class]]) { + view.positionY = [NSArray arrayWithObject:json]; + } else if ([json isKindOfClass:[NSNumber class]]) { + view.positionY = [NSArray arrayWithObject:[NSString stringWithFormat:@"%f", [json floatValue]]]; + } +} RCT_EXPORT_VIEW_PROPERTY(rotate, NSArray) RCT_EXPORT_VIEW_PROPERTY(font, NSDictionary) RCT_EXPORT_VIEW_PROPERTY(textLength, NSString)