From cd667d0a39caf9251eff2be39079604cd8ecb94a Mon Sep 17 00:00:00 2001 From: Mikael Sand Date: Thu, 3 Oct 2019 22:29:59 +0300 Subject: [PATCH] feat(android): implement getTotalLength and getPointAtLength --- .../horcrux/svg/RNSVGRenderableManager.java | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/android/src/main/java/com/horcrux/svg/RNSVGRenderableManager.java b/android/src/main/java/com/horcrux/svg/RNSVGRenderableManager.java index 211bbf09..036cf9da 100644 --- a/android/src/main/java/com/horcrux/svg/RNSVGRenderableManager.java +++ b/android/src/main/java/com/horcrux/svg/RNSVGRenderableManager.java @@ -9,6 +9,8 @@ package com.horcrux.svg; +import android.graphics.PathMeasure; + import com.facebook.react.bridge.Callback; import com.facebook.react.bridge.ReactApplicationContext; import com.facebook.react.bridge.ReactContextBaseJavaModule; @@ -72,4 +74,25 @@ class RNSVGRenderableManager extends ReactContextBaseJavaModule { float[] src = new float[] { x, y }; isPointInFill(tag, src, successCallback, 0); } + + @SuppressWarnings("unused") + @ReactMethod + public void getTotalLength(int tag, Callback successCallback) { + RenderableView svg = RenderableViewManager.getRenderableViewByTag(tag); + PathMeasure pm = new PathMeasure(svg.getPath(null, null), false); + successCallback.invoke(pm.getLength()); + } + + @SuppressWarnings("unused") + @ReactMethod + public void getPointAtLength(int tag, ReadableMap options, Callback successCallback) { + float length = (float)options.getDouble("length"); + RenderableView svg = RenderableViewManager.getRenderableViewByTag(tag); + PathMeasure pm = new PathMeasure(svg.getPath(null, null), false); + float pathLength = pm.getLength(); + float[] pos = new float[2]; + float[] tan = new float[2]; + pm.getPosTan(Math.max(0, Math.min(length, pathLength)), pos, tan); + successCallback.invoke(pos[0], pos[1]); + } }