feat:Android only add DoricLayer when needed,and align contentview's size to refreshable itself

This commit is contained in:
pengfei.zhou 2019-11-28 10:28:24 +08:00
parent 10f159cfee
commit ddc1442815
12 changed files with 103 additions and 76 deletions

View File

@ -28,7 +28,6 @@ import pub.doric.extension.bridge.DoricMethod;
import pub.doric.extension.bridge.DoricPlugin; import pub.doric.extension.bridge.DoricPlugin;
import pub.doric.extension.bridge.DoricPromise; import pub.doric.extension.bridge.DoricPromise;
import pub.doric.navbar.IDoricNavBar; import pub.doric.navbar.IDoricNavBar;
import pub.doric.utils.DoricUtils;
import pub.doric.utils.ThreadMode; import pub.doric.utils.ThreadMode;
/** /**
@ -62,7 +61,7 @@ public class NavBarPlugin extends DoricJavaPlugin {
JSObject jsObject = jsDecoder.decode().asObject(); JSObject jsObject = jsDecoder.decode().asObject();
boolean hidden = jsObject.getProperty("hidden").asBoolean().value(); boolean hidden = jsObject.getProperty("hidden").asBoolean().value();
navBar.setHidden(hidden); navBar.setHidden(hidden);
View v = getDoricContext().getRootNode().getDoricLayer(); View v = getDoricContext().getRootNode().getNodeView();
ViewGroup.LayoutParams params = v.getLayoutParams(); ViewGroup.LayoutParams params = v.getLayoutParams();
if (params instanceof ViewGroup.MarginLayoutParams) { if (params instanceof ViewGroup.MarginLayoutParams) {
((ViewGroup.MarginLayoutParams) params).topMargin = ((ViewGroup.MarginLayoutParams) params).topMargin =

View File

@ -85,7 +85,7 @@ public class RefreshableNode extends SuperNode<DoricSwipeLayout> implements Pull
mContentNode.setId(viewId); mContentNode.setId(viewId);
mContentNode.init(this); mContentNode.init(this);
mContentNode.blend(props); mContentNode.blend(props);
mView.addView(mContentNode.getDoricLayer()); mView.addView(mContentNode.getNodeView());
} }
} }
} else { } else {
@ -93,7 +93,7 @@ public class RefreshableNode extends SuperNode<DoricSwipeLayout> implements Pull
mContentNode.setId(viewId); mContentNode.setId(viewId);
mContentNode.init(this); mContentNode.init(this);
mContentNode.blend(props); mContentNode.blend(props);
mView.addView(mContentNode.getDoricLayer()); mView.addView(mContentNode.getNodeView());
} }
} }
@ -117,7 +117,7 @@ public class RefreshableNode extends SuperNode<DoricSwipeLayout> implements Pull
mHeaderNode.setId(viewId); mHeaderNode.setId(viewId);
mHeaderNode.init(this); mHeaderNode.init(this);
mHeaderNode.blend(props); mHeaderNode.blend(props);
mView.getRefreshView().setContent(mHeaderNode.getDoricLayer()); mView.getRefreshView().setContent(mHeaderNode.getNodeView());
} }
} }
} else { } else {
@ -125,7 +125,7 @@ public class RefreshableNode extends SuperNode<DoricSwipeLayout> implements Pull
mHeaderNode.setId(viewId); mHeaderNode.setId(viewId);
mHeaderNode.init(this); mHeaderNode.init(this);
mHeaderNode.blend(props); mHeaderNode.blend(props);
mView.getRefreshView().setContent(mHeaderNode.getDoricLayer()); mView.getRefreshView().setContent(mHeaderNode.getNodeView());
} }
} }

View File

@ -75,13 +75,13 @@ public abstract class GroupNode<F extends ViewGroup> extends SuperNode<F> {
} else { } else {
//Replace this view //Replace this view
mChildNodes.remove(idx); mChildNodes.remove(idx);
mView.removeView(oldNode.getDoricLayer()); mView.removeView(oldNode.getNodeView());
ViewNode newNode = ViewNode.create(getDoricContext(), type); ViewNode newNode = ViewNode.create(getDoricContext(), type);
newNode.setId(id); newNode.setId(id);
newNode.init(this); newNode.init(this);
newNode.blend(model.getProperty("props").asObject()); newNode.blend(model.getProperty("props").asObject());
mChildNodes.add(idx, newNode); mChildNodes.add(idx, newNode);
mView.addView(newNode.getDoricLayer(), idx, newNode.getLayoutParams()); mView.addView(newNode.getNodeView(), idx, newNode.getLayoutParams());
} }
} else { } else {
//Find in remain nodes //Find in remain nodes
@ -101,10 +101,10 @@ public abstract class GroupNode<F extends ViewGroup> extends SuperNode<F> {
mChildNodes.set(idx, reused); mChildNodes.set(idx, reused);
mChildNodes.set(position, abandoned); mChildNodes.set(position, abandoned);
//View swap index //View swap index
mView.removeView(reused.getDoricLayer()); mView.removeView(reused.getNodeView());
mView.addView(reused.getDoricLayer(), idx); mView.addView(reused.getNodeView(), idx);
mView.removeView(abandoned.getDoricLayer()); mView.removeView(abandoned.getNodeView());
mView.addView(abandoned.getDoricLayer(), position); mView.addView(abandoned.getNodeView(), position);
} else { } else {
//Not found,insert //Not found,insert
ViewNode newNode = ViewNode.create(getDoricContext(), type); ViewNode newNode = ViewNode.create(getDoricContext(), type);
@ -113,7 +113,7 @@ public abstract class GroupNode<F extends ViewGroup> extends SuperNode<F> {
newNode.blend(model.getProperty("props").asObject()); newNode.blend(model.getProperty("props").asObject());
mChildNodes.add(idx, newNode); mChildNodes.add(idx, newNode);
mView.addView(newNode.getDoricLayer(), idx, newNode.getLayoutParams()); mView.addView(newNode.getNodeView(), idx, newNode.getLayoutParams());
} }
} }
} }
@ -124,13 +124,13 @@ public abstract class GroupNode<F extends ViewGroup> extends SuperNode<F> {
newNode.init(this); newNode.init(this);
newNode.blend(model.getProperty("props").asObject()); newNode.blend(model.getProperty("props").asObject());
mChildNodes.add(newNode); mChildNodes.add(newNode);
mView.addView(newNode.getDoricLayer(), idx, newNode.getLayoutParams()); mView.addView(newNode.getNodeView(), idx, newNode.getLayoutParams());
} }
} }
int size = mChildNodes.size(); int size = mChildNodes.size();
for (int idx = mChildViewIds.size(); idx < size; idx++) { for (int idx = mChildViewIds.size(); idx < size; idx++) {
ViewNode viewNode = mChildNodes.remove(mChildViewIds.size()); ViewNode viewNode = mChildNodes.remove(mChildViewIds.size());
mView.removeView(viewNode.getDoricLayer()); mView.removeView(viewNode.getNodeView());
} }
} }

View File

@ -36,7 +36,7 @@ public class RootNode extends StackNode {
} }
@Override @Override
public View getDoricLayer() { public View getNodeView() {
return mView; return mView;
} }

View File

@ -86,7 +86,7 @@ public class ScrollerNode extends SuperNode<HVScrollView> {
mChildNode.setId(viewId); mChildNode.setId(viewId);
mChildNode.init(this); mChildNode.init(this);
mChildNode.blend(props); mChildNode.blend(props);
mView.addView(mChildNode.getDoricLayer()); mView.addView(mChildNode.getNodeView());
} }
} }
} else { } else {
@ -94,7 +94,7 @@ public class ScrollerNode extends SuperNode<HVScrollView> {
mChildNode.setId(viewId); mChildNode.setId(viewId);
mChildNode.init(this); mChildNode.init(this);
mChildNode.blend(props); mChildNode.blend(props);
mView.addView(mChildNode.getDoricLayer()); mView.addView(mChildNode.getNodeView());
} }
} }

View File

@ -21,6 +21,8 @@ import android.view.ViewGroup;
import android.widget.FrameLayout; import android.widget.FrameLayout;
import android.widget.LinearLayout; import android.widget.LinearLayout;
import androidx.annotation.NonNull;
import pub.doric.DoricContext; import pub.doric.DoricContext;
import pub.doric.DoricRegistry; import pub.doric.DoricRegistry;
import pub.doric.async.AsyncResult; import pub.doric.async.AsyncResult;
@ -60,11 +62,8 @@ public abstract class ViewNode<T extends View> extends DoricContextHolder {
} }
this.mSuperNode = superNode; this.mSuperNode = superNode;
this.mLayoutParams = superNode.generateDefaultLayoutParams(); this.mLayoutParams = superNode.generateDefaultLayoutParams();
this.doricLayer = new DoricLayer(getContext());
this.doricLayer.setLayoutParams(mLayoutParams);
this.mView = build(); this.mView = build();
FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(mLayoutParams.width, mLayoutParams.height); this.mView.setLayoutParams(mLayoutParams);
doricLayer.addView(mView, params);
} }
public void setId(String id) { public void setId(String id) {
@ -75,8 +74,12 @@ public abstract class ViewNode<T extends View> extends DoricContextHolder {
return mType; return mType;
} }
public View getDoricLayer() { public View getNodeView() {
if (doricLayer != null) {
return doricLayer; return doricLayer;
} else {
return mView;
}
} }
public Context getContext() { public Context getContext() {
@ -91,6 +94,7 @@ public abstract class ViewNode<T extends View> extends DoricContextHolder {
blend(mView, prop, jsObject.getProperty(prop)); blend(mView, prop, jsObject.getProperty(prop));
} }
} }
if (doricLayer != null) {
ViewGroup.LayoutParams params = mView.getLayoutParams(); ViewGroup.LayoutParams params = mView.getLayoutParams();
if (params != null) { if (params != null) {
params.width = mLayoutParams.width; params.width = mLayoutParams.width;
@ -108,6 +112,7 @@ public abstract class ViewNode<T extends View> extends DoricContextHolder {
mView.setLayoutParams(params); mView.setLayoutParams(params);
} }
}
protected void blend(T view, String name, JSValue prop) { protected void blend(T view, String name, JSValue prop) {
switch (name) { switch (name) {
@ -139,34 +144,30 @@ public abstract class ViewNode<T extends View> extends DoricContextHolder {
setLayoutConfig(prop.asObject()); setLayoutConfig(prop.asObject());
break; break;
case "border": case "border":
if (prop.isObject() && doricLayer != null) { if (prop.isObject()) {
doricLayer.setBorder(DoricUtils.dp2px(prop.asObject().getProperty("width").asNumber().toFloat()), requireDoricLayer().setBorder(DoricUtils.dp2px(prop.asObject().getProperty("width").asNumber().toFloat()),
prop.asObject().getProperty("color").asNumber().toInt()); prop.asObject().getProperty("color").asNumber().toInt());
} }
break; break;
case "corners": case "corners":
if (doricLayer != null) {
if (prop.isNumber()) { if (prop.isNumber()) {
doricLayer.setCornerRadius(DoricUtils.dp2px(prop.asNumber().toFloat())); requireDoricLayer().setCornerRadius(DoricUtils.dp2px(prop.asNumber().toFloat()));
} else if (prop.isObject()) { } else if (prop.isObject()) {
JSValue lt = prop.asObject().getProperty("leftTop"); JSValue lt = prop.asObject().getProperty("leftTop");
JSValue rt = prop.asObject().getProperty("rightTop"); JSValue rt = prop.asObject().getProperty("rightTop");
JSValue rb = prop.asObject().getProperty("rightBottom"); JSValue rb = prop.asObject().getProperty("rightBottom");
JSValue lb = prop.asObject().getProperty("leftBottom"); JSValue lb = prop.asObject().getProperty("leftBottom");
doricLayer.setCornerRadius( requireDoricLayer().setCornerRadius(
DoricUtils.dp2px(lt.isNumber() ? lt.asNumber().toFloat() : 0), DoricUtils.dp2px(lt.isNumber() ? lt.asNumber().toFloat() : 0),
DoricUtils.dp2px(rt.isNumber() ? rt.asNumber().toFloat() : 0), DoricUtils.dp2px(rt.isNumber() ? rt.asNumber().toFloat() : 0),
DoricUtils.dp2px(rb.isNumber() ? rb.asNumber().toFloat() : 0), DoricUtils.dp2px(rb.isNumber() ? rb.asNumber().toFloat() : 0),
DoricUtils.dp2px(lb.isNumber() ? lb.asNumber().toFloat() : 0) DoricUtils.dp2px(lb.isNumber() ? lb.asNumber().toFloat() : 0)
); );
} }
}
break; break;
case "shadow": case "shadow":
if (doricLayer != null) {
if (prop.isObject()) { if (prop.isObject()) {
doricLayer.setShadow( requireDoricLayer().setShadow(
prop.asObject().getProperty("color").asNumber().toInt(), prop.asObject().getProperty("color").asNumber().toInt(),
(int) (prop.asObject().getProperty("opacity").asNumber().toFloat() * 255), (int) (prop.asObject().getProperty("opacity").asNumber().toFloat() * 255),
DoricUtils.dp2px(prop.asObject().getProperty("radius").asNumber().toFloat()), DoricUtils.dp2px(prop.asObject().getProperty("radius").asNumber().toFloat()),
@ -174,13 +175,32 @@ public abstract class ViewNode<T extends View> extends DoricContextHolder {
DoricUtils.dp2px(prop.asObject().getProperty("offsetY").asNumber().toFloat()) DoricUtils.dp2px(prop.asObject().getProperty("offsetY").asNumber().toFloat())
); );
} }
}
break; break;
default: default:
break; break;
} }
} }
@NonNull
private DoricLayer requireDoricLayer() {
if (doricLayer == null) {
doricLayer = new DoricLayer(getContext());
doricLayer.setLayoutParams(mLayoutParams);
FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(mLayoutParams.width, mLayoutParams.height);
if (mView.getParent() instanceof ViewGroup) {
//Already added in
ViewGroup superview = (ViewGroup) mView.getParent();
int index = superview.indexOfChild(mView);
superview.removeView(mView);
doricLayer.addView(mView, params);
superview.addView(doricLayer, index);
} else {
doricLayer.addView(mView, params);
}
}
return doricLayer;
}
String[] getIdList() { String[] getIdList() {
LinkedList<String> ids = new LinkedList<>(); LinkedList<String> ids = new LinkedList<>();
ViewNode viewNode = this; ViewNode viewNode = this;

View File

@ -54,7 +54,7 @@ class ListAdapter extends RecyclerView.Adapter<ListAdapter.DoricViewHolder> {
public DoricViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { public DoricViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
ListItemNode node = (ListItemNode) ViewNode.create(listNode.getDoricContext(), "ListItem"); ListItemNode node = (ListItemNode) ViewNode.create(listNode.getDoricContext(), "ListItem");
node.init(listNode); node.init(listNode);
return new DoricViewHolder(node, node.getDoricLayer()); return new DoricViewHolder(node, node.getNodeView());
} }
@Override @Override

View File

@ -50,7 +50,7 @@ public class ListItemNode extends StackNode {
@Override @Override
public void blend(JSObject jsObject) { public void blend(JSObject jsObject) {
super.blend(jsObject); super.blend(jsObject);
getDoricLayer().getLayoutParams().width = getLayoutParams().width; getNodeView().getLayoutParams().width = getLayoutParams().width;
getDoricLayer().getLayoutParams().height = getLayoutParams().height; getNodeView().getLayoutParams().height = getLayoutParams().height;
} }
} }

View File

@ -53,7 +53,7 @@ class SlideAdapter extends RecyclerView.Adapter<SlideAdapter.DoricViewHolder> {
public DoricViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { public DoricViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
SlideItemNode node = (SlideItemNode) ViewNode.create(sliderNode.getDoricContext(), "SlideItem"); SlideItemNode node = (SlideItemNode) ViewNode.create(sliderNode.getDoricContext(), "SlideItem");
node.init(sliderNode); node.init(sliderNode);
return new DoricViewHolder(node, node.getDoricLayer()); return new DoricViewHolder(node, node.getNodeView());
} }
@Override @Override

View File

@ -50,7 +50,7 @@ public class SlideItemNode extends StackNode {
@Override @Override
public void blend(JSObject jsObject) { public void blend(JSObject jsObject) {
super.blend(jsObject); super.blend(jsObject);
getDoricLayer().getLayoutParams().width = getLayoutParams().width; getNodeView().getLayoutParams().width = getLayoutParams().width;
getDoricLayer().getLayoutParams().height = getLayoutParams().height; getNodeView().getLayoutParams().height = getLayoutParams().height;
} }
} }

View File

@ -49,8 +49,8 @@ - (DoricViewNode *)subNodeWithViewId:(NSString *)viewId {
- (void)blend:(NSDictionary *)props { - (void)blend:(NSDictionary *)props {
[super blend:props]; [super blend:props];
[self blendHeader];
[self blendContent]; [self blendContent];
[self blendHeader];
} }
- (void)blendContent { - (void)blendContent {

View File

@ -5,6 +5,7 @@
#import "DoricSwipeRefreshLayout.h" #import "DoricSwipeRefreshLayout.h"
#import "UIView+Doric.h" #import "UIView+Doric.h"
#import "DoricLayouts.h" #import "DoricLayouts.h"
#import "Doric.h"
@interface DoricSwipeRefreshLayout () <UIScrollViewDelegate> @interface DoricSwipeRefreshLayout () <UIScrollViewDelegate>
@ -53,9 +54,16 @@ - (BOOL)requestFromSubview:(UIView *)subview {
} }
- (void)layoutSelf:(CGSize)targetSize { - (void)layoutSelf:(CGSize)targetSize {
[super layoutSelf:targetSize]; self.width = targetSize.width;
self.headerView.bottom = 0; self.height = targetSize.height;
self.headerView.centerX = self.centerX; [self.headerView also:^(UIView *it) {
[it layoutSelf:[it measureSize:targetSize]];
it.bottom = 0;
it.centerX = self.centerX;
}];
[self.contentView also:^(UIView *it) {
[it layoutSelf:targetSize];
}];
self.contentSize = self.frame.size; self.contentSize = self.frame.size;
} }