Implement @ReactProp nativeBackgroundAndroid in RCTView
Summary: RCTView has a property called nativeBackgroundAndroid that shows a ripple effect (or any other Drawable) when pressed and holded. This diff is adding support for the property. Reviewed By: ahmedre Differential Revision: D2768671
This commit is contained in:
parent
381bf1b76f
commit
c144bcbc96
|
@ -16,6 +16,7 @@ import javax.annotation.Nullable;
|
||||||
|
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.graphics.Canvas;
|
import android.graphics.Canvas;
|
||||||
|
import android.graphics.drawable.Drawable;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.view.ViewGroup;
|
import android.view.ViewGroup;
|
||||||
import android.view.ViewParent;
|
import android.view.ViewParent;
|
||||||
|
@ -56,6 +57,7 @@ import com.facebook.react.uimanager.ReactCompoundView;
|
||||||
private int mDrawChildIndex = 0;
|
private int mDrawChildIndex = 0;
|
||||||
private boolean mIsAttached = false;
|
private boolean mIsAttached = false;
|
||||||
private boolean mIsLayoutRequested = false;
|
private boolean mIsLayoutRequested = false;
|
||||||
|
private Drawable mHotspot;
|
||||||
|
|
||||||
/* package */ FlatViewGroup(Context context) {
|
/* package */ FlatViewGroup(Context context) {
|
||||||
super(context);
|
super(context);
|
||||||
|
@ -101,6 +103,10 @@ import com.facebook.react.uimanager.ReactCompoundView;
|
||||||
"Did not draw all children: " + mDrawChildIndex + " / " + getChildCount());
|
"Did not draw all children: " + mDrawChildIndex + " / " + getChildCount());
|
||||||
}
|
}
|
||||||
mDrawChildIndex = 0;
|
mDrawChildIndex = 0;
|
||||||
|
|
||||||
|
if (mHotspot != null) {
|
||||||
|
mHotspot.draw(canvas);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -140,6 +146,56 @@ import com.facebook.react.uimanager.ReactCompoundView;
|
||||||
dispatchOnDetached(mAttachDetachListeners);
|
dispatchOnDetached(mAttachDetachListeners);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
|
||||||
|
if (mHotspot != null) {
|
||||||
|
mHotspot.setBounds(0, 0, w, h);
|
||||||
|
invalidate();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void dispatchDrawableHotspotChanged(float x, float y) {
|
||||||
|
if (mHotspot != null) {
|
||||||
|
mHotspot.setHotspot(x, y);
|
||||||
|
invalidate();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void drawableStateChanged() {
|
||||||
|
super.drawableStateChanged();
|
||||||
|
|
||||||
|
if (mHotspot != null && mHotspot.isStateful()) {
|
||||||
|
mHotspot.setState(getDrawableState());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void jumpDrawablesToCurrentState() {
|
||||||
|
super.jumpDrawablesToCurrentState();
|
||||||
|
if (mHotspot != null) {
|
||||||
|
mHotspot.jumpToCurrentState();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* package */ void setHotspot(Drawable hotspot) {
|
||||||
|
if (mHotspot != null) {
|
||||||
|
mHotspot.setCallback(null);
|
||||||
|
unscheduleDrawable(mHotspot);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (hotspot != null) {
|
||||||
|
hotspot.setCallback(this);
|
||||||
|
if (hotspot.isStateful()) {
|
||||||
|
hotspot.setState(getDrawableState());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
mHotspot = hotspot;
|
||||||
|
invalidate();
|
||||||
|
}
|
||||||
|
|
||||||
/* package */ void drawNextChild(Canvas canvas) {
|
/* package */ void drawNextChild(Canvas canvas) {
|
||||||
View child = getChildAt(mDrawChildIndex);
|
View child = getChildAt(mDrawChildIndex);
|
||||||
super.drawChild(canvas, child, getDrawingTime());
|
super.drawChild(canvas, child, getDrawingTime());
|
||||||
|
|
|
@ -11,6 +11,7 @@ package com.facebook.react.flat;
|
||||||
|
|
||||||
import javax.annotation.Nullable;
|
import javax.annotation.Nullable;
|
||||||
|
|
||||||
|
import com.facebook.react.bridge.ReadableMap;
|
||||||
import com.facebook.react.uimanager.PixelUtil;
|
import com.facebook.react.uimanager.PixelUtil;
|
||||||
import com.facebook.react.uimanager.ReactProp;
|
import com.facebook.react.uimanager.ReactProp;
|
||||||
import com.facebook.react.uimanager.ReactPropGroup;
|
import com.facebook.react.uimanager.ReactPropGroup;
|
||||||
|
@ -48,6 +49,13 @@ import com.facebook.react.uimanager.ViewProps;
|
||||||
getMutableBorder().setBorderWidth(type, PixelUtil.toPixelFromDIP(borderWidth));
|
getMutableBorder().setBorderWidth(type, PixelUtil.toPixelFromDIP(borderWidth));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ReactProp(name = "nativeBackgroundAndroid")
|
||||||
|
public void setHotspot(@Nullable ReadableMap bg) {
|
||||||
|
if (bg != null) {
|
||||||
|
forceMountToView();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@ReactPropGroup(names = {
|
@ReactPropGroup(names = {
|
||||||
"borderColor", "borderLeftColor", "borderRightColor", "borderTopColor", "borderBottomColor"
|
"borderColor", "borderLeftColor", "borderRightColor", "borderTopColor", "borderBottomColor"
|
||||||
}, customType = "Color", defaultDouble = Double.NaN)
|
}, customType = "Color", defaultDouble = Double.NaN)
|
||||||
|
|
|
@ -9,16 +9,42 @@
|
||||||
|
|
||||||
package com.facebook.react.flat;
|
package com.facebook.react.flat;
|
||||||
|
|
||||||
|
import javax.annotation.Nullable;
|
||||||
|
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
import android.os.Build;
|
||||||
|
|
||||||
|
import com.facebook.react.bridge.JSApplicationIllegalArgumentException;
|
||||||
|
import com.facebook.react.bridge.ReadableArray;
|
||||||
|
import com.facebook.react.bridge.ReadableMap;
|
||||||
|
import com.facebook.react.common.MapBuilder;
|
||||||
|
import com.facebook.react.uimanager.PixelUtil;
|
||||||
|
import com.facebook.react.uimanager.ReactProp;
|
||||||
|
import com.facebook.react.uimanager.ReactPropGroup;
|
||||||
|
import com.facebook.react.uimanager.ThemedReactContext;
|
||||||
|
import com.facebook.react.uimanager.ViewProps;
|
||||||
|
import com.facebook.react.views.view.ReactDrawableHelper;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* ViewManager that creates instances of RCTView.
|
* ViewManager that creates instances of RCTView.
|
||||||
*/
|
*/
|
||||||
/* package */ final class RCTViewManager extends FlatViewManager {
|
/* package */ final class RCTViewManager extends FlatViewManager {
|
||||||
|
|
||||||
|
private static final int[] TMP_INT_ARRAY = new int[2];
|
||||||
|
|
||||||
|
private static final int CMD_HOTSPOT_UPDATE = 1;
|
||||||
|
private static final int CMD_SET_PRESSED = 2;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getName() {
|
public String getName() {
|
||||||
return "RCTView";
|
return "RCTView";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Map<String, Integer> getCommandsMap() {
|
||||||
|
return MapBuilder.of("hotspotUpdate", CMD_HOTSPOT_UPDATE, "setPressed", CMD_SET_PRESSED);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public RCTView createShadowNodeInstance() {
|
public RCTView createShadowNodeInstance() {
|
||||||
return new RCTView();
|
return new RCTView();
|
||||||
|
@ -28,4 +54,40 @@ package com.facebook.react.flat;
|
||||||
public Class<RCTView> getShadowNodeClass() {
|
public Class<RCTView> getShadowNodeClass() {
|
||||||
return RCTView.class;
|
return RCTView.class;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ReactProp(name = "nativeBackgroundAndroid")
|
||||||
|
public void setHotspot(FlatViewGroup view, @Nullable ReadableMap bg) {
|
||||||
|
view.setHotspot(bg == null ?
|
||||||
|
null : ReactDrawableHelper.createDrawableFromJSDescription(view.getContext(), bg));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void receiveCommand(
|
||||||
|
FlatViewGroup view,
|
||||||
|
int commandId,
|
||||||
|
@Nullable ReadableArray args) {
|
||||||
|
switch (commandId) {
|
||||||
|
case CMD_HOTSPOT_UPDATE: {
|
||||||
|
if (args == null || args.size() != 2) {
|
||||||
|
throw new JSApplicationIllegalArgumentException(
|
||||||
|
"Illegal number of arguments for 'updateHotspot' command");
|
||||||
|
}
|
||||||
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
|
||||||
|
view.getLocationOnScreen(TMP_INT_ARRAY);
|
||||||
|
float x = PixelUtil.toPixelFromDIP(args.getDouble(0)) - TMP_INT_ARRAY[0];
|
||||||
|
float y = PixelUtil.toPixelFromDIP(args.getDouble(1)) - TMP_INT_ARRAY[1];
|
||||||
|
view.drawableHotspotChanged(x, y);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case CMD_SET_PRESSED: {
|
||||||
|
if (args == null || args.size() != 1) {
|
||||||
|
throw new JSApplicationIllegalArgumentException(
|
||||||
|
"Illegal number of arguments for 'setPressed' command");
|
||||||
|
}
|
||||||
|
view.setPressed(args.getBoolean(0));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue