mirror of
https://github.com/zhigang1992/react-native.git
synced 2026-04-08 22:42:05 +08:00
Refactor nodes to lazy-load image from source
Summary: This is needed for the upcoming loading from multiple sources (D3364550 for the non-nodes version) and cache interrogation (D3392751 for non-nodes version). This postpones creating the DraweeRequestHelper until the image size is known, which in the nodes universe is when `onBoundsChanged` is called. Reviewed By: foghina, ahmedre Differential Revision: D3413467
This commit is contained in:
committed by
Ahmed El-Helw
parent
4ecfa0c800
commit
f2a6570b07
@@ -11,8 +11,9 @@ package com.facebook.react.flat;
|
||||
|
||||
import javax.annotation.Nullable;
|
||||
|
||||
import android.content.Context;
|
||||
|
||||
import com.facebook.drawee.drawable.ScalingUtils.ScaleType;
|
||||
import com.facebook.imagepipeline.request.ImageRequest;
|
||||
|
||||
/**
|
||||
* Common interface for DrawImageWithPipeline and DrawImageWithDrawee.
|
||||
@@ -25,9 +26,9 @@ import com.facebook.imagepipeline.request.ImageRequest;
|
||||
boolean hasImageRequest();
|
||||
|
||||
/**
|
||||
* Assigns a new image request to the DrawImage, or null to clear the image request.
|
||||
* Assigns a new image source to the DrawImage, or null to clear the image request.
|
||||
*/
|
||||
void setImageRequest(@Nullable ImageRequest imageRequest);
|
||||
void setSource(Context context, @Nullable String source);
|
||||
|
||||
/**
|
||||
* Assigns a tint color to apply to the image drawn.
|
||||
|
||||
@@ -11,6 +11,7 @@ package com.facebook.react.flat;
|
||||
|
||||
import javax.annotation.Nullable;
|
||||
|
||||
import android.content.Context;
|
||||
import android.graphics.Canvas;
|
||||
import android.graphics.PorterDuff;
|
||||
import android.graphics.PorterDuffColorFilter;
|
||||
@@ -33,6 +34,8 @@ import com.facebook.react.views.image.ReactImageView;
|
||||
/* package */ final class DrawImageWithDrawee extends AbstractDrawCommand
|
||||
implements DrawImage, ControllerListener {
|
||||
|
||||
private @Nullable String mSource;
|
||||
private @Nullable Context mContext;
|
||||
private @Nullable DraweeRequestHelper mRequestHelper;
|
||||
private @Nullable PorterDuffColorFilter mColorFilter;
|
||||
private ScaleType mScaleType = ImageResizeMode.defaultValue();
|
||||
@@ -45,16 +48,13 @@ import com.facebook.react.views.image.ReactImageView;
|
||||
|
||||
@Override
|
||||
public boolean hasImageRequest() {
|
||||
return mRequestHelper != null;
|
||||
return mSource != null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setImageRequest(@Nullable ImageRequest imageRequest) {
|
||||
if (imageRequest == null) {
|
||||
mRequestHelper = null;
|
||||
} else {
|
||||
mRequestHelper = new DraweeRequestHelper(imageRequest, this);
|
||||
}
|
||||
public void setSource(Context context, @Nullable String source) {
|
||||
mSource = source;
|
||||
mContext = context;
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -199,6 +199,26 @@ import com.facebook.react.views.image.ReactImageView;
|
||||
public void onRelease(String id) {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onBoundsChanged() {
|
||||
super.onBoundsChanged();
|
||||
maybeComputeRequestHelper();
|
||||
}
|
||||
|
||||
private void maybeComputeRequestHelper() {
|
||||
if (mRequestHelper != null) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (mSource == null) {
|
||||
mRequestHelper = null;
|
||||
return;
|
||||
}
|
||||
ImageRequest imageRequest =
|
||||
ImageRequestHelper.createImageRequest(Assertions.assertNotNull(mContext), mSource);
|
||||
mRequestHelper = new DraweeRequestHelper(Assertions.assertNotNull(imageRequest), this);
|
||||
}
|
||||
|
||||
private boolean shouldDisplayBorder() {
|
||||
return mBorderColor != 0 || mBorderRadius >= 0.5f;
|
||||
}
|
||||
|
||||
@@ -11,6 +11,7 @@ package com.facebook.react.flat;
|
||||
|
||||
import javax.annotation.Nullable;
|
||||
|
||||
import android.content.Context;
|
||||
import android.graphics.Bitmap;
|
||||
import android.graphics.BitmapShader;
|
||||
import android.graphics.Canvas;
|
||||
@@ -37,6 +38,8 @@ import com.facebook.react.views.image.ReactImageView;
|
||||
private static final Paint PAINT = new Paint(Paint.ANTI_ALIAS_FLAG | Paint.FILTER_BITMAP_FLAG);
|
||||
private static final int BORDER_BITMAP_PATH_DIRTY = 1 << 1;
|
||||
|
||||
private @Nullable String mSource;
|
||||
private @Nullable Context mContext;
|
||||
private final Matrix mTransform = new Matrix();
|
||||
private ScaleType mScaleType = ImageResizeMode.defaultValue();
|
||||
private @Nullable PipelineRequestHelper mRequestHelper;
|
||||
@@ -58,14 +61,10 @@ import com.facebook.react.views.image.ReactImageView;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setImageRequest(@Nullable ImageRequest imageRequest) {
|
||||
public void setSource(Context context, @Nullable String source) {
|
||||
mSource = source;
|
||||
mContext = context;
|
||||
mBitmapShader = null;
|
||||
|
||||
if (imageRequest == null) {
|
||||
mRequestHelper = null;
|
||||
} else {
|
||||
mRequestHelper = new PipelineRequestHelper(imageRequest);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -184,6 +183,7 @@ import com.facebook.react.views.image.ReactImageView;
|
||||
protected void onBoundsChanged() {
|
||||
super.onBoundsChanged();
|
||||
setFlag(BORDER_BITMAP_PATH_DIRTY);
|
||||
maybeComputeRequestHelper();
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -203,6 +203,20 @@ import com.facebook.react.views.image.ReactImageView;
|
||||
}
|
||||
}
|
||||
|
||||
private void maybeComputeRequestHelper() {
|
||||
if (mRequestHelper == null) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (mSource == null) {
|
||||
mRequestHelper = null;
|
||||
return;
|
||||
}
|
||||
ImageRequest imageRequest =
|
||||
ImageRequestHelper.createImageRequest(Assertions.assertNotNull(mContext), mSource);
|
||||
mRequestHelper = new PipelineRequestHelper(Assertions.assertNotNull(imageRequest));
|
||||
}
|
||||
|
||||
/* package */ void updateBounds(Bitmap bitmap) {
|
||||
Assertions.assumeNotNull(mCallback).invalidate();
|
||||
|
||||
|
||||
@@ -15,8 +15,8 @@ import com.facebook.csslayout.Spacing;
|
||||
import com.facebook.drawee.drawable.ScalingUtils.ScaleType;
|
||||
import com.facebook.react.bridge.ReadableArray;
|
||||
import com.facebook.react.uimanager.PixelUtil;
|
||||
import com.facebook.react.uimanager.annotations.ReactProp;
|
||||
import com.facebook.react.uimanager.ViewProps;
|
||||
import com.facebook.react.uimanager.annotations.ReactProp;
|
||||
import com.facebook.react.views.image.ImageResizeMode;
|
||||
|
||||
/**
|
||||
@@ -90,8 +90,7 @@ import com.facebook.react.views.image.ImageResizeMode;
|
||||
public void setSource(@Nullable ReadableArray sources) {
|
||||
final String source =
|
||||
(sources == null || sources.size() == 0) ? null : sources.getMap(0).getString("uri");
|
||||
getMutableDrawImage().setImageRequest(
|
||||
ImageRequestHelper.createImageRequest(getThemedContext(), source));
|
||||
getMutableDrawImage().setSource(getThemedContext(), source);
|
||||
}
|
||||
|
||||
@ReactProp(name = "tintColor")
|
||||
@@ -143,8 +142,4 @@ import com.facebook.react.views.image.ImageResizeMode;
|
||||
|
||||
return mDrawImage;
|
||||
}
|
||||
|
||||
private static boolean isNetworkResource(String source) {
|
||||
return source.startsWith("http://") || source.startsWith("https://");
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user