mirror of
https://github.com/zoriya/react-native-svg.git
synced 2026-05-29 21:25:00 +00:00
Support native animation of fill and stroke
This commit is contained in:
@@ -17,8 +17,12 @@ import android.graphics.RectF;
|
||||
import android.graphics.Region;
|
||||
|
||||
import com.facebook.react.bridge.Arguments;
|
||||
import com.facebook.react.bridge.Dynamic;
|
||||
import com.facebook.react.bridge.JSApplicationIllegalArgumentException;
|
||||
import com.facebook.react.bridge.JavaOnlyArray;
|
||||
import com.facebook.react.bridge.ReadableArray;
|
||||
import com.facebook.react.bridge.ReadableMap;
|
||||
import com.facebook.react.bridge.ReadableType;
|
||||
import com.facebook.react.bridge.WritableArray;
|
||||
import com.facebook.react.uimanager.annotations.ReactProp;
|
||||
|
||||
@@ -70,9 +74,24 @@ abstract public class RenderableShadowNode extends VirtualNode {
|
||||
protected @Nullable ReadableArray mPropList;
|
||||
protected @Nullable WritableArray mAttributeList;
|
||||
|
||||
static final Pattern regex = Pattern.compile("[0-9.-]+");
|
||||
|
||||
@ReactProp(name = "fill")
|
||||
public void setFill(@Nullable ReadableArray fill) {
|
||||
mFill = fill;
|
||||
public void setFill(@Nullable Dynamic fill) {
|
||||
ReadableType type = fill.getType();
|
||||
if (type.equals(ReadableType.Array)) {
|
||||
mFill = fill.asArray();
|
||||
} else {
|
||||
JavaOnlyArray arr = new JavaOnlyArray();
|
||||
arr.pushInt(0);
|
||||
Matcher m = regex.matcher(fill.asString());
|
||||
int i = 0;
|
||||
while (m.find()) {
|
||||
Double parsed = Double.parseDouble(m.group());
|
||||
arr.pushDouble(i++ < 3 ? parsed / 255 : parsed);
|
||||
}
|
||||
mFill = arr;
|
||||
}
|
||||
markUpdated();
|
||||
}
|
||||
|
||||
@@ -99,8 +118,20 @@ abstract public class RenderableShadowNode extends VirtualNode {
|
||||
}
|
||||
|
||||
@ReactProp(name = "stroke")
|
||||
public void setStroke(@Nullable ReadableArray strokeColors) {
|
||||
mStroke = strokeColors;
|
||||
public void setStroke(@Nullable Dynamic strokeColors) {
|
||||
ReadableType type = strokeColors.getType();
|
||||
if (type.equals(ReadableType.Array)) {
|
||||
mStroke = strokeColors.asArray();
|
||||
} else {
|
||||
JavaOnlyArray arr = new JavaOnlyArray();
|
||||
arr.pushInt(0);
|
||||
Matcher m = regex.matcher(strokeColors.asString());
|
||||
while (m.find()) {
|
||||
Double parsed = Double.parseDouble(m.group());
|
||||
arr.pushDouble(parsed);
|
||||
}
|
||||
mStroke = arr;
|
||||
}
|
||||
markUpdated();
|
||||
}
|
||||
|
||||
|
||||
@@ -4,21 +4,21 @@ import android.view.ViewGroup;
|
||||
|
||||
import com.facebook.react.bridge.ReactContext;
|
||||
|
||||
public class RenderableView extends ViewGroup {
|
||||
VirtualNode shadowNode;
|
||||
public class RenderableView<T extends VirtualNode> extends ViewGroup {
|
||||
public T shadowNode;
|
||||
|
||||
public RenderableView(ReactContext reactContext) {
|
||||
super(reactContext);
|
||||
}
|
||||
|
||||
VirtualNode getShadowNode() {
|
||||
T getShadowNode() {
|
||||
return shadowNode;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setId(int id) {
|
||||
super.setId(id);
|
||||
shadowNode = RenderableViewManager.getShadowNodeByTag(id);
|
||||
shadowNode = (T) RenderableViewManager.getShadowNodeByTag(id);
|
||||
}
|
||||
|
||||
void dropView() {
|
||||
|
||||
@@ -12,6 +12,7 @@ package com.horcrux.svg;
|
||||
import android.graphics.Bitmap;
|
||||
import android.util.SparseArray;
|
||||
|
||||
import com.facebook.react.bridge.Dynamic;
|
||||
import com.facebook.react.bridge.ReadableArray;
|
||||
import com.facebook.react.bridge.ReadableMap;
|
||||
import com.facebook.react.uimanager.LayoutShadowNode;
|
||||
@@ -30,7 +31,7 @@ import static com.horcrux.svg.RenderableShadowNode.JOIN_ROUND;
|
||||
* into native views and don't need any logic (all the logic is in {@link SvgView}), this
|
||||
* "stubbed" ViewManager is used for all of them.
|
||||
*/
|
||||
class RenderableViewManager extends ViewGroupManager<RenderableView> {
|
||||
class RenderableViewManager<T extends VirtualNode> extends ViewGroupManager<RenderableView<T>> {
|
||||
|
||||
/* package */ private static final String CLASS_GROUP = "RNSVGGroup";
|
||||
/* package */ private static final String CLASS_PATH = "RNSVGPath";
|
||||
@@ -52,275 +53,275 @@ class RenderableViewManager extends ViewGroupManager<RenderableView> {
|
||||
private final String mClassName;
|
||||
|
||||
|
||||
static RenderableViewManager createGroupViewManager() {
|
||||
return new RenderableViewManager(CLASS_GROUP);
|
||||
static RenderableViewManager<GroupShadowNode> createGroupViewManager() {
|
||||
return new RenderableViewManager<>(CLASS_GROUP);
|
||||
}
|
||||
|
||||
static RenderableViewManager createPathViewManager() {
|
||||
return new RenderableViewManager(CLASS_PATH) {
|
||||
static RenderableViewManager<PathShadowNode> createPathViewManager() {
|
||||
return new RenderableViewManager<PathShadowNode>(CLASS_PATH) {
|
||||
|
||||
@ReactProp(name = "d")
|
||||
public void setD(RenderableView node, String d) {
|
||||
((PathShadowNode) node.getShadowNode()).setD(d);
|
||||
public void setD(RenderableView<PathShadowNode> node, String d) {
|
||||
node.shadowNode.setD(d);
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
static RenderableViewManager createTextViewManager() {
|
||||
return new RenderableViewManager(CLASS_TEXT) {
|
||||
static RenderableViewManager<TextShadowNode> createTextViewManager() {
|
||||
return new RenderableViewManager<TextShadowNode>(CLASS_TEXT) {
|
||||
|
||||
@ReactProp(name = "textLength")
|
||||
public void setTextLength(RenderableView node, @Nullable String length) {
|
||||
((TextShadowNode) node.getShadowNode()).setTextLength(length);
|
||||
public void setTextLength(RenderableView<TextShadowNode> node, @Nullable String length) {
|
||||
node.shadowNode.setTextLength(length);
|
||||
}
|
||||
|
||||
@ReactProp(name = "lengthAdjust")
|
||||
public void setLengthAdjust(RenderableView node, @Nullable String adjustment) {
|
||||
((TextShadowNode) node.getShadowNode()).setLengthAdjust(adjustment);
|
||||
public void setLengthAdjust(RenderableView<TextShadowNode> node, @Nullable String adjustment) {
|
||||
node.shadowNode.setLengthAdjust(adjustment);
|
||||
}
|
||||
|
||||
@ReactProp(name = "alignmentBaseline")
|
||||
public void setMethod(RenderableView node, @Nullable String alignment) {
|
||||
((TextShadowNode) node.getShadowNode()).setMethod(alignment);
|
||||
public void setMethod(RenderableView<TextShadowNode> node, @Nullable String alignment) {
|
||||
node.shadowNode.setMethod(alignment);
|
||||
}
|
||||
|
||||
@ReactProp(name = "baselineShift")
|
||||
public void setBaselineShift(RenderableView node, @Nullable String baselineShift) {
|
||||
((TextShadowNode) node.getShadowNode()).setBaselineShift(baselineShift);
|
||||
public void setBaselineShift(RenderableView<TextShadowNode> node, @Nullable String baselineShift) {
|
||||
node.shadowNode.setBaselineShift(baselineShift);
|
||||
}
|
||||
|
||||
@ReactProp(name = "verticalAlign")
|
||||
public void setVerticalAlign(RenderableView node, @Nullable String verticalAlign) {
|
||||
((TextShadowNode) node.getShadowNode()).setVerticalAlign(verticalAlign);
|
||||
public void setVerticalAlign(RenderableView<TextShadowNode> node, @Nullable String verticalAlign) {
|
||||
node.shadowNode.setVerticalAlign(verticalAlign);
|
||||
}
|
||||
|
||||
@ReactProp(name = "rotate")
|
||||
public void setRotate(RenderableView node, @Nullable ReadableArray rotate) {
|
||||
((TextShadowNode) node.getShadowNode()).setRotate(rotate);
|
||||
public void setRotate(RenderableView<TextShadowNode> node, @Nullable ReadableArray rotate) {
|
||||
node.shadowNode.setRotate(rotate);
|
||||
}
|
||||
|
||||
@ReactProp(name = "deltaX")
|
||||
public void setDeltaX(RenderableView node, @Nullable ReadableArray deltaX) {
|
||||
((TextShadowNode) node.getShadowNode()).setDeltaX(deltaX);
|
||||
public void setDeltaX(RenderableView<TextShadowNode> node, @Nullable ReadableArray deltaX) {
|
||||
node.shadowNode.setDeltaX(deltaX);
|
||||
}
|
||||
|
||||
@ReactProp(name = "deltaY")
|
||||
public void setDeltaY(RenderableView node, @Nullable ReadableArray deltaY) {
|
||||
((TextShadowNode) node.getShadowNode()).setDeltaY(deltaY);
|
||||
public void setDeltaY(RenderableView<TextShadowNode> node, @Nullable ReadableArray deltaY) {
|
||||
node.shadowNode.setDeltaY(deltaY);
|
||||
}
|
||||
|
||||
@ReactProp(name = "positionX")
|
||||
public void setPositionX(RenderableView node, @Nullable ReadableArray positionX) {
|
||||
((TextShadowNode) node.getShadowNode()).setPositionX(positionX);
|
||||
public void setPositionX(RenderableView<TextShadowNode> node, @Nullable ReadableArray positionX) {
|
||||
node.shadowNode.setPositionX(positionX);
|
||||
}
|
||||
|
||||
@ReactProp(name = "positionY")
|
||||
public void setPositionY(RenderableView node, @Nullable ReadableArray positionY) {
|
||||
((TextShadowNode) node.getShadowNode()).setPositionY(positionY);
|
||||
public void setPositionY(RenderableView<TextShadowNode> node, @Nullable ReadableArray positionY) {
|
||||
node.shadowNode.setPositionY(positionY);
|
||||
}
|
||||
|
||||
@ReactProp(name = "font")
|
||||
public void setFont(RenderableView node, @Nullable ReadableMap font) {
|
||||
((TextShadowNode) node.getShadowNode()).setFont(font);
|
||||
public void setFont(RenderableView<TextShadowNode> node, @Nullable ReadableMap font) {
|
||||
node.shadowNode.setFont(font);
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
static RenderableViewManager createTSpanViewManager() {
|
||||
return new RenderableViewManager(CLASS_TSPAN) {
|
||||
static RenderableViewManager<TSpanShadowNode> createTSpanViewManager() {
|
||||
return new RenderableViewManager<TSpanShadowNode>(CLASS_TSPAN) {
|
||||
|
||||
@ReactProp(name = "content")
|
||||
public void setContent(RenderableView node, @Nullable String content) {
|
||||
((TSpanShadowNode) node.getShadowNode()).setContent(content);
|
||||
public void setContent(RenderableView<TSpanShadowNode> node, @Nullable String content) {
|
||||
node.shadowNode.setContent(content);
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
static RenderableViewManager createTextPathViewManager() {
|
||||
return new RenderableViewManager(CLASS_TEXT_PATH) {
|
||||
static RenderableViewManager<TextPathShadowNode> createTextPathViewManager() {
|
||||
return new RenderableViewManager<TextPathShadowNode>(CLASS_TEXT_PATH) {
|
||||
|
||||
@ReactProp(name = "href")
|
||||
public void setHref(RenderableView node, String href) {
|
||||
((TextPathShadowNode) node.getShadowNode()).setHref(href);
|
||||
public void setHref(RenderableView<TextPathShadowNode> node, String href) {
|
||||
node.shadowNode.setHref(href);
|
||||
}
|
||||
|
||||
@ReactProp(name = "startOffset")
|
||||
public void setStartOffset(RenderableView node, @Nullable String startOffset) {
|
||||
((TextPathShadowNode) node.getShadowNode()).setStartOffset(startOffset);
|
||||
public void setStartOffset(RenderableView<TextPathShadowNode> node, @Nullable String startOffset) {
|
||||
node.shadowNode.setStartOffset(startOffset);
|
||||
}
|
||||
|
||||
@ReactProp(name = "method")
|
||||
public void setMethod(RenderableView node, @Nullable String method) {
|
||||
((TextPathShadowNode) node.getShadowNode()).setMethod(method);
|
||||
public void setMethod(RenderableView<TextPathShadowNode> node, @Nullable String method) {
|
||||
node.shadowNode.setMethod(method);
|
||||
}
|
||||
|
||||
@ReactProp(name = "spacing")
|
||||
public void setSpacing(RenderableView node, @Nullable String spacing) {
|
||||
((TextPathShadowNode) node.getShadowNode()).setSpacing(spacing);
|
||||
public void setSpacing(RenderableView<TextPathShadowNode> node, @Nullable String spacing) {
|
||||
node.shadowNode.setSpacing(spacing);
|
||||
}
|
||||
|
||||
@ReactProp(name = "side")
|
||||
public void setSide(RenderableView node, @Nullable String side) {
|
||||
((TextPathShadowNode) node.getShadowNode()).setSide(side);
|
||||
public void setSide(RenderableView<TextPathShadowNode> node, @Nullable String side) {
|
||||
node.shadowNode.setSide(side);
|
||||
}
|
||||
|
||||
@ReactProp(name = "midLine")
|
||||
public void setSharp(RenderableView node, @Nullable String midLine) {
|
||||
((TextPathShadowNode) node.getShadowNode()).setSharp(midLine);
|
||||
public void setSharp(RenderableView<TextPathShadowNode> node, @Nullable String midLine) {
|
||||
node.shadowNode.setSharp(midLine);
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
static RenderableViewManager createImageViewManager() {
|
||||
return new RenderableViewManager(CLASS_IMAGE) {
|
||||
static RenderableViewManager<ImageShadowNode> createImageViewManager() {
|
||||
return new RenderableViewManager<ImageShadowNode>(CLASS_IMAGE) {
|
||||
|
||||
@ReactProp(name = "x")
|
||||
public void setX(RenderableView node, String x) {
|
||||
((ImageShadowNode) node.getShadowNode()).setX(x);
|
||||
public void setX(RenderableView<ImageShadowNode> node, String x) {
|
||||
node.shadowNode.setX(x);
|
||||
}
|
||||
|
||||
@ReactProp(name = "y")
|
||||
public void setY(RenderableView node, String y) {
|
||||
((ImageShadowNode) node.getShadowNode()).setY(y);
|
||||
public void setY(RenderableView<ImageShadowNode> node, String y) {
|
||||
node.shadowNode.setY(y);
|
||||
}
|
||||
|
||||
@ReactProp(name = "imagewidth")
|
||||
public void setWidth(RenderableView node, String width) {
|
||||
((ImageShadowNode) node.getShadowNode()).setWidth(width);
|
||||
public void setWidth(RenderableView<ImageShadowNode> node, String width) {
|
||||
node.shadowNode.setWidth(width);
|
||||
}
|
||||
|
||||
@ReactProp(name = "imageheight")
|
||||
public void seHeight(RenderableView node, String height) {
|
||||
((ImageShadowNode) node.getShadowNode()).seHeight(height);
|
||||
public void seHeight(RenderableView<ImageShadowNode> node, String height) {
|
||||
node.shadowNode.seHeight(height);
|
||||
}
|
||||
|
||||
@ReactProp(name = "src")
|
||||
public void setSrc(RenderableView node, @Nullable ReadableMap src) {
|
||||
((ImageShadowNode) node.getShadowNode()).setSrc(src);
|
||||
public void setSrc(RenderableView<ImageShadowNode> node, @Nullable ReadableMap src) {
|
||||
node.shadowNode.setSrc(src);
|
||||
}
|
||||
|
||||
|
||||
@ReactProp(name = "align")
|
||||
public void setAlign(RenderableView node, String align) {
|
||||
((ImageShadowNode) node.getShadowNode()).setAlign(align);
|
||||
public void setAlign(RenderableView<ImageShadowNode> node, String align) {
|
||||
node.shadowNode.setAlign(align);
|
||||
}
|
||||
|
||||
@ReactProp(name = "meetOrSlice")
|
||||
public void setMeetOrSlice(RenderableView node, int meetOrSlice) {
|
||||
((ImageShadowNode) node.getShadowNode()).setMeetOrSlice(meetOrSlice);
|
||||
public void setMeetOrSlice(RenderableView<ImageShadowNode> node, int meetOrSlice) {
|
||||
node.shadowNode.setMeetOrSlice(meetOrSlice);
|
||||
}
|
||||
|
||||
@ReactProp(name = "matrix")
|
||||
public void setMatrix(RenderableView node, @Nullable ReadableArray matrixArray) {
|
||||
((ImageShadowNode) node.getShadowNode()).setMatrix(matrixArray);
|
||||
public void setMatrix(RenderableView<ImageShadowNode> node, @Nullable ReadableArray matrixArray) {
|
||||
node.shadowNode.setMatrix(matrixArray);
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
static RenderableViewManager createCircleViewManager() {
|
||||
return new RenderableViewManager(CLASS_CIRCLE) {
|
||||
static RenderableViewManager<CircleShadowNode> createCircleViewManager() {
|
||||
return new RenderableViewManager<CircleShadowNode>(CLASS_CIRCLE) {
|
||||
|
||||
@ReactProp(name = "cx")
|
||||
public void setCx(RenderableView node, String cx) {
|
||||
((CircleShadowNode) node.getShadowNode()).setCx(cx);
|
||||
public void setCx(RenderableView<CircleShadowNode> node, String cx) {
|
||||
node.shadowNode.setCx(cx);
|
||||
}
|
||||
|
||||
@ReactProp(name = "cy")
|
||||
public void setCy(RenderableView node, String cy) {
|
||||
((CircleShadowNode) node.getShadowNode()).setCy(cy);
|
||||
public void setCy(RenderableView<CircleShadowNode> node, String cy) {
|
||||
node.shadowNode.setCy(cy);
|
||||
}
|
||||
|
||||
@ReactProp(name = "r")
|
||||
public void setR(RenderableView node, String r) {
|
||||
((CircleShadowNode) node.getShadowNode()).setR(r);
|
||||
public void setR(RenderableView<CircleShadowNode> node, String r) {
|
||||
node.shadowNode.setR(r);
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
static RenderableViewManager createEllipseViewManager() {
|
||||
return new RenderableViewManager(CLASS_ELLIPSE) {
|
||||
static RenderableViewManager<EllipseShadowNode> createEllipseViewManager() {
|
||||
return new RenderableViewManager<EllipseShadowNode>(CLASS_ELLIPSE) {
|
||||
|
||||
@ReactProp(name = "cx")
|
||||
public void setCx(RenderableView node, String cx) {
|
||||
((EllipseShadowNode) node.getShadowNode()).setCx(cx);
|
||||
public void setCx(RenderableView<EllipseShadowNode> node, String cx) {
|
||||
node.shadowNode.setCx(cx);
|
||||
}
|
||||
|
||||
@ReactProp(name = "cy")
|
||||
public void setCy(RenderableView node, String cy) {
|
||||
((EllipseShadowNode) node.getShadowNode()).setCy(cy);
|
||||
public void setCy(RenderableView<EllipseShadowNode> node, String cy) {
|
||||
node.shadowNode.setCy(cy);
|
||||
}
|
||||
|
||||
@ReactProp(name = "rx")
|
||||
public void setRx(RenderableView node, String rx) {
|
||||
((EllipseShadowNode) node.getShadowNode()).setRx(rx);
|
||||
public void setRx(RenderableView<EllipseShadowNode> node, String rx) {
|
||||
node.shadowNode.setRx(rx);
|
||||
}
|
||||
|
||||
@ReactProp(name = "ry")
|
||||
public void setRy(RenderableView node, String ry) {
|
||||
((EllipseShadowNode) node.getShadowNode()).setRy(ry);
|
||||
public void setRy(RenderableView<EllipseShadowNode> node, String ry) {
|
||||
node.shadowNode.setRy(ry);
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
static RenderableViewManager createLineViewManager() {
|
||||
return new RenderableViewManager(CLASS_LINE) {
|
||||
static RenderableViewManager<LineShadowNode> createLineViewManager() {
|
||||
return new RenderableViewManager<LineShadowNode>(CLASS_LINE) {
|
||||
|
||||
@ReactProp(name = "x1")
|
||||
public void setX1(RenderableView node, String x1) {
|
||||
((LineShadowNode) node.getShadowNode()).setX1(x1);
|
||||
public void setX1(RenderableView<LineShadowNode> node, String x1) {
|
||||
node.shadowNode.setX1(x1);
|
||||
}
|
||||
|
||||
@ReactProp(name = "y1")
|
||||
public void setY1(RenderableView node, String y1) {
|
||||
((LineShadowNode) node.getShadowNode()).setY1(y1);
|
||||
public void setY1(RenderableView<LineShadowNode> node, String y1) {
|
||||
node.shadowNode.setY1(y1);
|
||||
}
|
||||
|
||||
@ReactProp(name = "x2")
|
||||
public void setX2(RenderableView node, String x2) {
|
||||
((LineShadowNode) node.getShadowNode()).setX2(x2);
|
||||
public void setX2(RenderableView<LineShadowNode> node, String x2) {
|
||||
node.shadowNode.setX2(x2);
|
||||
}
|
||||
|
||||
@ReactProp(name = "y2")
|
||||
public void setY2(RenderableView node, String y2) {
|
||||
((LineShadowNode) node.getShadowNode()).setY2(y2);
|
||||
public void setY2(RenderableView<LineShadowNode> node, String y2) {
|
||||
node.shadowNode.setY2(y2);
|
||||
}
|
||||
|
||||
};
|
||||
}
|
||||
|
||||
static RenderableViewManager createRectViewManager() {
|
||||
return new RenderableViewManager(CLASS_RECT) {
|
||||
static RenderableViewManager<RectShadowNode> createRectViewManager() {
|
||||
return new RenderableViewManager<RectShadowNode>(CLASS_RECT) {
|
||||
|
||||
@ReactProp(name = "x")
|
||||
public void setX(RenderableView node, String x) {
|
||||
((RectShadowNode) node.getShadowNode()).setX(x);
|
||||
public void setX(RenderableView<RectShadowNode> node, String x) {
|
||||
node.shadowNode.setX(x);
|
||||
}
|
||||
|
||||
@ReactProp(name = "y")
|
||||
public void setY(RenderableView node, String y) {
|
||||
((RectShadowNode) node.getShadowNode()).setY(y);
|
||||
public void setY(RenderableView<RectShadowNode> node, String y) {
|
||||
node.shadowNode.setY(y);
|
||||
}
|
||||
|
||||
@ReactProp(name = "rectwidth")
|
||||
public void setWidth(RenderableView node, String width) {
|
||||
((RectShadowNode) node.getShadowNode()).setWidth(width);
|
||||
public void setWidth(RenderableView<RectShadowNode> node, String width) {
|
||||
node.shadowNode.setWidth(width);
|
||||
}
|
||||
|
||||
|
||||
@ReactProp(name = "rectheight")
|
||||
public void setHeight(RenderableView node, String height) {
|
||||
((RectShadowNode) node.getShadowNode()).setHeight(height);
|
||||
public void setHeight(RenderableView<RectShadowNode> node, String height) {
|
||||
node.shadowNode.setHeight(height);
|
||||
}
|
||||
|
||||
|
||||
@ReactProp(name = "rx")
|
||||
public void setRx(RenderableView node, String rx) {
|
||||
((RectShadowNode) node.getShadowNode()).setRx(rx);
|
||||
public void setRx(RenderableView<RectShadowNode> node, String rx) {
|
||||
node.shadowNode.setRx(rx);
|
||||
}
|
||||
|
||||
@ReactProp(name = "ry")
|
||||
public void setRy(RenderableView node, String ry) {
|
||||
((RectShadowNode) node.getShadowNode()).setRy(ry);
|
||||
public void setRy(RenderableView<RectShadowNode> node, String ry) {
|
||||
node.shadowNode.setRy(ry);
|
||||
}
|
||||
};
|
||||
}
|
||||
@@ -333,147 +334,147 @@ class RenderableViewManager extends ViewGroupManager<RenderableView> {
|
||||
return new RenderableViewManager(CLASS_DEFS);
|
||||
}
|
||||
|
||||
static RenderableViewManager createUseViewManager() {
|
||||
return new RenderableViewManager(CLASS_USE) {
|
||||
static RenderableViewManager<UseShadowNode> createUseViewManager() {
|
||||
return new RenderableViewManager<UseShadowNode>(CLASS_USE) {
|
||||
|
||||
@ReactProp(name = "href")
|
||||
public void setHref(RenderableView node, String href) {
|
||||
((UseShadowNode) node.getShadowNode()).setHref(href);
|
||||
public void setHref(RenderableView<UseShadowNode> node, String href) {
|
||||
node.shadowNode.setHref(href);
|
||||
}
|
||||
|
||||
@ReactProp(name = "usewidth")
|
||||
public void setWidth(RenderableView node, String width) {
|
||||
((UseShadowNode) node.getShadowNode()).setWidth(width);
|
||||
public void setWidth(RenderableView<UseShadowNode> node, String width) {
|
||||
node.shadowNode.setWidth(width);
|
||||
}
|
||||
|
||||
@ReactProp(name = "useheight")
|
||||
public void setHeight(RenderableView node, String height) {
|
||||
((UseShadowNode) node.getShadowNode()).setHeight(height);
|
||||
public void setHeight(RenderableView<UseShadowNode> node, String height) {
|
||||
node.shadowNode.setHeight(height);
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
static RenderableViewManager createSymbolManager() {
|
||||
return new RenderableViewManager(CLASS_SYMBOL) {
|
||||
static RenderableViewManager<SymbolShadowNode> createSymbolManager() {
|
||||
return new RenderableViewManager<SymbolShadowNode>(CLASS_SYMBOL) {
|
||||
|
||||
@ReactProp(name = "minX")
|
||||
public void setMinX(RenderableView node, float minX) {
|
||||
((SymbolShadowNode) node.getShadowNode()).setMinX(minX);
|
||||
public void setMinX(RenderableView<SymbolShadowNode> node, float minX) {
|
||||
node.shadowNode.setMinX(minX);
|
||||
}
|
||||
|
||||
@ReactProp(name = "minY")
|
||||
public void setMinY(RenderableView node, float minY) {
|
||||
((SymbolShadowNode) node.getShadowNode()).setMinY(minY);
|
||||
public void setMinY(RenderableView<SymbolShadowNode> node, float minY) {
|
||||
node.shadowNode.setMinY(minY);
|
||||
}
|
||||
|
||||
@ReactProp(name = "vbWidth")
|
||||
public void setVbWidth(RenderableView node, float vbWidth) {
|
||||
((SymbolShadowNode) node.getShadowNode()).setVbWidth(vbWidth);
|
||||
public void setVbWidth(RenderableView<SymbolShadowNode> node, float vbWidth) {
|
||||
node.shadowNode.setVbWidth(vbWidth);
|
||||
}
|
||||
|
||||
@ReactProp(name = "vbHeight")
|
||||
public void setVbHeight(RenderableView node, float vbHeight) {
|
||||
((SymbolShadowNode) node.getShadowNode()).setVbHeight(vbHeight);
|
||||
public void setVbHeight(RenderableView<SymbolShadowNode> node, float vbHeight) {
|
||||
node.shadowNode.setVbHeight(vbHeight);
|
||||
}
|
||||
|
||||
@ReactProp(name = "align")
|
||||
public void setAlign(RenderableView node, String align) {
|
||||
((SymbolShadowNode) node.getShadowNode()).setAlign(align);
|
||||
public void setAlign(RenderableView<SymbolShadowNode> node, String align) {
|
||||
node.shadowNode.setAlign(align);
|
||||
}
|
||||
|
||||
@ReactProp(name = "meetOrSlice")
|
||||
public void setMeetOrSlice(RenderableView node, int meetOrSlice) {
|
||||
((SymbolShadowNode) node.getShadowNode()).setMeetOrSlice(meetOrSlice);
|
||||
public void setMeetOrSlice(RenderableView<SymbolShadowNode> node, int meetOrSlice) {
|
||||
node.shadowNode.setMeetOrSlice(meetOrSlice);
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
static RenderableViewManager createLinearGradientManager() {
|
||||
return new RenderableViewManager(CLASS_LINEAR_GRADIENT) {
|
||||
static RenderableViewManager<LinearGradientShadowNode> createLinearGradientManager() {
|
||||
return new RenderableViewManager<LinearGradientShadowNode>(CLASS_LINEAR_GRADIENT) {
|
||||
|
||||
@ReactProp(name = "x1")
|
||||
public void setX1(RenderableView node, String x1) {
|
||||
((LinearGradientShadowNode) node.getShadowNode()).setX1(x1);
|
||||
public void setX1(RenderableView<LinearGradientShadowNode> node, String x1) {
|
||||
node.shadowNode.setX1(x1);
|
||||
}
|
||||
|
||||
@ReactProp(name = "y1")
|
||||
public void setY1(RenderableView node, String y1) {
|
||||
((LinearGradientShadowNode) node.getShadowNode()).setY1(y1);
|
||||
public void setY1(RenderableView<LinearGradientShadowNode> node, String y1) {
|
||||
node.shadowNode.setY1(y1);
|
||||
}
|
||||
|
||||
@ReactProp(name = "x2")
|
||||
public void setX2(RenderableView node, String x2) {
|
||||
((LinearGradientShadowNode) node.getShadowNode()).setX2(x2);
|
||||
public void setX2(RenderableView<LinearGradientShadowNode> node, String x2) {
|
||||
node.shadowNode.setX2(x2);
|
||||
}
|
||||
|
||||
@ReactProp(name = "y2")
|
||||
public void setY2(RenderableView node, String y2) {
|
||||
((LinearGradientShadowNode) node.getShadowNode()).setY2(y2);
|
||||
public void setY2(RenderableView<LinearGradientShadowNode> node, String y2) {
|
||||
node.shadowNode.setY2(y2);
|
||||
}
|
||||
|
||||
@ReactProp(name = "gradient")
|
||||
public void setGradient(RenderableView node, ReadableArray gradient) {
|
||||
((LinearGradientShadowNode) node.getShadowNode()).setGradient(gradient);
|
||||
public void setGradient(RenderableView<LinearGradientShadowNode> node, ReadableArray gradient) {
|
||||
node.shadowNode.setGradient(gradient);
|
||||
}
|
||||
|
||||
@ReactProp(name = "gradientUnits")
|
||||
public void setGradientUnits(RenderableView node, int gradientUnits) {
|
||||
((LinearGradientShadowNode) node.getShadowNode()).setGradientUnits(gradientUnits);
|
||||
public void setGradientUnits(RenderableView<LinearGradientShadowNode> node, int gradientUnits) {
|
||||
node.shadowNode.setGradientUnits(gradientUnits);
|
||||
}
|
||||
|
||||
@ReactProp(name = "gradientTransform")
|
||||
public void setGradientTransform(RenderableView node, @Nullable ReadableArray matrixArray) {
|
||||
((LinearGradientShadowNode) node.getShadowNode()).setGradientTransform(matrixArray);
|
||||
public void setGradientTransform(RenderableView<LinearGradientShadowNode> node, @Nullable ReadableArray matrixArray) {
|
||||
node.shadowNode.setGradientTransform(matrixArray);
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
static RenderableViewManager createRadialGradientManager() {
|
||||
return new RenderableViewManager(CLASS_RADIAL_GRADIENT) {
|
||||
static RenderableViewManager<RadialGradientShadowNode> createRadialGradientManager() {
|
||||
return new RenderableViewManager<RadialGradientShadowNode>(CLASS_RADIAL_GRADIENT) {
|
||||
|
||||
@ReactProp(name = "fx")
|
||||
public void setFx(RenderableView node, String fx) {
|
||||
((RadialGradientShadowNode) node.getShadowNode()).setFx(fx);
|
||||
public void setFx(RenderableView<RadialGradientShadowNode> node, String fx) {
|
||||
node.shadowNode.setFx(fx);
|
||||
}
|
||||
|
||||
@ReactProp(name = "fy")
|
||||
public void setFy(RenderableView node, String fy) {
|
||||
((RadialGradientShadowNode) node.getShadowNode()).setFy(fy);
|
||||
public void setFy(RenderableView<RadialGradientShadowNode> node, String fy) {
|
||||
node.shadowNode.setFy(fy);
|
||||
}
|
||||
|
||||
@ReactProp(name = "rx")
|
||||
public void setRx(RenderableView node, String rx) {
|
||||
((RadialGradientShadowNode) node.getShadowNode()).setRx(rx);
|
||||
public void setRx(RenderableView<RadialGradientShadowNode> node, String rx) {
|
||||
node.shadowNode.setRx(rx);
|
||||
}
|
||||
|
||||
@ReactProp(name = "ry")
|
||||
public void setRy(RenderableView node, String ry) {
|
||||
((RadialGradientShadowNode) node.getShadowNode()).setRy(ry);
|
||||
public void setRy(RenderableView<RadialGradientShadowNode> node, String ry) {
|
||||
node.shadowNode.setRy(ry);
|
||||
}
|
||||
|
||||
@ReactProp(name = "cx")
|
||||
public void setCx(RenderableView node, String cx) {
|
||||
((RadialGradientShadowNode) node.getShadowNode()).setCx(cx);
|
||||
public void setCx(RenderableView<RadialGradientShadowNode> node, String cx) {
|
||||
node.shadowNode.setCx(cx);
|
||||
}
|
||||
|
||||
@ReactProp(name = "cy")
|
||||
public void setCy(RenderableView node, String cy) {
|
||||
((RadialGradientShadowNode) node.getShadowNode()).setCy(cy);
|
||||
public void setCy(RenderableView<RadialGradientShadowNode> node, String cy) {
|
||||
node.shadowNode.setCy(cy);
|
||||
}
|
||||
|
||||
@ReactProp(name = "gradient")
|
||||
public void setGradient(RenderableView node, ReadableArray gradient) {
|
||||
((RadialGradientShadowNode) node.getShadowNode()).setGradient(gradient);
|
||||
public void setGradient(RenderableView<RadialGradientShadowNode> node, ReadableArray gradient) {
|
||||
node.shadowNode.setGradient(gradient);
|
||||
}
|
||||
|
||||
@ReactProp(name = "gradientUnits")
|
||||
public void setGradientUnits(RenderableView node, int gradientUnits) {
|
||||
((RadialGradientShadowNode) node.getShadowNode()).setGradientUnits(gradientUnits);
|
||||
public void setGradientUnits(RenderableView<RadialGradientShadowNode> node, int gradientUnits) {
|
||||
node.shadowNode.setGradientUnits(gradientUnits);
|
||||
}
|
||||
|
||||
@ReactProp(name = "gradientTransform")
|
||||
public void setGradientTransform(RenderableView node, @Nullable ReadableArray matrixArray) {
|
||||
((RadialGradientShadowNode) node.getShadowNode()).setGradientTransform(matrixArray);
|
||||
public void setGradientTransform(RenderableView<RadialGradientShadowNode> node, @Nullable ReadableArray matrixArray) {
|
||||
node.shadowNode.setGradientTransform(matrixArray);
|
||||
}
|
||||
};
|
||||
}
|
||||
@@ -528,7 +529,7 @@ class RenderableViewManager extends ViewGroupManager<RenderableView> {
|
||||
}
|
||||
|
||||
@Override
|
||||
public Class<? extends LayoutShadowNode> getShadowNodeClass() {
|
||||
public Class<? extends VirtualNode> getShadowNodeClass() {
|
||||
switch (mClassName) {
|
||||
case CLASS_GROUP:
|
||||
return GroupShadowNode.class;
|
||||
@@ -568,64 +569,64 @@ class RenderableViewManager extends ViewGroupManager<RenderableView> {
|
||||
}
|
||||
|
||||
@ReactProp(name = "fill")
|
||||
public void setFill(RenderableView node, @Nullable ReadableArray fill) {
|
||||
((RenderableShadowNode) node.getShadowNode()).setFill(fill);
|
||||
public void setFill(RenderableView<RenderableShadowNode> node, @Nullable Dynamic fill) {
|
||||
node.shadowNode.setFill(fill);
|
||||
}
|
||||
|
||||
@ReactProp(name = "fillOpacity", defaultFloat = 1f)
|
||||
public void setFillOpacity(RenderableView node, float fillOpacity) {
|
||||
((RenderableShadowNode) node.getShadowNode()).setFillOpacity(fillOpacity);
|
||||
public void setFillOpacity(RenderableView<RenderableShadowNode> node, float fillOpacity) {
|
||||
node.shadowNode.setFillOpacity(fillOpacity);
|
||||
}
|
||||
|
||||
@ReactProp(name = "fillRule", defaultInt = FILL_RULE_NONZERO)
|
||||
public void setFillRule(RenderableView node, int fillRule) {
|
||||
((RenderableShadowNode) node.getShadowNode()).setFillRule(fillRule);
|
||||
public void setFillRule(RenderableView<RenderableShadowNode> node, int fillRule) {
|
||||
node.shadowNode.setFillRule(fillRule);
|
||||
}
|
||||
|
||||
|
||||
@ReactProp(name = "stroke")
|
||||
public void setStroke(RenderableView node, @Nullable ReadableArray strokeColors) {
|
||||
((RenderableShadowNode) node.getShadowNode()).setStroke(strokeColors);
|
||||
public void setStroke(RenderableView<RenderableShadowNode> node, @Nullable Dynamic strokeColors) {
|
||||
node.shadowNode.setStroke(strokeColors);
|
||||
}
|
||||
|
||||
@ReactProp(name = "strokeOpacity", defaultFloat = 1f)
|
||||
public void setStrokeOpacity(RenderableView node, float strokeOpacity) {
|
||||
((RenderableShadowNode) node.getShadowNode()).setStrokeOpacity(strokeOpacity);
|
||||
public void setStrokeOpacity(RenderableView<RenderableShadowNode> node, float strokeOpacity) {
|
||||
node.shadowNode.setStrokeOpacity(strokeOpacity);
|
||||
}
|
||||
|
||||
@ReactProp(name = "strokeDasharray")
|
||||
public void setStrokeDasharray(RenderableView node, @Nullable ReadableArray strokeDasharray) {
|
||||
((RenderableShadowNode) node.getShadowNode()).setStrokeDasharray(strokeDasharray);
|
||||
public void setStrokeDasharray(RenderableView<RenderableShadowNode> node, @Nullable ReadableArray strokeDasharray) {
|
||||
node.shadowNode.setStrokeDasharray(strokeDasharray);
|
||||
}
|
||||
|
||||
@ReactProp(name = "strokeDashoffset")
|
||||
public void setStrokeDashoffset(RenderableView node, float strokeDashoffset) {
|
||||
((RenderableShadowNode) node.getShadowNode()).setStrokeDashoffset(strokeDashoffset);
|
||||
public void setStrokeDashoffset(RenderableView<RenderableShadowNode> node, float strokeDashoffset) {
|
||||
node.shadowNode.setStrokeDashoffset(strokeDashoffset);
|
||||
}
|
||||
|
||||
@ReactProp(name = "strokeWidth")
|
||||
public void setStrokeWidth(RenderableView node, String strokeWidth) {
|
||||
((RenderableShadowNode) node.getShadowNode()).setStrokeWidth(strokeWidth);
|
||||
public void setStrokeWidth(RenderableView<RenderableShadowNode> node, String strokeWidth) {
|
||||
node.shadowNode.setStrokeWidth(strokeWidth);
|
||||
}
|
||||
|
||||
@ReactProp(name = "strokeMiterlimit", defaultFloat = 4f)
|
||||
public void setStrokeMiterlimit(RenderableView node, float strokeMiterlimit) {
|
||||
((RenderableShadowNode) node.getShadowNode()).setStrokeMiterlimit(strokeMiterlimit);
|
||||
public void setStrokeMiterlimit(RenderableView<RenderableShadowNode> node, float strokeMiterlimit) {
|
||||
node.shadowNode.setStrokeMiterlimit(strokeMiterlimit);
|
||||
}
|
||||
|
||||
@ReactProp(name = "strokeLinecap", defaultInt = CAP_ROUND)
|
||||
public void setStrokeLinecap(RenderableView node, int strokeLinecap) {
|
||||
((RenderableShadowNode) node.getShadowNode()).setStrokeLinecap(strokeLinecap);
|
||||
public void setStrokeLinecap(RenderableView<RenderableShadowNode> node, int strokeLinecap) {
|
||||
node.shadowNode.setStrokeLinecap(strokeLinecap);
|
||||
}
|
||||
|
||||
@ReactProp(name = "strokeLinejoin", defaultInt = JOIN_ROUND)
|
||||
public void setStrokeLinejoin(RenderableView node, int strokeLinejoin) {
|
||||
((RenderableShadowNode) node.getShadowNode()).setStrokeLinejoin(strokeLinejoin);
|
||||
public void setStrokeLinejoin(RenderableView<RenderableShadowNode> node, int strokeLinejoin) {
|
||||
node.shadowNode.setStrokeLinejoin(strokeLinejoin);
|
||||
}
|
||||
|
||||
@ReactProp(name = "propList")
|
||||
public void setPropList(RenderableView node, @Nullable ReadableArray propList) {
|
||||
((RenderableShadowNode) node.getShadowNode()).setPropList(propList);
|
||||
public void setPropList(RenderableView<RenderableShadowNode> node, @Nullable ReadableArray propList) {
|
||||
node.shadowNode.setPropList(propList);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -634,9 +635,9 @@ class RenderableViewManager extends ViewGroupManager<RenderableView> {
|
||||
* you want to override this method you should call super.onAfterUpdateTransaction from it as
|
||||
* the parent class of the ViewManager may rely on callback being executed.
|
||||
*/
|
||||
protected void onAfterUpdateTransaction(RenderableView node) {
|
||||
protected void onAfterUpdateTransaction(RenderableView<T> node) {
|
||||
super.onAfterUpdateTransaction(node);
|
||||
VirtualNode shadow = node.getShadowNode();
|
||||
VirtualNode shadow = node.shadowNode;
|
||||
SvgViewShadowNode view = shadow.getSvgShadowNode();
|
||||
if (view == null) {
|
||||
return;
|
||||
@@ -650,19 +651,19 @@ class RenderableViewManager extends ViewGroupManager<RenderableView> {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected RenderableView createViewInstance(ThemedReactContext reactContext) {
|
||||
return new RenderableView(reactContext);
|
||||
protected RenderableView<T> createViewInstance(ThemedReactContext reactContext) {
|
||||
return new RenderableView<T>(reactContext);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void updateExtraData(RenderableView root, Object extraData) {
|
||||
public void updateExtraData(RenderableView<T> root, Object extraData) {
|
||||
throw new IllegalStateException("SVG elements does not map into a native view");
|
||||
}
|
||||
|
||||
private static final SparseArray<VirtualNode> mTagToShadowNode = new SparseArray<>();
|
||||
|
||||
@Override
|
||||
public void onDropViewInstance(RenderableView view) {
|
||||
public void onDropViewInstance(RenderableView<T> view) {
|
||||
mTagToShadowNode.remove(view.getId());
|
||||
view.dropView();
|
||||
}
|
||||
|
||||
@@ -13,6 +13,8 @@
|
||||
#import <React/RCTLog.h>
|
||||
#import <React/RCTFont.h>
|
||||
|
||||
NSRegularExpression *regex;
|
||||
|
||||
@implementation RCTConvert (RNSVG)
|
||||
|
||||
RCT_ENUM_CONVERTER(RNSVGCGFCRule, (@{
|
||||
@@ -54,6 +56,24 @@ RCT_ENUM_CONVERTER(RNSVGUnits, (@{
|
||||
|
||||
+ (RNSVGBrush *)RNSVGBrush:(id)json
|
||||
{
|
||||
if ([json isKindOfClass:[NSString class]]) {
|
||||
NSString *value = [self NSString:json];
|
||||
if (!regex) {
|
||||
regex = [NSRegularExpression regularExpressionWithPattern:@"[0-9.-]+" options:NSRegularExpressionCaseInsensitive error:nil];
|
||||
}
|
||||
NSArray<NSTextCheckingResult*> *_matches = [regex matchesInString:value options:0 range:NSMakeRange(0, [value length])];
|
||||
NSMutableArray *output = [NSMutableArray array];
|
||||
NSUInteger i = 0;
|
||||
[output addObject:[NSNumber numberWithInteger:0]];
|
||||
for (NSTextCheckingResult *match in _matches) {
|
||||
NSString* strNumber = [value substringWithRange:match.range];
|
||||
[output addObject:[NSNumber numberWithDouble:(i++ < 3 ? strNumber.doubleValue / 255 : strNumber.doubleValue)]];
|
||||
}
|
||||
if ([output count] < 5) {
|
||||
[output addObject:[NSNumber numberWithDouble:1]];
|
||||
}
|
||||
return [[RNSVGSolidColorBrush alloc] initWithArray:output];
|
||||
}
|
||||
NSArray *arr = [self NSArray:json];
|
||||
NSUInteger type = [self NSUInteger:arr.firstObject];
|
||||
|
||||
|
||||
Reference in New Issue
Block a user