diff --git a/android/sdk/src/main/java/com/taobao/weex/ui/component/WXSlider.java b/android/sdk/src/main/java/com/taobao/weex/ui/component/WXSlider.java index eaacf5a6ab..3b65c02c1e 100644 --- a/android/sdk/src/main/java/com/taobao/weex/ui/component/WXSlider.java +++ b/android/sdk/src/main/java/com/taobao/weex/ui/component/WXSlider.java @@ -38,6 +38,7 @@ import com.taobao.weex.dom.WXEvent; import com.taobao.weex.ui.ComponentCreator; import com.taobao.weex.ui.action.BasicComponentData; +import com.taobao.weex.ui.view.BaseFrameLayout; import com.taobao.weex.ui.view.WXCircleIndicator; import com.taobao.weex.ui.view.WXCirclePageAdapter; import com.taobao.weex.ui.view.WXCircleViewPager; @@ -104,8 +105,8 @@ public WXSlider(WXSDKInstance instance, WXVContainer parent, BasicComponentData } @Override - protected FrameLayout initComponentHostView(@NonNull Context context) { - FrameLayout view = new FrameLayout(context); + protected BaseFrameLayout initComponentHostView(@NonNull Context context) { + BaseFrameLayout view = new BaseFrameLayout(context); // init view pager if (getAttrs() != null) { Object obj = getAttrs().get(INFINITE); diff --git a/android/sdk/src/main/java/com/taobao/weex/ui/component/WXSliderNeighbor.java b/android/sdk/src/main/java/com/taobao/weex/ui/component/WXSliderNeighbor.java index a7e95d0f46..bfcaa4b603 100644 --- a/android/sdk/src/main/java/com/taobao/weex/ui/component/WXSliderNeighbor.java +++ b/android/sdk/src/main/java/com/taobao/weex/ui/component/WXSliderNeighbor.java @@ -31,6 +31,7 @@ import com.taobao.weex.common.WXThread; import com.taobao.weex.ui.ComponentCreator; import com.taobao.weex.ui.action.BasicComponentData; +import com.taobao.weex.ui.view.BaseFrameLayout; import com.taobao.weex.ui.view.WXCircleIndicator; import com.taobao.weex.ui.view.WXCirclePageAdapter; import com.taobao.weex.ui.view.WXCircleViewPager; @@ -79,8 +80,8 @@ public void bindData(WXComponent component) { } @Override - protected FrameLayout initComponentHostView(@NonNull Context context) { - FrameLayout view = new FrameLayout(context); + protected BaseFrameLayout initComponentHostView(@NonNull Context context) { + BaseFrameLayout view = new BaseFrameLayout(context); // init view pager FrameLayout.LayoutParams pagerParams = new FrameLayout.LayoutParams( diff --git a/android/sdk/src/main/java/com/taobao/weex/ui/view/BaseFrameLayout.java b/android/sdk/src/main/java/com/taobao/weex/ui/view/BaseFrameLayout.java new file mode 100644 index 0000000000..e12d52edbc --- /dev/null +++ b/android/sdk/src/main/java/com/taobao/weex/ui/view/BaseFrameLayout.java @@ -0,0 +1,79 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package com.taobao.weex.ui.view; + +import android.content.Context; +import android.graphics.Canvas; +import android.graphics.drawable.Drawable; +import android.support.annotation.NonNull; +import android.widget.FrameLayout; +import com.taobao.weex.ui.flat.widget.Widget; +import com.taobao.weex.utils.WXLogUtils; +import com.taobao.weex.utils.WXViewUtils; +import java.util.List; + +public class BaseFrameLayout extends FrameLayout{ + private List mWidgets; + + public BaseFrameLayout(Context context){ + super(context); + } + + @Override + protected void dispatchDraw(Canvas canvas) { + try { + dispatchDrawInterval(canvas); + } catch (Throwable e) { + WXLogUtils.e(WXLogUtils.getStackTrace(e)); + } + } + + protected void dispatchDrawInterval(Canvas canvas) { + if (mWidgets != null) { + canvas.save(); + canvas.translate(getPaddingLeft(), getPaddingTop()); + for (Widget widget : mWidgets) { + widget.draw(canvas); + } + canvas.restore(); + } else { + WXViewUtils.clipCanvasWithinBorderBox(this, canvas); + super.dispatchDraw(canvas); + } + } + public void mountFlatGUI(List widgets){ + this.mWidgets = widgets; + if (mWidgets != null) { + setWillNotDraw(true); + } + invalidate(); + } + + public void unmountFlatGUI(){ + mWidgets = null; + setWillNotDraw(false); + invalidate(); + } + + @Override + protected boolean verifyDrawable(@NonNull Drawable who) { + return mWidgets != null || super.verifyDrawable(who); + } + +} diff --git a/android/sdk/src/main/java/com/taobao/weex/ui/view/WXFrameLayout.java b/android/sdk/src/main/java/com/taobao/weex/ui/view/WXFrameLayout.java index 91d4b29aa5..04b8257097 100644 --- a/android/sdk/src/main/java/com/taobao/weex/ui/view/WXFrameLayout.java +++ b/android/sdk/src/main/java/com/taobao/weex/ui/view/WXFrameLayout.java @@ -20,47 +20,48 @@ import android.content.Context; import android.graphics.Canvas; -import android.graphics.drawable.Drawable; -import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.view.MotionEvent; import android.view.View; -import android.widget.FrameLayout; - import com.taobao.weex.WXSDKInstance; import com.taobao.weex.WXSDKManager; import com.taobao.weex.common.Constants; import com.taobao.weex.common.WXErrorCode; import com.taobao.weex.ui.component.WXComponent; import com.taobao.weex.ui.component.WXDiv; -import com.taobao.weex.ui.flat.widget.Widget; import com.taobao.weex.ui.view.gesture.WXGesture; import com.taobao.weex.ui.view.gesture.WXGestureObservable; import com.taobao.weex.utils.WXExceptionUtils; import com.taobao.weex.utils.WXLogUtils; -import com.taobao.weex.utils.WXViewUtils; - import java.lang.ref.WeakReference; import java.util.HashMap; -import java.util.List; import java.util.Map; /** * FrameLayout wrapper * */ -public class WXFrameLayout extends FrameLayout implements WXGestureObservable,IRenderStatus,IRenderResult { - - private WXGesture wxGesture; +public class WXFrameLayout extends BaseFrameLayout implements WXGestureObservable,IRenderStatus,IRenderResult{ private WeakReference mWeakReference; + private WXGesture wxGesture; - private List mWidgets; public WXFrameLayout(Context context) { super(context); } + @Nullable + @Override + public WXDiv getComponent() { + return null != mWeakReference ? mWeakReference.get() : null; + } + + @Override + public void holdComponent(WXDiv component) { + mWeakReference = new WeakReference(component); + } + @Override public void registerGestureListener(WXGesture wxGesture) { this.wxGesture = wxGesture; @@ -79,41 +80,10 @@ public boolean dispatchTouchEvent(MotionEvent event) { } return result; } - - @Override - public void holdComponent(WXDiv component) { - mWeakReference = new WeakReference(component); - } - - @Nullable - @Override - public WXDiv getComponent() { - return null != mWeakReference ? mWeakReference.get() : null; - } - - public void mountFlatGUI(List widgets){ - this.mWidgets = widgets; - if (mWidgets != null) { - setWillNotDraw(true); - } - invalidate(); - } - - public void unmountFlatGUI(){ - mWidgets = null; - setWillNotDraw(false); - invalidate(); - } - - @Override - protected boolean verifyDrawable(@NonNull Drawable who) { - return mWidgets != null || super.verifyDrawable(who); - } - @Override protected void dispatchDraw(Canvas canvas) { try { - dispatchDrawInterval(canvas); + super.dispatchDrawInterval(canvas); } catch (Throwable e) { if (getComponent() != null) { notifyLayerOverFlow(); @@ -128,7 +98,6 @@ protected void dispatchDraw(Canvas canvas) { WXLogUtils.e("Layer overflow limit error", WXLogUtils.getStackTrace(e)); } } - private int reportLayerOverFlowError() { int deep = calLayerDeep(this, 0); if (getComponent() != null) { @@ -140,21 +109,6 @@ private int reportLayerOverFlowError() { } return deep; } - - private void dispatchDrawInterval(Canvas canvas) { - if (mWidgets != null) { - canvas.save(); - canvas.translate(getPaddingLeft(), getPaddingTop()); - for (Widget widget : mWidgets) { - widget.draw(canvas); - } - canvas.restore(); - } else { - WXViewUtils.clipCanvasWithinBorderBox(this, canvas); - super.dispatchDraw(canvas); - } - } - private int calLayerDeep(View view, int deep) { deep++; if (view.getParent() != null && view.getParent() instanceof View) { @@ -182,4 +136,5 @@ public void notifyLayerOverFlow() { component.fireEvent(Constants.Event.LAYEROVERFLOW, params); } } + }