From e777ac8dd8f02805c5adee19364d87ee5c40bf9d Mon Sep 17 00:00:00 2001 From: misakuo Date: Tue, 10 Oct 2017 18:20:24 +0800 Subject: [PATCH 1/3] * [android] fix flicker caused by coexistence of box-shadow and border-radius --- .../taobao/weex/ui/component/WXComponent.java | 25 +++++++------------ .../weex/ui/component/WXVContainer.java | 25 ++++++++++++++++++- 2 files changed, 33 insertions(+), 17 deletions(-) diff --git a/android/sdk/src/main/java/com/taobao/weex/ui/component/WXComponent.java b/android/sdk/src/main/java/com/taobao/weex/ui/component/WXComponent.java index d801290f76..74e4db4cc5 100644 --- a/android/sdk/src/main/java/com/taobao/weex/ui/component/WXComponent.java +++ b/android/sdk/src/main/java/com/taobao/weex/ui/component/WXComponent.java @@ -759,22 +759,9 @@ protected boolean setProperty(String key, Object param) { case Constants.Name.BORDER_TOP_RIGHT_RADIUS: case Constants.Name.BORDER_BOTTOM_RIGHT_RADIUS: case Constants.Name.BORDER_BOTTOM_LEFT_RADIUS: - final Float radius = WXUtils.getFloat(param,null); - final String finalKey = key; + Float radius = WXUtils.getFloat(param,null); if (radius != null) { - if (this instanceof WXDiv && mHost != null) { - /* Hacked by moxun - Set border radius on ViewGroup will cause the Overlay to be cut and don't know why - Delay setting border radius can avoid the problem, and don't know why too, dog science…… */ - mHost.postDelayed(new Runnable() { - @Override - public void run() { - setBorderRadius(finalKey, radius); - } - }, 64); - } else { - setBorderRadius(finalKey, radius); - } + setBorderRadius(key, radius); } return true; case Constants.Name.BORDER_WIDTH: @@ -898,7 +885,13 @@ protected void updateBoxShadow() { } } } - BoxShadowUtil.setBoxShadow(mHost, boxShadow.toString(), radii, getInstance().getInstanceViewPortWidth()); + + View target = mHost; + if (this instanceof WXVContainer) { + target = ((WXVContainer) this).getBoxShadowHost(); + } + + BoxShadowUtil.setBoxShadow(target, boxShadow.toString(), radii, getInstance().getInstanceViewPortWidth()); } else { WXLogUtils.w("Can not resolve styles"); } diff --git a/android/sdk/src/main/java/com/taobao/weex/ui/component/WXVContainer.java b/android/sdk/src/main/java/com/taobao/weex/ui/component/WXVContainer.java index 43b45a711d..45707299dd 100644 --- a/android/sdk/src/main/java/com/taobao/weex/ui/component/WXVContainer.java +++ b/android/sdk/src/main/java/com/taobao/weex/ui/component/WXVContainer.java @@ -18,15 +18,19 @@ */ package com.taobao.weex.ui.component; +import android.content.Context; import android.content.Intent; -import android.util.Pair; import android.support.annotation.Nullable; +import android.util.Pair; import android.view.Menu; import android.view.View; import android.view.ViewGroup; + import com.taobao.weex.WXSDKInstance; import com.taobao.weex.common.Constants; import com.taobao.weex.dom.WXDomObject; +import com.taobao.weex.utils.WXViewUtils; + import java.util.ArrayList; /** @@ -36,6 +40,7 @@ public abstract class WXVContainer extends WXComponent { private static final String TAG="WXVContainer"; protected ArrayList mChildren = new ArrayList<>(); + private BoxShadowHost mBoxShadowHost; @Deprecated public WXVContainer(WXSDKInstance instance, WXDomObject dom, WXVContainer parent, String instanceId, boolean isLazy) { @@ -474,4 +479,22 @@ public void onRenderFinish(@RenderState int state) { /******************************** * end hook Activity life cycle callback ********************************************************/ + + public @Nullable View getBoxShadowHost() { + if (mBoxShadowHost == null) { + mBoxShadowHost = new BoxShadowHost(getContext()); + WXViewUtils.setBackGround(mBoxShadowHost, null); + mBoxShadowHost.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT)); + getHostView().addView(mBoxShadowHost); + } + getHostView().removeView(mBoxShadowHost); + getHostView().addView(mBoxShadowHost); + return mBoxShadowHost; + } + + private class BoxShadowHost extends View { + public BoxShadowHost(Context context) { + super(context); + } + } } From d5731c2caceb94f6b7cd942ae50683b38846d3c1 Mon Sep 17 00:00:00 2001 From: misakuo Date: Wed, 11 Oct 2017 18:10:48 +0800 Subject: [PATCH 2/3] * [android] fix shadow remains after component size changed --- .../taobao/weex/ui/component/WXComponent.java | 29 +++++++++++++++---- 1 file changed, 24 insertions(+), 5 deletions(-) diff --git a/android/sdk/src/main/java/com/taobao/weex/ui/component/WXComponent.java b/android/sdk/src/main/java/com/taobao/weex/ui/component/WXComponent.java index 74e4db4cc5..3c0c87030d 100644 --- a/android/sdk/src/main/java/com/taobao/weex/ui/component/WXComponent.java +++ b/android/sdk/src/main/java/com/taobao/weex/ui/component/WXComponent.java @@ -509,6 +509,8 @@ private void setComponentLayoutParams(int realWidth, int realHeight, int realLef setWidgetParams(widget, UIImp, rawOffset, realWidth, realHeight, realLeft, realRight, realTop, realBottom); } else if (mHost != null) { + // clear box shadow before host's size changed + clearBoxShadow(); if (mDomObj.isFixed()) { setFixedHostLayoutParams(mHost, realWidth, realHeight, realLeft, realRight, realTop, realBottom); @@ -520,6 +522,8 @@ private void setComponentLayoutParams(int realWidth, int realHeight, int realLef mPreRealLeft = realLeft; mPreRealTop = realTop; onFinishLayout(); + // restore box shadow + updateBoxShadow(); } } @@ -859,6 +863,15 @@ protected void updateBoxShadow() { return; } + View target = mHost; + if (this instanceof WXVContainer) { + target = ((WXVContainer) this).getBoxShadowHost(); + } + + if (target == null) { + return; + } + float[] radii = new float[] {0, 0, 0, 0, 0, 0, 0, 0}; WXStyle style = getDomObject().getStyles(); if (style != null) { @@ -886,17 +899,23 @@ protected void updateBoxShadow() { } } - View target = mHost; - if (this instanceof WXVContainer) { - target = ((WXVContainer) this).getBoxShadowHost(); - } - BoxShadowUtil.setBoxShadow(target, boxShadow.toString(), radii, getInstance().getInstanceViewPortWidth()); } else { WXLogUtils.w("Can not resolve styles"); } } + protected void clearBoxShadow() { + View target = mHost; + if (this instanceof WXVContainer) { + target = ((WXVContainer) this).getBoxShadowHost(); + } + + if (target != null && Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) { + target.getOverlay().clear(); + } + } + @TargetApi(Build.VERSION_CODES.JELLY_BEAN) protected void setAriaHidden(boolean isHidden) { View host = getHostView(); From 61ead2a4226ee0f17863d4c10699167b265fa0ae Mon Sep 17 00:00:00 2001 From: misakuo Date: Wed, 11 Oct 2017 19:44:16 +0800 Subject: [PATCH 3/3] * [android] null judgement --- .../main/java/com/taobao/weex/ui/component/WXComponent.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/android/sdk/src/main/java/com/taobao/weex/ui/component/WXComponent.java b/android/sdk/src/main/java/com/taobao/weex/ui/component/WXComponent.java index 3c0c87030d..add0205272 100644 --- a/android/sdk/src/main/java/com/taobao/weex/ui/component/WXComponent.java +++ b/android/sdk/src/main/java/com/taobao/weex/ui/component/WXComponent.java @@ -43,6 +43,7 @@ import android.view.View; import android.view.ViewGroup; import android.view.ViewGroup.MarginLayoutParams; +import android.view.ViewOverlay; import android.widget.FrameLayout; import com.alibaba.fastjson.JSONArray; @@ -912,7 +913,10 @@ protected void clearBoxShadow() { } if (target != null && Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) { - target.getOverlay().clear(); + ViewOverlay overlay = target.getOverlay(); + if (overlay != null) { + overlay.clear(); + } } }