Hi friends,
This is essentially a continuation of this post
http://www.coderzheaven.com/2018/08/10/how-to-create-a-custom-native-imageview-in-android-for-reactnative/
Now we will listen to a click event from the image we just created.
For that we have to add the ClickListener to the image in Android.
reactImageView.setOnClickListener(this); // implement the ClickListener to the class.
Add below methods to the java class
@Override public void onClick(View v) { WritableMap params = Arguments.createMap(); params.putInt("ID", v.getId()); sendEvent(reactContext, "clickEvent", params); } private void sendEvent(ReactContext reactContext, String eventName, @Nullable WritableMap params) { reactContext .getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class) .emit(eventName, params); }
On the React Native Side
DeviceEventEmitter.addListener("clickEvent", function(e: Event) { alert("Clicked :: " + e.ID); });
The whole java class will look like this.
import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.os.Handler; import android.support.annotation.Nullable; import android.util.Log; import android.view.View; import com.facebook.drawee.backends.pipeline.Fresco; import com.facebook.react.bridge.Arguments; import com.facebook.react.bridge.Callback; import com.facebook.react.bridge.ReactContext; import com.facebook.react.bridge.WritableMap; import com.facebook.react.modules.core.DeviceEventManagerModule; import com.facebook.react.uimanager.SimpleViewManager; import com.facebook.react.uimanager.ThemedReactContext; import com.facebook.react.uimanager.annotations.ReactProp; import com.facebook.react.views.image.ReactImageView; import java.net.URL; public class ReactImageManager extends SimpleViewManager<ReactImageView> implements View.OnClickListener { public static final String REACT_CLASS = "RCTImageView1"; private final @Nullable Object mCallerContext = null; private ImgStartListener imgStartListener; private Callback clickCallback; private ThemedReactContext reactContext; /* Interface Listener to start loading the image if the source is set */ private interface ImgStartListener { void startLoading(String imgUrl); } @Override public String getName() { return REACT_CLASS; } /* Method which sets the source from React Native */ @ReactProp(name = "src") public void setSrc(ReactImageView view, String uri) { imgStartListener.startLoading(uri); } @Override protected ReactImageView createViewInstance(ThemedReactContext reactContext) { this.reactContext = reactContext; final ReactImageView reactImageView = new ReactImageView(reactContext, Fresco.newDraweeControllerBuilder(), null, mCallerContext); final Handler handler = new Handler(); imgStartListener = new ImgStartListener() { @Override public void startLoading(final String imgUrl) { startDownloading(imgUrl, handler, reactImageView); } }; reactImageView.setOnClickListener(this); return reactImageView; } private void startDownloading(final String imgUrl, final Handler handler, final ReactImageView reactImageView) { new Thread(new Runnable() { @Override public void run() { try { URL url = new URL(imgUrl); final Bitmap bmp = BitmapFactory.decodeStream(url.openConnection().getInputStream()); setImage(bmp, handler, reactImageView); } catch (Exception e) { Log.e("ReactImageManager", "Error : " + e.getMessage()); } } }).start(); } private void setImage(final Bitmap bmp, Handler handler, final ReactImageView reactImageView) { handler.post(new Runnable() { @Override public void run() { reactImageView.setImageBitmap(bmp); } }); } @Override public void onClick(View v) { WritableMap params = Arguments.createMap(); params.putInt("ID", v.getId()); sendEvent(reactContext, "clickEvent", params); } private void sendEvent(ReactContext reactContext, String eventName, @Nullable WritableMap params) { reactContext .getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class) .emit(eventName, params); } }