Repository: incubator-weex Updated Branches: refs/heads/0.16-dev 4025b5b36 -> 849ed3eb7
* [android] Refactor the code of resize attr on image. The "resize" attribute on image doesn't depend on ImageView.setScaleType any longer, BitmapShader can do all the work. * [android] Update WXImage Project: http://git-wip-us.apache.org/repos/asf/incubator-weex/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-weex/commit/849ed3eb Tree: http://git-wip-us.apache.org/repos/asf/incubator-weex/tree/849ed3eb Diff: http://git-wip-us.apache.org/repos/asf/incubator-weex/diff/849ed3eb Branch: refs/heads/0.16-dev Commit: 849ed3eb76fc5cf64065d5f8834cc5be3fa4f20c Parents: 4025b5b Author: YorkShen <shenyua...@gmail.com> Authored: Tue Aug 22 11:37:04 2017 +0800 Committer: YorkShen <shenyua...@gmail.com> Committed: Wed Aug 23 16:06:36 2017 +0800 ---------------------------------------------------------------------- .../commons/adapter/FrescoImageComponent.java | 2 +- .../com/taobao/weex/ui/component/WXImage.java | 75 ++++++++++---------- .../com/taobao/weex/ui/view/WXImageView.java | 16 ++++- .../com/taobao/weex/utils/ImageDrawable.java | 17 ++--- 4 files changed, 56 insertions(+), 54 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/849ed3eb/android/commons/src/main/java/com/alibaba/weex/commons/adapter/FrescoImageComponent.java ---------------------------------------------------------------------- diff --git a/android/commons/src/main/java/com/alibaba/weex/commons/adapter/FrescoImageComponent.java b/android/commons/src/main/java/com/alibaba/weex/commons/adapter/FrescoImageComponent.java index 109302f..8573e8a 100644 --- a/android/commons/src/main/java/com/alibaba/weex/commons/adapter/FrescoImageComponent.java +++ b/android/commons/src/main/java/com/alibaba/weex/commons/adapter/FrescoImageComponent.java @@ -38,7 +38,7 @@ public class FrescoImageComponent extends WXImage { @Override protected ImageView initComponentHostView(@NonNull Context context) { FrescoImageView view = new FrescoImageView(context); - view.setScaleType(ImageView.ScaleType.FIT_XY); + view.setScaleType(WXImage.DEFAULT_SCALE_TYPE); return view; } http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/849ed3eb/android/sdk/src/main/java/com/taobao/weex/ui/component/WXImage.java ---------------------------------------------------------------------- diff --git a/android/sdk/src/main/java/com/taobao/weex/ui/component/WXImage.java b/android/sdk/src/main/java/com/taobao/weex/ui/component/WXImage.java index db58d99..8fda814 100644 --- a/android/sdk/src/main/java/com/taobao/weex/ui/component/WXImage.java +++ b/android/sdk/src/main/java/com/taobao/weex/ui/component/WXImage.java @@ -31,7 +31,6 @@ import android.support.v4.content.ContextCompat; import android.text.TextUtils; import android.widget.ImageView; import android.widget.ImageView.ScaleType; - import com.taobao.weex.WXEnvironment; import com.taobao.weex.WXSDKInstance; import com.taobao.weex.adapter.IWXImgLoaderAdapter; @@ -51,12 +50,11 @@ import com.taobao.weex.ui.view.border.BorderDrawable; import com.taobao.weex.utils.ImageDrawable; import com.taobao.weex.utils.ImgURIUtil; import com.taobao.weex.utils.SingleFunctionParser; -import com.taobao.weex.utils.WXViewToImageUtil; import com.taobao.weex.utils.WXDomUtils; import com.taobao.weex.utils.WXLogUtils; import com.taobao.weex.utils.WXUtils; +import com.taobao.weex.utils.WXViewToImageUtil; import com.taobao.weex.utils.WXViewUtils; - import java.lang.reflect.InvocationTargetException; import java.util.Arrays; import java.util.HashMap; @@ -71,6 +69,7 @@ public class WXImage extends WXComponent<ImageView> { public static final String SUCCEED = "success"; public static final String ERRORDESC = "errorDesc"; + public final static ScaleType DEFAULT_SCALE_TYPE = ScaleType.FIT_XY; private String mSrc; private int mBlurRadius; @@ -102,7 +101,7 @@ public class WXImage extends WXComponent<ImageView> { @Override protected ImageView initComponentHostView(@NonNull Context context) { WXImageView view = new WXImageView(context); - view.setScaleType(ScaleType.FIT_XY); + view.setScaleType(DEFAULT_SCALE_TYPE); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { view.setCropToPadding(true); } @@ -153,32 +152,23 @@ public class WXImage extends WXComponent<ImageView> { @WXComponentProp(name = Constants.Name.RESIZE_MODE) public void setResizeMode(String resizeMode) { - (getHostView()).setScaleType(getResizeMode(resizeMode)); - } - - private ScaleType getResizeMode(String resizeMode) { - ScaleType scaleType = ScaleType.FIT_XY; - if (TextUtils.isEmpty(resizeMode)) { - return scaleType; - } - - switch (resizeMode) { - case "cover": - scaleType = ScaleType.CENTER_CROP; - break; - case "contain": - scaleType = ScaleType.FIT_CENTER; - break; - case "stretch": - scaleType = ScaleType.FIT_XY; - break; - } - return scaleType; + setResize(resizeMode); } @WXComponentProp(name = Constants.Name.RESIZE) public void setResize(String resize) { - (getHostView()).setScaleType(getResizeMode(resize)); + ScaleType scaleType = DEFAULT_SCALE_TYPE; + if (!TextUtils.isEmpty(resize)) { + switch (resize) { + case "cover": + scaleType = ScaleType.CENTER_CROP; + break; + case "contain": + scaleType = ScaleType.FIT_CENTER; + break; + } + } + getHostView().setScaleType(scaleType); } /** @@ -321,27 +311,34 @@ public class WXImage extends WXComponent<ImageView> { if ((imageDom = getDomObject()) != null && getHostView() instanceof WXImageView) { imageView = (WXImageView) getHostView(); - BorderDrawable borderDrawable = WXViewUtils.getBorderDrawable(getHostView()); - float[] borderRadius; - if (borderDrawable != null) { - RectF borderBox = new RectF(0, 0, WXDomUtils.getContentWidth(imageDom), WXDomUtils.getContentHeight(imageDom)); - borderRadius = borderDrawable.getBorderRadius(borderBox); - } else { - borderRadius = new float[]{0, 0, 0, 0, 0, 0, 0, 0}; - } + BorderDrawable borderDrawable = WXViewUtils.getBorderDrawable(imageView); + float[] borderRadius = extractBorderRadius(imageDom, borderDrawable); imageView.setBorderRadius(borderRadius); if (imageView.getDrawable() instanceof ImageDrawable) { - ImageDrawable imageDrawable = (ImageDrawable) imageView.getDrawable(); - float[] previousRadius = imageDrawable.getCornerRadii(); - if (!Arrays.equals(previousRadius, borderRadius)) { - imageDrawable.setCornerRadii(borderRadius); - } + updateImageDrawable(borderRadius, (ImageDrawable) imageView.getDrawable()); } readyToRender(); } } + private void updateImageDrawable(float[] borderRadius, ImageDrawable imageDrawable) { + if (!Arrays.equals(imageDrawable.getCornerRadii(), borderRadius)) { + imageDrawable.setCornerRadii(borderRadius); + } + } + + private float[] extractBorderRadius(ImmutableDomObject imageDom, BorderDrawable borderDrawable) { + float[] borderRadius; + if (borderDrawable != null) { + RectF borderBox = new RectF(0, 0, WXDomUtils.getContentWidth(imageDom), WXDomUtils.getContentHeight(imageDom)); + borderRadius = borderDrawable.getBorderRadius(borderBox); + } else { + borderRadius = new float[]{0, 0, 0, 0, 0, 0, 0, 0}; + } + return borderRadius; + } + /** * Need permission {android.permission.WRITE_EXTERNAL_STORAGE} */ http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/849ed3eb/android/sdk/src/main/java/com/taobao/weex/ui/view/WXImageView.java ---------------------------------------------------------------------- diff --git a/android/sdk/src/main/java/com/taobao/weex/ui/view/WXImageView.java b/android/sdk/src/main/java/com/taobao/weex/ui/view/WXImageView.java index dd7b2bc..6125aeb 100644 --- a/android/sdk/src/main/java/com/taobao/weex/ui/view/WXImageView.java +++ b/android/sdk/src/main/java/com/taobao/weex/ui/view/WXImageView.java @@ -27,13 +27,11 @@ import android.support.annotation.Nullable; import android.view.MotionEvent; import android.view.ViewGroup; import android.widget.ImageView; - import com.taobao.weex.ui.component.WXImage; import com.taobao.weex.ui.view.gesture.WXGesture; import com.taobao.weex.ui.view.gesture.WXGestureObservable; import com.taobao.weex.utils.ImageDrawable; import com.taobao.weex.utils.WXLogUtils; - import java.lang.ref.WeakReference; import java.util.Arrays; @@ -45,6 +43,7 @@ public class WXImageView extends ImageView implements WXGestureObservable, private WXGesture wxGesture; private float[] borderRadius; private boolean gif; + private ScaleType mScaleType = WXImage.DEFAULT_SCALE_TYPE; public WXImageView(Context context) { super(context); @@ -129,6 +128,19 @@ public class WXImageView extends ImageView implements WXGestureObservable, } @Override + public void setScaleType(ScaleType scaleType) { + if(scaleType == WXImage.DEFAULT_SCALE_TYPE){ + super.setScaleType(scaleType); + } + mScaleType = scaleType; + } + + @Override + public ScaleType getScaleType() { + return mScaleType; + } + + @Override public int getNaturalWidth() { Drawable drawable = getDrawable(); if (drawable != null) { http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/849ed3eb/android/sdk/src/main/java/com/taobao/weex/utils/ImageDrawable.java ---------------------------------------------------------------------- diff --git a/android/sdk/src/main/java/com/taobao/weex/utils/ImageDrawable.java b/android/sdk/src/main/java/com/taobao/weex/utils/ImageDrawable.java index 142bf7a..16a939e 100644 --- a/android/sdk/src/main/java/com/taobao/weex/utils/ImageDrawable.java +++ b/android/sdk/src/main/java/com/taobao/weex/utils/ImageDrawable.java @@ -68,25 +68,18 @@ public class ImageDrawable extends PaintDrawable { Matrix matrix = createShaderMatrix(scaleType, vWidth, vHeight, imageDrawable.bitmapWidth, imageDrawable.bitmapHeight); - int intrinsicWidth = vWidth, intrinsicHeight = vHeight; - if (scaleType == ImageView.ScaleType.FIT_CENTER) { - RectF bitmapRect = new RectF(0, 0, imageDrawable.bitmapWidth, imageDrawable.bitmapHeight), contentRect = new RectF(); - matrix.mapRect(contentRect, bitmapRect); - intrinsicWidth = (int) contentRect.width(); - intrinsicHeight = (int) contentRect.height(); - matrix = createShaderMatrix(scaleType, intrinsicWidth, intrinsicHeight, imageDrawable - .bitmapWidth, imageDrawable.bitmapHeight); - } - imageDrawable.setIntrinsicWidth(intrinsicWidth); - imageDrawable.setIntrinsicHeight(intrinsicHeight); + imageDrawable.setIntrinsicWidth(vWidth); + imageDrawable.setIntrinsicHeight(vHeight); bitmapShader.setLocalMatrix(matrix); } + + @NonNull private static Matrix createShaderMatrix(@NonNull ImageView.ScaleType scaleType, int vWidth, int vHeight, int bmWidth, int bmHeight) { + //Refer ImageView#configureBounds() float scale, translateX = 0, translateY = 0; - if (bmWidth * vHeight > bmHeight * vWidth) { scale = vHeight / (float) bmHeight; translateX = (vWidth - bmWidth * scale) * 0.5f;