Add support to base64 data from svg

use `svgRef.toDataURL(function (base64) {console.log(base64);});` to get
base64 data of svgRef
This commit is contained in:
Horcrux
2016-08-12 11:13:27 +08:00
parent 857b5f5207
commit e747cc82a6
17 changed files with 84 additions and 56 deletions
@@ -16,7 +16,6 @@ import android.graphics.RadialGradient;
import android.graphics.LinearGradient;
import android.graphics.Shader;
import android.graphics.Matrix;
import android.util.Log;
import javax.annotation.Nullable;
@@ -12,7 +12,6 @@ package com.horcrux.svg;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Path;
import android.util.Log;
import com.facebook.react.uimanager.annotations.ReactProp;
@@ -13,7 +13,6 @@ import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.RectF;
import android.util.Log;
import com.facebook.react.uimanager.annotations.ReactProp;
@@ -14,14 +14,12 @@ import android.graphics.Matrix;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.Point;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import com.facebook.react.bridge.ReadableArray;
import com.facebook.react.uimanager.ReactShadowNode;
import java.security.PublicKey;
import javax.annotation.Nullable;
@@ -14,8 +14,6 @@ import android.graphics.Paint;
import android.graphics.Path;
import com.facebook.react.uimanager.annotations.ReactProp;
import javax.annotation.Nullable;
/**
* Shadow node for virtual RNSVGPath view
*/
@@ -14,8 +14,6 @@ import com.facebook.react.bridge.ReadableArray;
import com.facebook.react.bridge.WritableArray;
import com.facebook.react.uimanager.annotations.ReactProp;
import java.util.ArrayList;
/**
* Shadow node for virtual LinearGradient definition view
*/
@@ -21,7 +21,6 @@ import android.graphics.Point;
import android.graphics.RectF;
import android.graphics.Color;
import android.util.Log;
import android.view.View;
import com.facebook.common.logging.FLog;
@@ -15,8 +15,6 @@ import android.graphics.Path;
import android.graphics.RectF;
import com.facebook.react.uimanager.annotations.ReactProp;
import javax.annotation.Nullable;
/**
* Shadow node for virtual RNSVGPath view
*/
@@ -13,8 +13,6 @@ import android.content.Context;
import android.view.View;
import android.view.ViewGroup;
// NativeGestureUtil.notifyNativeGestureStarted
/**
* Custom {@link View} implementation that draws an RNSVGSvg React view and its \children.
*/
@@ -21,24 +21,41 @@ import android.view.View;
import android.view.ViewGroup;
import com.facebook.infer.annotation.Assertions;
import com.facebook.react.bridge.Arguments;
import com.facebook.react.bridge.ReactContext;
import com.facebook.react.bridge.WritableMap;
import com.facebook.react.common.SystemClock;
import com.facebook.react.uimanager.ThemedReactContext;
import com.facebook.react.uimanager.UIManagerModule;
import com.facebook.react.uimanager.events.RCTEventEmitter;
import com.facebook.react.uimanager.events.TouchEvent;
import com.facebook.react.uimanager.events.TouchEventCoalescingKeyHelper;
import com.facebook.react.uimanager.events.TouchEventType;
import com.facebook.react.uimanager.events.EventDispatcher;
// NativeGestureUtil.notifyNativeGestureStarted
/**
* Custom {@link View} implementation that draws an RNSVGSvg React view and its \children.
*/
public class RNSVGSvgView extends ViewGroup {
public enum Events {
EVENT_DATA_URL("onDataURL");
private final String mName;
Events(final String name) {
mName = name;
}
@Override
public String toString() {
return mName;
}
}
private @Nullable Bitmap mBitmap;
private RCTEventEmitter mEventEmitter;
private RNSVGSvgViewShadowNode mSvgViewShadowNode;
private int mTargetTag;
private final TouchEventCoalescingKeyHelper mTouchEventCoalescingKeyHelper =
@@ -48,6 +65,11 @@ public class RNSVGSvgView extends ViewGroup {
super(context);
}
public RNSVGSvgView(ReactContext reactContext) {
super(reactContext);
mEventEmitter = reactContext.getJSModule(RCTEventEmitter.class);
}
public void setBitmap(Bitmap bitmap) {
if (mBitmap != null) {
mBitmap.recycle();
@@ -183,4 +205,10 @@ public class RNSVGSvgView extends ViewGroup {
androidEvent.getY(),
mTouchEventCoalescingKeyHelper));
}
public void onDataURL() {
WritableMap event = Arguments.createMap();
event.putString("base64", mSvgViewShadowNode.getBase64());
mEventEmitter.receiveEvent(getId(), Events.EVENT_DATA_URL.toString(), event);
}
}
@@ -10,29 +10,16 @@
package com.horcrux.svg;
import android.graphics.Bitmap;
import android.telecom.Call;
import android.util.Log;
import com.facebook.react.bridge.Arguments;
import com.facebook.react.bridge.ReactContext;
import com.facebook.react.bridge.ReactMethod;
import com.facebook.react.bridge.ReadableArray;
import com.facebook.react.bridge.WritableMap;
import com.facebook.react.uimanager.BaseViewManager;
import com.facebook.react.uimanager.LayoutShadowNode;
import com.facebook.react.uimanager.ReactStylesDiffMap;
import com.facebook.react.uimanager.SimpleViewManager;
import com.facebook.react.common.MapBuilder;
import com.facebook.react.uimanager.ThemedReactContext;
import com.facebook.react.uimanager.ViewGroupManager;
import com.facebook.react.uimanager.ViewManagerPropertyUpdater;
import com.facebook.react.uimanager.events.RCTEventEmitter;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import javax.annotation.Nullable;
import javax.security.auth.callback.Callback;
/**
* ViewManager for RNSVGSvgView React views. Renders as a {@link RNSVGSvgView} and handles
@@ -63,27 +50,27 @@ public class RNSVGSvgViewManager extends ViewGroupManager<RNSVGSvgView> {
return commandsMap;
}
@Override
@Nullable
public Map getExportedCustomDirectEventTypeConstants() {
MapBuilder.Builder builder = MapBuilder.builder();
for (RNSVGSvgView.Events event : RNSVGSvgView.Events.values()) {
builder.put(event.toString(), MapBuilder.of("registrationName", event.toString()));
}
return builder.build();
}
@Override
public void receiveCommand(RNSVGSvgView root, int commandId, @Nullable ReadableArray args) {
super.receiveCommand(root, commandId, args);
switch (commandId) {
case COMMAND_TO_DATA_URL:
toDataURL(root);
root.onDataURL();
break;
}
}
private void toDataURL(RNSVGSvgView root) {
WritableMap event = Arguments.createMap();
event.putString("message", "MyMessage");
ReactContext reactContext = (ReactContext)root.getContext();
reactContext.getJSModule(RCTEventEmitter.class).receiveEvent(
root.getId(),
"onDataURL",
event);
}
@Override
public RNSVGSvgViewShadowNode createShadowNodeInstance() {
@@ -13,21 +13,17 @@ import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Point;
import android.graphics.Rect;
import android.util.Log;
import android.view.View;
import android.util.Base64;
import android.view.ViewGroup;
import com.facebook.imagepipeline.request.ImageRequest;
import com.facebook.react.uimanager.LayoutShadowNode;
import com.facebook.react.uimanager.ReactShadowNode;
import com.facebook.react.uimanager.UIViewOperationQueue;
import java.io.ByteArrayOutputStream;
import java.util.HashMap;
import java.util.Map;
import javax.annotation.Nonnull;
/**
* Shadow node for RNSVG virtual tree root - RNSVGSvgView
*/
@@ -57,6 +53,15 @@ public class RNSVGSvgViewShadowNode extends LayoutShadowNode {
return bitmap;
}
public String getBase64() {
Bitmap bitmap = (Bitmap)drawOutput();
ByteArrayOutputStream stream = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.PNG, 100, stream);
bitmap.recycle();
byte[] bitmapBytes = stream.toByteArray();
return Base64.encodeToString(bitmapBytes, Base64.DEFAULT);
}
/**
* Draw all of the child nodes of this root node
*
@@ -21,7 +21,6 @@ import android.graphics.Rect;
import android.graphics.RectF;
import android.graphics.Typeface;
import android.text.TextUtils;
import android.util.Log;
import android.view.View;
import com.facebook.react.bridge.ReadableArray;
@@ -11,7 +11,6 @@ package com.horcrux.svg;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.util.Log;
import com.facebook.common.logging.FLog;
import com.facebook.react.common.ReactConstants;