From fd7a85bd9596cc1ec492fa153b1d3765d6f0ff47 Mon Sep 17 00:00:00 2001 From: chuyi Date: Fri, 10 Mar 2017 10:51:48 +0800 Subject: [PATCH 1/3] bug fix. can't set blurRadius dynamic --- .../java/com/taobao/weex/dom/WXStyle.java | 22 +++--------- .../com/taobao/weex/ui/component/WXImage.java | 35 +++++++++++++++---- .../java/com/taobao/weex/utils/WXUtils.java | 22 ++++++++++++ .../java/com/taobao/weex/dom/WXStyleTest.java | 2 +- 4 files changed, 56 insertions(+), 25 deletions(-) diff --git a/android/sdk/src/main/java/com/taobao/weex/dom/WXStyle.java b/android/sdk/src/main/java/com/taobao/weex/dom/WXStyle.java index 4122b4b622..254444b490 100755 --- a/android/sdk/src/main/java/com/taobao/weex/dom/WXStyle.java +++ b/android/sdk/src/main/java/com/taobao/weex/dom/WXStyle.java @@ -245,25 +245,11 @@ public WXStyle(){ } public int getBlur() { - try { - if(get(Constants.Name.FILTER) == null) { - return 0; - } - String value = get(Constants.Name.FILTER).toString().trim(); - int start = value.indexOf("blur("); - int end = value.indexOf("px)"); - if(end == -1) { - end = value.indexOf(")"); - } - if(start == 0 && start < end) { - int blur = Integer.parseInt(value.substring(5,end)); - //unlike css blur filter(https://developer.mozilla.org/en-US/docs/Web/CSS/filter),in weex - //we specify the blur radius in [0,10] to improve performance and avoid potential oom issue. - return Math.min(10,Math.max(0,blur)); - } - }catch (NumberFormatException e) { + if(get(Constants.Name.FILTER) == null) { + return 0; } - return 0; + String value = get(Constants.Name.FILTER).toString().trim(); + return WXUtils.getBlurRadius(value); } /* 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 f893d55302..cbe1936f00 100755 --- 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 @@ -245,7 +245,7 @@ */ @Component(lazyload = false) public class WXImage extends WXComponent { - + private String mSrc; public static class Ceator implements ComponentCreator { public WXComponent createInstance(WXSDKInstance instance, WXDomObject node, WXVContainer parent) throws IllegalAccessException, InvocationTargetException, InstantiationException { return new WXImage(instance,node,parent); @@ -291,10 +291,18 @@ protected boolean setProperty(String key, Object param) { String src = WXUtils.getString(param, null); if (src != null) setSrc(src); + this.mSrc = src; return true; case Constants.Name.IMAGE_QUALITY: return true; case Constants.Name.FILTER: + int blurRadius = 0; + if(param != null && param instanceof String) { + blurRadius = WXUtils.getBlurRadius((String) param); + } + if(!TextUtils.isEmpty(this.mSrc)) { + setBlurRadius(this.mSrc,blurRadius); + } return true; } return super.setProperty(key, param); @@ -362,7 +370,16 @@ public void setSrc(String src) { if (Constants.Scheme.LOCAL.equals(rewrited.getScheme())) { setLocalSrc(rewrited); } else { - setRemoteSrc(rewrited); + setRemoteSrc(rewrited, getBlurRadiusFromStyles()); + } + } + + private void setBlurRadius(@NonNull String src, int blurRadius) { + if(getInstance() != null) { + Uri parsedUri = getInstance().rewriteUri(Uri.parse(src), URIAdapter.IMAGE); + if(!Constants.Scheme.LOCAL.equals(parsedUri.getScheme())) { + setRemoteSrc(parsedUri,blurRadius); + } } } @@ -381,7 +398,7 @@ public void recycled() { } } - private void setRemoteSrc(Uri rewrited) { + private void setRemoteSrc(Uri rewrited,int blurRadius) { WXImageStrategy imageStrategy = new WXImageStrategy(); imageStrategy.isClipping = true; @@ -389,9 +406,7 @@ private void setRemoteSrc(Uri rewrited) { WXImageSharpen imageSharpen = getDomObject().getAttrs().getImageSharpen(); imageStrategy.isSharpen = imageSharpen == WXImageSharpen.SHARPEN; - int radius = getDomObject().getStyles().getBlur(); - radius = Math.max(0, radius); - imageStrategy.blurRadius = Math.min(10, radius); + imageStrategy.blurRadius = Math.max(0, blurRadius); imageStrategy.setImageListener(new WXImageStrategy.ImageListener() { @Override @@ -462,6 +477,14 @@ public void updateProperties(Map props) { } } + private int getBlurRadiusFromStyles() { + if(getDomObject() != null) { + return getDomObject().getStyles().getBlur(); + } else { + return 0; + } + } + public interface Measurable { int getNaturalWidth(); int getNaturalHeight(); diff --git a/android/sdk/src/main/java/com/taobao/weex/utils/WXUtils.java b/android/sdk/src/main/java/com/taobao/weex/utils/WXUtils.java index b2842ebaa2..4a9d52c432 100755 --- a/android/sdk/src/main/java/com/taobao/weex/utils/WXUtils.java +++ b/android/sdk/src/main/java/com/taobao/weex/utils/WXUtils.java @@ -513,6 +513,28 @@ public static String getString(@Nullable Object value,@Nullable String df) { return originValue; } + public static int getBlurRadius(@Nullable String blurRadius) { + if(blurRadius == null || "".equals(blurRadius)) { + return 0; + } + blurRadius = blurRadius.trim(); + try { + int start = blurRadius.indexOf("blur("); + int end = blurRadius.indexOf("px)"); + if(end == -1) { + end = blurRadius.indexOf(')'); + } + if(start == 0 && start < end) { + int blur = Integer.parseInt(blurRadius.substring(5,end)); + //we should not limit blur radius + return Math.max(0,blur); + } + }catch (NumberFormatException e) { + WXLogUtils.e(e.getMessage()); + } + return 0; + } + public static int parseUnitOrPercent(String raw, int unit) { int suffix; if ((suffix = raw.lastIndexOf(WXUtils.PERCENT)) != -1) { diff --git a/android/sdk/src/test/java/com/taobao/weex/dom/WXStyleTest.java b/android/sdk/src/test/java/com/taobao/weex/dom/WXStyleTest.java index 0772804f68..a3397caad9 100644 --- a/android/sdk/src/test/java/com/taobao/weex/dom/WXStyleTest.java +++ b/android/sdk/src/test/java/com/taobao/weex/dom/WXStyleTest.java @@ -254,7 +254,7 @@ public void testBlur() { style.put(Constants.Name.FILTER,"blur(-1px)"); assertEquals(0,style.getBlur()); style.put(Constants.Name.FILTER,"blur(100px)"); - assertEquals(10,style.getBlur()); + assertEquals(100,style.getBlur()); style.put(Constants.Name.FILTER,"blur(1p0px)"); assertEquals(0,style.getBlur()); style.put(Constants.Name.FILTER,"7"); From e29772b6e695acdea89a543ee52bf2c8fea1dec7 Mon Sep 17 00:00:00 2001 From: chuyi Date: Fri, 10 Mar 2017 13:26:07 +0800 Subject: [PATCH 2/3] use FunctionParser --- .../java/com/taobao/weex/dom/WXStyle.java | 9 ++-- .../com/taobao/weex/ui/component/WXImage.java | 52 ++++++++++++++----- .../java/com/taobao/weex/utils/WXUtils.java | 22 -------- .../java/com/taobao/weex/dom/WXStyleTest.java | 23 ++------ .../taobao/weex/utils/FunctionParserTest.java | 11 ++-- 5 files changed, 53 insertions(+), 64 deletions(-) diff --git a/android/sdk/src/main/java/com/taobao/weex/dom/WXStyle.java b/android/sdk/src/main/java/com/taobao/weex/dom/WXStyle.java index 254444b490..d9db03f610 100755 --- a/android/sdk/src/main/java/com/taobao/weex/dom/WXStyle.java +++ b/android/sdk/src/main/java/com/taobao/weex/dom/WXStyle.java @@ -206,6 +206,7 @@ import android.graphics.Typeface; import android.support.annotation.NonNull; +import android.support.annotation.Nullable; import android.support.v4.util.ArrayMap; import android.text.Layout; import android.text.TextUtils; @@ -244,12 +245,12 @@ public WXStyle(){ map = new ArrayMap<>(); } - public int getBlur() { + @Nullable + public String getBlur() { if(get(Constants.Name.FILTER) == null) { - return 0; + return null; } - String value = get(Constants.Name.FILTER).toString().trim(); - return WXUtils.getBlurRadius(value); + return get(Constants.Name.FILTER).toString().trim(); } /* 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 cbe1936f00..2f7eb404bc 100755 --- 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 @@ -210,6 +210,7 @@ import android.net.Uri; import android.os.Build; import android.support.annotation.NonNull; +import android.support.annotation.Nullable; import android.text.TextUtils; import android.widget.ImageView; import android.widget.ImageView.ScaleType; @@ -230,6 +231,7 @@ 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.WXDomUtils; import com.taobao.weex.utils.WXLogUtils; import com.taobao.weex.utils.WXUtils; @@ -238,6 +240,7 @@ import java.lang.reflect.InvocationTargetException; import java.util.Arrays; import java.util.HashMap; +import java.util.List; import java.util.Map; /** @@ -246,6 +249,15 @@ @Component(lazyload = false) public class WXImage extends WXComponent { private String mSrc; + private int mBlurRadius; + + private static SingleFunctionParser.FlatMapper BLUR_RADIUS_MAPPER = new SingleFunctionParser.FlatMapper() { + @Override + public Integer map(String raw) { + return WXUtils.getInteger(raw,0); + } + }; + public static class Ceator implements ComponentCreator { public WXComponent createInstance(WXSDKInstance instance, WXDomObject node, WXVContainer parent) throws IllegalAccessException, InvocationTargetException, InstantiationException { return new WXImage(instance,node,parent); @@ -291,14 +303,13 @@ protected boolean setProperty(String key, Object param) { String src = WXUtils.getString(param, null); if (src != null) setSrc(src); - this.mSrc = src; return true; case Constants.Name.IMAGE_QUALITY: return true; case Constants.Name.FILTER: int blurRadius = 0; if(param != null && param instanceof String) { - blurRadius = WXUtils.getBlurRadius((String) param); + blurRadius = parseBlurRadius((String)param); } if(!TextUtils.isEmpty(this.mSrc)) { setBlurRadius(this.mSrc,blurRadius); @@ -363,19 +374,24 @@ public void setSrc(String src) { if (src == null) { return; } - + this.mSrc = src; WXSDKInstance instance = getInstance(); Uri rewrited = instance.rewriteUri(Uri.parse(src), URIAdapter.IMAGE); if (Constants.Scheme.LOCAL.equals(rewrited.getScheme())) { setLocalSrc(rewrited); } else { - setRemoteSrc(rewrited, getBlurRadiusFromStyles()); + int blur = 0; + if(getDomObject() != null) { + String blurStr = getDomObject().getStyles().getBlur(); + blur = parseBlurRadius(blurStr); + } + setRemoteSrc(rewrited, blur); } } private void setBlurRadius(@NonNull String src, int blurRadius) { - if(getInstance() != null) { + if(getInstance() != null && blurRadius != mBlurRadius) { Uri parsedUri = getInstance().rewriteUri(Uri.parse(src), URIAdapter.IMAGE); if(!Constants.Scheme.LOCAL.equals(parsedUri.getScheme())) { setRemoteSrc(parsedUri,blurRadius); @@ -383,6 +399,23 @@ private void setBlurRadius(@NonNull String src, int blurRadius) { } } + private int parseBlurRadius(@Nullable String rawRadius) { + if(rawRadius == null) { + return 0; + } + SingleFunctionParser parser = new SingleFunctionParser(rawRadius,BLUR_RADIUS_MAPPER); + List list = null; + try { + list = parser.parse("blur"); + }catch (Exception e) { + return 0; + } + if(list == null || list.isEmpty()) { + return 0; + } + return list.get(0); + } + @Override public void recycled() { super.recycled(); @@ -407,6 +440,7 @@ private void setRemoteSrc(Uri rewrited,int blurRadius) { imageStrategy.isSharpen = imageSharpen == WXImageSharpen.SHARPEN; imageStrategy.blurRadius = Math.max(0, blurRadius); + this.mBlurRadius = blurRadius; imageStrategy.setImageListener(new WXImageStrategy.ImageListener() { @Override @@ -477,14 +511,6 @@ public void updateProperties(Map props) { } } - private int getBlurRadiusFromStyles() { - if(getDomObject() != null) { - return getDomObject().getStyles().getBlur(); - } else { - return 0; - } - } - public interface Measurable { int getNaturalWidth(); int getNaturalHeight(); diff --git a/android/sdk/src/main/java/com/taobao/weex/utils/WXUtils.java b/android/sdk/src/main/java/com/taobao/weex/utils/WXUtils.java index 4a9d52c432..b2842ebaa2 100755 --- a/android/sdk/src/main/java/com/taobao/weex/utils/WXUtils.java +++ b/android/sdk/src/main/java/com/taobao/weex/utils/WXUtils.java @@ -513,28 +513,6 @@ public static String getString(@Nullable Object value,@Nullable String df) { return originValue; } - public static int getBlurRadius(@Nullable String blurRadius) { - if(blurRadius == null || "".equals(blurRadius)) { - return 0; - } - blurRadius = blurRadius.trim(); - try { - int start = blurRadius.indexOf("blur("); - int end = blurRadius.indexOf("px)"); - if(end == -1) { - end = blurRadius.indexOf(')'); - } - if(start == 0 && start < end) { - int blur = Integer.parseInt(blurRadius.substring(5,end)); - //we should not limit blur radius - return Math.max(0,blur); - } - }catch (NumberFormatException e) { - WXLogUtils.e(e.getMessage()); - } - return 0; - } - public static int parseUnitOrPercent(String raw, int unit) { int suffix; if ((suffix = raw.lastIndexOf(WXUtils.PERCENT)) != -1) { diff --git a/android/sdk/src/test/java/com/taobao/weex/dom/WXStyleTest.java b/android/sdk/src/test/java/com/taobao/weex/dom/WXStyleTest.java index a3397caad9..3d7f3ad813 100644 --- a/android/sdk/src/test/java/com/taobao/weex/dom/WXStyleTest.java +++ b/android/sdk/src/test/java/com/taobao/weex/dom/WXStyleTest.java @@ -238,27 +238,10 @@ public void setUp() throws Exception { @Test public void testBlur() { assertEquals(0,style.size()); - assertEquals(0,style.getBlur()); + assertEquals(null,style.getBlur()); style.put(Constants.Name.FILTER,"blur(5px)"); - assertEquals(5,style.getBlur()); - style.put(Constants.Name.FILTER,"blur(1)"); - assertEquals(1,style.getBlur()); - style.put(Constants.Name.FILTER,"blur(1dp)"); - assertEquals(0,style.getBlur()); - style.put(Constants.Name.FILTER,"bur(1px)"); - assertEquals(0,style.getBlur()); - style.put(Constants.Name.FILTER,"blur(1px"); - assertEquals(0,style.getBlur()); - style.put(Constants.Name.FILTER,"blur(-1)"); - assertEquals(0,style.getBlur()); - style.put(Constants.Name.FILTER,"blur(-1px)"); - assertEquals(0,style.getBlur()); - style.put(Constants.Name.FILTER,"blur(100px)"); - assertEquals(100,style.getBlur()); - style.put(Constants.Name.FILTER,"blur(1p0px)"); - assertEquals(0,style.getBlur()); - style.put(Constants.Name.FILTER,"7"); - assertEquals(0,style.getBlur()); + assertEquals("blur(5px)",style.getBlur()); + } @Test diff --git a/android/sdk/src/test/java/com/taobao/weex/utils/FunctionParserTest.java b/android/sdk/src/test/java/com/taobao/weex/utils/FunctionParserTest.java index b61a0e3214..9a66d26a5c 100644 --- a/android/sdk/src/test/java/com/taobao/weex/utils/FunctionParserTest.java +++ b/android/sdk/src/test/java/com/taobao/weex/utils/FunctionParserTest.java @@ -206,7 +206,7 @@ import org.junit.Test; -import static org.junit.Assert.*; +import java.util.List; /** * Created by sospartan on 27/09/2016. @@ -215,11 +215,12 @@ public class FunctionParserTest { @Test public void testParse() throws Exception { - new SingleFunctionParser("transform(50 , 20)", new SingleFunctionParser.FlatMapper() { + List s = new SingleFunctionParser<>("blur(5px)", new SingleFunctionParser.FlatMapper() { @Override - public String map(String raw) { - return null; + public Integer map(String raw) { + return WXUtils.getInteger(raw,0); } - }).parse("transform"); + }).parse("blur"); + System.out.println(s); } } \ No newline at end of file From df001bb73008448771e8b27264ba0dfc784b6ce5 Mon Sep 17 00:00:00 2001 From: chuyi Date: Tue, 14 Mar 2017 11:42:48 +0800 Subject: [PATCH 3/3] break change. blur refactor --- .../src/main/java/com/taobao/weex/common/WXImageStrategy.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/android/sdk/src/main/java/com/taobao/weex/common/WXImageStrategy.java b/android/sdk/src/main/java/com/taobao/weex/common/WXImageStrategy.java index f952a9e4bb..fe7ec9b36c 100755 --- a/android/sdk/src/main/java/com/taobao/weex/common/WXImageStrategy.java +++ b/android/sdk/src/main/java/com/taobao/weex/common/WXImageStrategy.java @@ -221,7 +221,7 @@ public class WXImageStrategy { public boolean isSharpen; /** - * The blur radius of the image. [0,10],0 means no blur. + * The blur radius of the image. 0 means no blur. * */ public int blurRadius;