feat:add RefreshableDemo for Android
This commit is contained in:
@@ -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);
|
||||
}
|
||||
|
||||
|
@@ -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++) {
|
||||
|
@@ -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()));
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user