mirror of
https://github.com/zoriya/react-native-svg.git
synced 2026-05-27 12:41:49 +00:00
add onLoad prop to Image component (#2293)
# Summary Closes #1442 We want to add new props to the Image Component. ## Test Plan Added the Test component. Manually test that in Android and IOS platforms on new and old Architectures. ### What are the steps to reproduce (after prerequisites)? ## Compatibility | OS | Implemented | | ------- | :---------: | | iOS | ✅ | | Android | ✅ |
This commit is contained in:
@@ -30,8 +30,12 @@ import com.facebook.react.bridge.Dynamic;
|
||||
import com.facebook.react.bridge.ReactContext;
|
||||
import com.facebook.react.bridge.ReadableMap;
|
||||
import com.facebook.react.common.ReactConstants;
|
||||
import com.facebook.react.uimanager.UIManagerHelper;
|
||||
import com.facebook.react.uimanager.events.EventDispatcher;
|
||||
import com.facebook.react.views.imagehelper.ImageSource;
|
||||
import com.facebook.react.views.imagehelper.ResourceDrawableIdHelper;
|
||||
import com.horcrux.svg.events.SvgLoadEvent;
|
||||
|
||||
import java.util.concurrent.atomic.AtomicBoolean;
|
||||
import javax.annotation.Nonnull;
|
||||
import javax.annotation.Nullable;
|
||||
@@ -137,6 +141,15 @@ class ImageView extends RenderableView {
|
||||
new BaseBitmapDataSubscriber() {
|
||||
@Override
|
||||
public void onNewResultImpl(Bitmap bitmap) {
|
||||
final EventDispatcher mEventDispatcher =
|
||||
UIManagerHelper.getEventDispatcherForReactTag(mContext, getId());
|
||||
mEventDispatcher.dispatchEvent(new SvgLoadEvent(
|
||||
UIManagerHelper.getSurfaceId(ImageView.this),
|
||||
getId(),
|
||||
mContext,
|
||||
uriString,
|
||||
bitmap.getWidth(),
|
||||
bitmap.getHeight()));
|
||||
mLoading.set(false);
|
||||
SvgView view = getSvgView();
|
||||
if (view != null) {
|
||||
|
||||
@@ -82,6 +82,7 @@ import com.facebook.react.bridge.JavaOnlyMap;
|
||||
import com.facebook.react.bridge.ReadableArray;
|
||||
import com.facebook.react.bridge.ReadableMap;
|
||||
import com.facebook.react.bridge.ReadableType;
|
||||
import com.facebook.react.common.MapBuilder;
|
||||
import com.facebook.react.uimanager.DisplayMetricsHolder;
|
||||
import com.facebook.react.uimanager.LayoutShadowNode;
|
||||
import com.facebook.react.uimanager.MatrixMathHelper;
|
||||
@@ -134,7 +135,10 @@ import com.facebook.react.viewmanagers.RNSVGTextPathManagerDelegate;
|
||||
import com.facebook.react.viewmanagers.RNSVGTextPathManagerInterface;
|
||||
import com.facebook.react.viewmanagers.RNSVGUseManagerDelegate;
|
||||
import com.facebook.react.viewmanagers.RNSVGUseManagerInterface;
|
||||
import com.horcrux.svg.events.SvgLoadEvent;
|
||||
import java.util.HashMap;
|
||||
import java.util.Locale;
|
||||
import java.util.Map;
|
||||
import javax.annotation.Nonnull;
|
||||
import javax.annotation.Nullable;
|
||||
|
||||
@@ -926,6 +930,12 @@ class RenderableViewManager<T extends RenderableView> extends VirtualViewManager
|
||||
public void setMeetOrSlice(ImageView node, int meetOrSlice) {
|
||||
node.setMeetOrSlice(meetOrSlice);
|
||||
}
|
||||
|
||||
public Map<String, Object> getExportedCustomDirectEventTypeConstants() {
|
||||
Map<String, Object> eventTypes = new HashMap<>();
|
||||
eventTypes.put(SvgLoadEvent.EVENT_NAME, MapBuilder.of("registrationName", "onLoad"));
|
||||
return eventTypes;
|
||||
}
|
||||
}
|
||||
|
||||
static class CircleViewManager extends RenderableViewManager<CircleView>
|
||||
|
||||
@@ -0,0 +1,47 @@
|
||||
package com.horcrux.svg.events;
|
||||
|
||||
import com.facebook.react.bridge.Arguments;
|
||||
import com.facebook.react.bridge.ReactContext;
|
||||
import com.facebook.react.bridge.WritableMap;
|
||||
import com.facebook.react.uimanager.events.Event;
|
||||
import com.facebook.react.uimanager.events.RCTEventEmitter;
|
||||
import com.facebook.react.views.imagehelper.ImageSource;
|
||||
|
||||
public class SvgLoadEvent extends Event<SvgLoadEvent> {
|
||||
|
||||
public static final String EVENT_NAME = "topLoad";
|
||||
private final float width;
|
||||
private final float height;
|
||||
private final String uri;
|
||||
|
||||
public SvgLoadEvent(int surfaceId, int viewId, ReactContext mContext, String uriString, float width, float height) {
|
||||
super(surfaceId, viewId);
|
||||
ImageSource imageSource = new ImageSource(mContext, uriString);
|
||||
this.uri = imageSource.getSource();;
|
||||
this.width = width;
|
||||
this.height = height;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getEventName() {
|
||||
return EVENT_NAME;
|
||||
}
|
||||
|
||||
@Override
|
||||
public short getCoalescingKey() {
|
||||
return 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void dispatch(RCTEventEmitter rctEventEmitter) {
|
||||
rctEventEmitter.receiveEvent(getViewTag(), getEventName(), getEventData());
|
||||
}
|
||||
|
||||
protected WritableMap getEventData() {
|
||||
WritableMap eventData = Arguments.createMap();
|
||||
eventData.putDouble("width", width);
|
||||
eventData.putDouble("height", height);
|
||||
eventData.putString("uri", uri);
|
||||
return eventData;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user