* [android] better solution for draw box-shadow

Project: http://git-wip-us.apache.org/repos/asf/incubator-weex/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-weex/commit/0839ee18
Tree: http://git-wip-us.apache.org/repos/asf/incubator-weex/tree/0839ee18
Diff: http://git-wip-us.apache.org/repos/asf/incubator-weex/diff/0839ee18

Branch: refs/heads/release
Commit: 0839ee18c27c52a9030e06c3e2cd5142ee6db616
Parents: fa4726a
Author: misakuo <misa...@apache.org>
Authored: Wed Sep 27 15:22:02 2017 +0800
Committer: misakuo <misa...@apache.org>
Committed: Wed Sep 27 15:22:02 2017 +0800

----------------------------------------------------------------------
 .../com/taobao/weex/utils/BoxShadowUtil.java    | 47 ++++++++------------
 1 file changed, 19 insertions(+), 28 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/0839ee18/android/sdk/src/main/java/com/taobao/weex/utils/BoxShadowUtil.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/main/java/com/taobao/weex/utils/BoxShadowUtil.java 
b/android/sdk/src/main/java/com/taobao/weex/utils/BoxShadowUtil.java
index b1ebb63..c1cc693 100644
--- a/android/sdk/src/main/java/com/taobao/weex/utils/BoxShadowUtil.java
+++ b/android/sdk/src/main/java/com/taobao/weex/utils/BoxShadowUtil.java
@@ -20,6 +20,7 @@ package com.taobao.weex.utils;
 
 import android.content.res.Resources;
 import android.graphics.Bitmap;
+import android.graphics.BlurMaskFilter;
 import android.graphics.Canvas;
 import android.graphics.Color;
 import android.graphics.ColorFilter;
@@ -40,6 +41,8 @@ import android.util.Log;
 import android.view.View;
 import android.view.ViewGroup;
 
+import com.taobao.weex.WXEnvironment;
+
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
@@ -103,18 +106,21 @@ public class BoxShadowUtil {
                                            float[] radii, float shadowRadius,
                                            float shadowSpread,
                                            float dx, float dy, int 
shadowColor) {
-
-    if (shadowRadius == 0) {
-      // 0 can not draw shadow layer
-      shadowRadius = 0.01f;
-    }
-
     int canvasWidth = viewWidth + 2 * (int) (shadowRadius + shadowSpread + 
Math.abs(dx));
     int canvasHeight = viewHeight + 2 * (int) (shadowRadius + shadowSpread + 
Math.abs(dy));
 
     Bitmap output = Bitmap.createBitmap(canvasWidth, canvasHeight, 
Bitmap.Config.ARGB_8888);
     Canvas canvas = new Canvas(output);
 
+    if (false && WXEnvironment.isApkDebugable()) {
+      // Using for debug
+      Paint strokePaint = new Paint();
+      strokePaint.setColor(Color.BLACK);
+      strokePaint.setStrokeWidth(2);
+      strokePaint.setStyle(Paint.Style.STROKE);
+      canvas.drawRect(canvas.getClipBounds(), strokePaint);
+    }
+
     float offsetX = shadowRadius + shadowSpread + Math.abs(dx);
     float offsetY = shadowRadius + shadowSpread + Math.abs(dy);
     RectF selfRect = new RectF(
@@ -127,36 +133,21 @@ public class BoxShadowUtil {
     // can not antialias
     canvas.clipPath(contentPath, Region.Op.DIFFERENCE);
 
-    float shadowLeft, shadowTop;
-    if (shadowSpread == 0f) {
-      shadowLeft = shadowRadius;
-      shadowTop = shadowRadius;
-    } else {
-      shadowLeft = shadowRadius + dx - shadowSpread;
-      shadowTop = shadowRadius + dy - shadowSpread;
-    }
     RectF shadowRect = new RectF(
-        shadowLeft,
-        shadowTop,
-        canvasWidth - shadowRadius + shadowSpread,
-        canvasHeight - shadowRadius + shadowSpread);
+        0f, 0f,
+        viewWidth + 2f * shadowSpread, viewHeight + 2f * shadowSpread
+    );
 
-    shadowRect.top += Math.abs(dy);
-    shadowRect.bottom -= Math.abs(dy);
-    shadowRect.left += Math.abs(dx);
-    shadowRect.right -= Math.abs(dx);
+    float shadowDx = 2f * dx + shadowRadius;
+    float shadowDy = 2f * dy + shadowRadius;
+    shadowRect.offset(shadowDx, shadowDy);
 
     Paint shadowPaint = new Paint();
     shadowPaint.setAntiAlias(true);
     shadowPaint.setColor(shadowColor);
     shadowPaint.setStyle(Paint.Style.FILL);
 
-    float shadowDx = 0f, shadowDy = 0f;
-    if (shadowSpread == 0f) {
-      shadowDx = dx;
-      shadowDy = dy;
-    }
-    shadowPaint.setShadowLayer(shadowRadius, shadowDx, shadowDy, shadowColor);
+    shadowPaint.setMaskFilter(new BlurMaskFilter(shadowRadius, 
BlurMaskFilter.Blur.NORMAL));
 
     Path shadowPath = new Path();
     float[] shadowRadii = new float[8];

Reply via email to