feat:add RefreshableDemo for Android

This commit is contained in:
pengfei.zhou
2019-11-26 10:31:17 +08:00
parent c766e57c83
commit 362ec833c9
9 changed files with 318 additions and 5 deletions

View File

@@ -25,6 +25,7 @@ import pub.doric.plugin.NavigatorPlugin;
import pub.doric.plugin.NetworkPlugin;
import pub.doric.plugin.ShaderPlugin;
import pub.doric.plugin.StoragePlugin;
import pub.doric.pullable.RefreshableNode;
import pub.doric.shader.HLayoutNode;
import pub.doric.shader.ImageNode;
import pub.doric.shader.ScrollerNode;
@@ -96,6 +97,7 @@ public class DoricRegistry {
this.registerViewNode(ScrollerNode.class);
this.registerViewNode(SliderNode.class);
this.registerViewNode(SlideItemNode.class);
this.registerViewNode(RefreshableNode.class);
initRegistry(this);
}

View File

@@ -287,7 +287,7 @@ public class DoricSwipeLayout extends ViewGroup implements NestedScrollingParent
private void createProgressView() {
mRefreshView = new DoricRefreshView(getContext());
ViewGroup.LayoutParams layoutParams = new ViewGroup.LayoutParams(LayoutParams.MATCH_PARENT, 0);
ViewGroup.LayoutParams layoutParams = new ViewGroup.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);
addView(mRefreshView, layoutParams);
}
@@ -441,8 +441,16 @@ public class DoricSwipeLayout extends ViewGroup implements NestedScrollingParent
getMeasuredWidth() - getPaddingLeft() - getPaddingRight(),
MeasureSpec.EXACTLY), MeasureSpec.makeMeasureSpec(
getMeasuredHeight() - getPaddingTop() - getPaddingBottom(), MeasureSpec.EXACTLY));
mRefreshView.measure(MeasureSpec.makeMeasureSpec(getMeasuredWidth() - getPaddingLeft() - getPaddingRight(), MeasureSpec.EXACTLY),
MeasureSpec.makeMeasureSpec(mPullDownHeight, MeasureSpec.EXACTLY));
mRefreshView.measure(
MeasureSpec.makeMeasureSpec(
getMeasuredWidth() - getPaddingLeft() - getPaddingRight(),
MeasureSpec.EXACTLY),
MeasureSpec.makeMeasureSpec(
(getMeasuredHeight() - getPaddingTop() - getPaddingBottom()) / 3,
MeasureSpec.UNSPECIFIED));
if (mPullDownHeight != mRefreshView.getMeasuredHeight()) {
setPullDownHeight(mRefreshView.getMeasuredHeight());
}
mCircleViewIndex = -1;
// Get the index of the circleview.
for (int index = 0; index < getChildCount(); index++) {

View File

@@ -0,0 +1,165 @@
package pub.doric.pullable;
import com.github.pengfeizhou.jscore.JSObject;
import com.github.pengfeizhou.jscore.JSValue;
import com.github.pengfeizhou.jscore.JavaValue;
import pub.doric.DoricContext;
import pub.doric.extension.bridge.DoricMethod;
import pub.doric.extension.bridge.DoricPlugin;
import pub.doric.extension.bridge.DoricPromise;
import pub.doric.shader.SuperNode;
import pub.doric.shader.ViewNode;
/**
* @Description: pub.doric.pullable
* @Author: pengfei.zhou
* @CreateDate: 2019-11-26
*/
@DoricPlugin(name = "Refreshable")
public class RefreshableNode extends SuperNode<DoricSwipeLayout> {
private String mContentViewId;
private ViewNode mContentNode;
private String mHeaderViewId;
private ViewNode mHeaderNode;
public RefreshableNode(DoricContext doricContext) {
super(doricContext);
}
@Override
protected DoricSwipeLayout build() {
return new DoricSwipeLayout(getContext());
}
@Override
protected void blend(DoricSwipeLayout view, String name, JSValue prop) {
if ("content".equals(name)) {
mContentViewId = prop.asString().value();
} else if ("header".equals(name)) {
mHeaderViewId = prop.asString().value();
} else {
super.blend(view, name, prop);
}
}
@Override
public void blend(JSObject jsObject) {
super.blend(jsObject);
blendContentNode();
blendHeadNode();
}
private void blendContentNode() {
JSObject contentModel = getSubModel(mContentViewId);
if (contentModel == null) {
return;
}
String viewId = contentModel.getProperty("id").asString().value();
String type = contentModel.getProperty("type").asString().value();
JSObject props = contentModel.getProperty("props").asObject();
if (mContentNode != null) {
if (mContentNode.getId().equals(viewId)) {
//skip
} else {
if (mReusable && type.equals(mContentNode.getType())) {
mContentNode.setId(viewId);
mContentNode.blend(props);
} else {
mView.removeAllViews();
mContentNode = ViewNode.create(getDoricContext(), type);
mContentNode.setId(viewId);
mContentNode.init(this);
mContentNode.blend(props);
mView.addView(mContentNode.getDoricLayer());
}
}
} else {
mContentNode = ViewNode.create(getDoricContext(), type);
mContentNode.setId(viewId);
mContentNode.init(this);
mContentNode.blend(props);
mView.addView(mContentNode.getDoricLayer());
}
}
private void blendHeadNode() {
JSObject headerModel = getSubModel(mHeaderViewId);
if (headerModel == null) {
return;
}
String viewId = headerModel.getProperty("id").asString().value();
String type = headerModel.getProperty("type").asString().value();
JSObject props = headerModel.getProperty("props").asObject();
if (mHeaderNode != null) {
if (mHeaderNode.getId().equals(viewId)) {
//skip
} else {
if (mReusable && type.equals(mHeaderNode.getType())) {
mHeaderNode.setId(viewId);
mHeaderNode.blend(props);
} else {
mHeaderNode = ViewNode.create(getDoricContext(), type);
mHeaderNode.setId(viewId);
mHeaderNode.init(this);
mHeaderNode.blend(props);
mView.getRefreshView().setContent(mHeaderNode.getDoricLayer());
}
}
} else {
mHeaderNode = ViewNode.create(getDoricContext(), type);
mHeaderNode.setId(viewId);
mHeaderNode.init(this);
mHeaderNode.blend(props);
mView.getRefreshView().setContent(mHeaderNode.getDoricLayer());
}
}
@Override
public ViewNode getSubNodeById(String id) {
if (id.equals(mContentViewId)) {
return mContentNode;
}
if (id.equals(mHeaderViewId)) {
return mHeaderNode;
}
return null;
}
@Override
protected void blendSubNode(JSObject subProperties) {
String viewId = subProperties.getProperty("id").asString().value();
ViewNode node = getSubNodeById(viewId);
if (node != null) {
node.blend(subProperties.getProperty("props").asObject());
}
}
@DoricMethod
public void setRefreshable(JSValue jsValue, DoricPromise doricPromise) {
boolean refreshable = jsValue.asBoolean().value();
this.mView.setEnabled(refreshable);
doricPromise.resolve();
}
@DoricMethod
public void setRefreshing(JSValue jsValue, DoricPromise doricPromise) {
boolean refreshing = jsValue.asBoolean().value();
this.mView.setRefreshing(refreshing);
doricPromise.resolve();
}
@DoricMethod
public void isRefreshable(DoricPromise doricPromise) {
doricPromise.resolve(new JavaValue(this.mView.isEnabled()));
}
@DoricMethod
public void isRefreshing(DoricPromise doricPromise) {
doricPromise.resolve(new JavaValue(this.mView.isRefreshing()));
}
}