mirror of
https://github.com/zoriya/react-native-svg.git
synced 2026-06-09 09:27:20 +00:00
run hitTest only if necessary(Android)
This commit is contained in:
@@ -12,17 +12,10 @@ package com.horcrux.svg;
|
||||
import android.graphics.Canvas;
|
||||
import android.graphics.Paint;
|
||||
import android.graphics.Path;
|
||||
import android.graphics.Rect;
|
||||
import android.graphics.RectF;
|
||||
import android.util.Log;
|
||||
|
||||
import com.facebook.common.logging.FLog;
|
||||
|
||||
import com.facebook.react.bridge.ReadableMap;
|
||||
import com.facebook.react.common.ReactConstants;
|
||||
import com.facebook.react.uimanager.annotations.ReactProp;
|
||||
|
||||
import javax.annotation.Nullable;
|
||||
|
||||
/**
|
||||
* Shadow node for virtual RNSVGPath view
|
||||
|
||||
@@ -12,7 +12,6 @@ package com.horcrux.svg;
|
||||
import android.graphics.Canvas;
|
||||
import android.graphics.Paint;
|
||||
import android.graphics.Path;
|
||||
import android.graphics.Rect;
|
||||
import android.graphics.RectF;
|
||||
import android.util.Log;
|
||||
|
||||
|
||||
@@ -17,6 +17,7 @@ import android.util.Log;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
|
||||
import com.facebook.react.uimanager.ReactShadowNode;
|
||||
import com.facebook.react.uimanager.annotations.ReactProp;
|
||||
|
||||
/**
|
||||
@@ -37,12 +38,18 @@ public class RNSVGGroupShadowNode extends RNSVGVirtualNode {
|
||||
if (opacity > MIN_OPACITY_FOR_DRAW) {
|
||||
saveAndSetupCanvas(canvas);
|
||||
clip(canvas, paint);
|
||||
RNSVGSvgViewShadowNode svg = getSvgView();
|
||||
|
||||
if (mAsClipPath == null) {
|
||||
for (int i = 0; i < getChildCount(); i++) {
|
||||
RNSVGVirtualNode child = (RNSVGVirtualNode) getChildAt(i);
|
||||
child.setDimensions(mWidth, mHeight);
|
||||
child.draw(canvas, paint, opacity);
|
||||
child.markUpdateSeen();
|
||||
|
||||
if (child.isTouchable() && !svg.touchable) {
|
||||
svg.touchable = true;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
defineClipPath(getPath(canvas, paint), mAsClipPath);
|
||||
@@ -54,6 +61,7 @@ public class RNSVGGroupShadowNode extends RNSVGVirtualNode {
|
||||
@Override
|
||||
protected Path getPath(Canvas canvas, Paint paint) {
|
||||
Path path = new Path();
|
||||
|
||||
for (int i = 0; i < getChildCount(); i++) {
|
||||
RNSVGVirtualNode child = (RNSVGVirtualNode) getChildAt(i);
|
||||
path.addPath(child.getPath(canvas, paint));
|
||||
@@ -79,4 +87,13 @@ public class RNSVGGroupShadowNode extends RNSVGVirtualNode {
|
||||
|
||||
return viewTag;
|
||||
}
|
||||
|
||||
private RNSVGSvgViewShadowNode getSvgView() {
|
||||
ReactShadowNode parent = getParent();
|
||||
|
||||
while (!(parent instanceof RNSVGSvgViewShadowNode)) {
|
||||
parent = parent.getParent();
|
||||
}
|
||||
return (RNSVGSvgViewShadowNode)parent;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -15,6 +15,8 @@ import android.graphics.Bitmap;
|
||||
import android.graphics.BitmapFactory;
|
||||
import android.graphics.Canvas;
|
||||
import android.graphics.Paint;
|
||||
import android.graphics.Rect;
|
||||
import android.graphics.RectF;
|
||||
import android.net.Uri;
|
||||
import android.os.AsyncTask;
|
||||
import android.provider.MediaStore;
|
||||
@@ -72,10 +74,15 @@ public class RNSVGImageShadowNode extends RNSVGPathShadowNode {
|
||||
// Once complete, see if ImageView is still around and set bitmap.
|
||||
@Override
|
||||
protected void onPostExecute(@Nullable Bitmap bitmap) {
|
||||
|
||||
if (bitmap != null) {
|
||||
float x = PropHelper.fromPercentageToFloat(mX, mWidth, 0, mScale);
|
||||
float y = PropHelper.fromPercentageToFloat(mY, mHeight, 0, mScale);
|
||||
float w = PropHelper.fromPercentageToFloat(mW, mWidth, 0, mScale);
|
||||
float h = PropHelper.fromPercentageToFloat(mH, mHeight, 0, mScale);
|
||||
|
||||
clip(mCanvas, mPaint);
|
||||
mCanvas.restoreToCount(1);
|
||||
mCanvas.drawBitmap(bitmap, 0f, 0f, mPaint);
|
||||
mCanvas.drawBitmap(bitmap, null, new Rect((int)x, (int)y, (int)(x + w), (int)(y + h)), null);
|
||||
mCanvas.restoreToCount(2);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -23,6 +23,8 @@ import com.facebook.react.uimanager.UIViewOperationQueue;
|
||||
* Shadow node for RNSVG virtual tree root - RNSVGSvgView
|
||||
*/
|
||||
public class RNSVGSvgViewShadowNode extends LayoutShadowNode {
|
||||
public boolean touchable = false;
|
||||
|
||||
@Override
|
||||
public void onCollectExtraUpdates(UIViewOperationQueue uiUpdater) {
|
||||
super.onCollectExtraUpdates(uiUpdater);
|
||||
@@ -46,12 +48,20 @@ public class RNSVGSvgViewShadowNode extends LayoutShadowNode {
|
||||
child.setDimensions(width, height);
|
||||
child.draw(canvas, paint, 1f);
|
||||
child.markUpdateSeen();
|
||||
|
||||
if (child.isTouchable() && !touchable) {
|
||||
touchable = true;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
return bitmap;
|
||||
}
|
||||
|
||||
public int hitTest(Point point, ViewGroup view) {
|
||||
if (!touchable) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
int count = getChildCount();
|
||||
int viewTag = -1;
|
||||
for (int i = count - 1; i >= 0; i--) {
|
||||
|
||||
@@ -67,6 +67,7 @@ public abstract class RNSVGVirtualNode extends LayoutShadowNode {
|
||||
|
||||
protected float mWidth = 0;
|
||||
protected float mHeight = 0;
|
||||
protected boolean mTouchable;
|
||||
|
||||
public RNSVGVirtualNode() {
|
||||
mScale = DisplayMetricsHolder.getWindowDisplayMetrics().density;
|
||||
@@ -143,6 +144,12 @@ public abstract class RNSVGVirtualNode extends LayoutShadowNode {
|
||||
markUpdated();
|
||||
}
|
||||
|
||||
@ReactProp(name = "touchable", defaultBoolean = false)
|
||||
public void setTouchable(boolean touchable) {
|
||||
mTouchable = touchable;
|
||||
markUpdated();
|
||||
}
|
||||
|
||||
private void setupClip() {
|
||||
if (mClipDataSet && mClipRuleSet) {
|
||||
mClipPath = new Path();
|
||||
@@ -281,6 +288,10 @@ public abstract class RNSVGVirtualNode extends LayoutShadowNode {
|
||||
mDefinedClipPathId = clipPathId;
|
||||
}
|
||||
|
||||
public boolean isTouchable() {
|
||||
return mTouchable;
|
||||
}
|
||||
|
||||
abstract protected Path getPath(Canvas canvas, Paint paint);
|
||||
|
||||
protected void finalize() {
|
||||
|
||||
Reference in New Issue
Block a user