You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@weex.apache.org by ky...@apache.org on 2017/08/23 08:31:06 UTC

incubator-weex git commit: * [android] Refactor the code of resize attr on image.

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 <sh...@gmail.com>
Authored: Tue Aug 22 11:37:04 2017 +0800
Committer: YorkShen <sh...@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;