diff --git a/app/src/main/assets/sample/界面控件/卡片布局.js b/app/src/main/assets/sample/界面控件/卡片布局.js
new file mode 100644
index 00000000..d726ed82
--- /dev/null
+++ b/app/src/main/assets/sample/界面控件/卡片布局.js
@@ -0,0 +1,42 @@
+"ui";
+
+ui.layout(
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+);
+
diff --git a/app/src/main/assets/sample/界面控件/卡片布局列表.js b/app/src/main/assets/sample/界面控件/卡片布局列表.js
new file mode 100644
index 00000000..e588ecba
--- /dev/null
+++ b/app/src/main/assets/sample/界面控件/卡片布局列表.js
@@ -0,0 +1,46 @@
+"ui";
+
+ui.layout(
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+);
+
+var todos = [
+ {
+ title: "",
+ summary: "",
+ color: ""
+ },
+ {
+ title: "",
+ summary: "",
+ color: ""
+ },
+ {
+ title: "",
+ summary: "",
+ color: ""
+ },
+ {
+ title: "",
+ summary: "",
+ color: ""
+ }
+];
+
+ui.todos.setDataSource(todos);
diff --git a/autojs/src/main/java/com/stardust/autojs/core/ui/attribute/CardAttributes.java b/autojs/src/main/java/com/stardust/autojs/core/ui/attribute/CardAttributes.java
new file mode 100644
index 00000000..15d1b4e6
--- /dev/null
+++ b/autojs/src/main/java/com/stardust/autojs/core/ui/attribute/CardAttributes.java
@@ -0,0 +1,71 @@
+package com.stardust.autojs.core.ui.attribute;
+
+import android.graphics.Color;
+import android.support.v7.widget.CardView;
+import android.view.View;
+
+import com.stardust.autojs.core.ui.inflater.ResourceParser;
+import com.stardust.autojs.core.ui.inflater.util.Dimensions;
+
+public class CardAttributes extends ViewAttributes {
+
+ public CardAttributes(ResourceParser resourceParser, View view) {
+ super(resourceParser, view);
+ }
+
+ @Override
+ protected void onRegisterAttrs() {
+ super.onRegisterAttrs();
+ registerAttr("cardBackgroundColor", Color::parseColor, getView()::setCardBackgroundColor);
+ registerPixelAttr("cardCornerRadius", getView()::setRadius);
+ registerPixelAttr("cardElevation", getView()::setCardElevation);
+ registerPixelAttr("cardMaxElevation", getView()::setMaxCardElevation);
+ registerBooleanAttr("cardPreventCornerOverlap", getView()::setPreventCornerOverlap);
+ registerBooleanAttr("cardUseCompatPadding", getView()::setUseCompatPadding);
+ registerAttr("contentPadding", this::setContentPadding);
+ registerIntPixelAttr("contentPaddingBottom", this::setContentPaddingBottom);
+ registerIntPixelAttr("contentPaddingLeft", this::setContentPaddingLeft);
+ registerIntPixelAttr("contentPaddingTop", this::setContentPaddingTop);
+ registerIntPixelAttr("contentPaddingRight", this::setContentPaddingRight);
+ }
+
+ private void setContentPadding(String value) {
+ int[] pixels = Dimensions.parseToIntPixelArray(getView(), value);
+ getView().setContentPadding(pixels[0], pixels[1], pixels[2], pixels[3]);
+ }
+
+
+ private void setContentPaddingBottom(int value) {
+ CardView cardView = getView();
+ cardView.setContentPadding(cardView.getContentPaddingLeft(), cardView.getContentPaddingTop(),
+ cardView.getContentPaddingRight(), value);
+ }
+
+
+ private void setContentPaddingLeft(int value) {
+ CardView cardView = getView();
+ cardView.setContentPadding(value, cardView.getContentPaddingTop(),
+ cardView.getContentPaddingRight(), cardView.getContentPaddingBottom());
+ }
+
+
+ private void setContentPaddingTop(int value) {
+ CardView cardView = getView();
+ cardView.setContentPadding(cardView.getContentPaddingLeft(), value,
+ cardView.getContentPaddingRight(), cardView.getContentPaddingBottom());
+ }
+
+
+ private void setContentPaddingRight(int value) {
+ CardView cardView = getView();
+ cardView.setContentPadding(cardView.getContentPaddingLeft(), cardView.getContentPaddingTop(),
+ value, cardView.getContentPaddingBottom());
+ }
+
+
+ @Override
+ public CardView getView() {
+ return (CardView) super.getView();
+ }
+
+}
diff --git a/autojs/src/main/java/com/stardust/autojs/core/ui/attribute/ViewAttributes.java b/autojs/src/main/java/com/stardust/autojs/core/ui/attribute/ViewAttributes.java
index ac046be7..c2b17b9b 100644
--- a/autojs/src/main/java/com/stardust/autojs/core/ui/attribute/ViewAttributes.java
+++ b/autojs/src/main/java/com/stardust/autojs/core/ui/attribute/ViewAttributes.java
@@ -25,6 +25,7 @@ import com.stardust.autojs.core.ui.inflater.util.Drawables;
import com.stardust.autojs.core.ui.inflater.util.Gravities;
import com.stardust.autojs.core.ui.inflater.util.Ids;
import com.stardust.autojs.core.ui.inflater.util.Strings;
+import com.stardust.autojs.rhino.debug.Dim;
import com.stardust.util.BiMap;
import com.stardust.util.Supplier;
@@ -45,6 +46,14 @@ import static com.stardust.autojs.core.ui.inflater.inflaters.BaseViewInflater.VI
public class ViewAttributes {
+ public interface Getter {
+ T get();
+ }
+
+ public interface Setter {
+ void set(T value);
+ }
+
public interface Attribute {
String get();
@@ -73,40 +82,30 @@ public class ViewAttributes {
}
}
- protected interface AttributeGetter {
- String get();
+ protected interface AttributeGetter extends Getter {
}
- protected interface AttributeSetter {
- void set(String value);
+ protected interface AttributeSetter extends Setter {
}
protected interface ValueConverter {
T convert(String value);
}
- protected interface ValueApplier {
- void apply(T value);
- }
-
- protected interface ValueGetter {
- T get();
- }
-
protected static class MappingAttributeSetter implements AttributeSetter {
private final ValueConverter mValueConverter;
- private final ValueApplier mValueApplier;
+ private final Setter mSetter;
- public MappingAttributeSetter(ValueConverter valueConverter, ValueApplier valueApplier) {
+ public MappingAttributeSetter(ValueConverter valueConverter, Setter Setter) {
mValueConverter = valueConverter;
- mValueApplier = valueApplier;
+ mSetter = Setter;
}
@Override
public void set(String value) {
- mValueApplier.apply(mValueConverter.convert(value));
+ mSetter.set(mValueConverter.convert(value));
}
}
@@ -186,14 +185,14 @@ public class ViewAttributes {
registerDrawableAttrs(new String[]{"bg", "background"}, mView::setBackground);
registerAttr("layout_gravity", Gravities::parse, this::setLayoutGravity);
registerAttr("layout_weight", Float::parseFloat, this::setLayoutWeight);
- registerAttr("layout_margin", this::parseDimension, this::setMargin);
+ registerAttr("layout_margin", this::setMargin);
registerAttr("layout_marginLeft", this::parseDimension, this::setMarginLeft);
registerAttr("layout_marginRight", this::parseDimension, this::setMarginRight);
registerAttr("layout_marginTop", this::parseDimension, this::setMarginTop);
registerAttr("layout_marginBottom", this::parseDimension, this::setMarginBottom);
registerAttr("layout_marginStart", this::parseDimension, this::setMarginStart);
registerAttr("layout_marginEnd", this::parseDimension, this::setMarginEnd);
- registerAttr("padding", this::parseDimension, this::setPadding);
+ registerAttr("padding",this::setPadding);
registerAttr("paddingLeft", this::parseDimension, this::setPaddingLeft);
registerAttr("paddingRight", this::parseDimension, this::setPaddingRight);
registerAttr("paddingTop", this::parseDimension, this::setPaddingTop);
@@ -320,7 +319,7 @@ public class ViewAttributes {
mAttributes.put(name, attribute);
}
- protected void registerAttr(String name, ValueGetter getter, ValueApplier setter, BiMap biMap) {
+ protected void registerAttr(String name, Getter getter, Setter setter, BiMap biMap) {
mAttributes.put(name, new Attribute() {
@Override
public String get() {
@@ -330,7 +329,7 @@ public class ViewAttributes {
@Override
public void set(String value) {
V v = biMap.get(value);
- setter.apply(v);
+ setter.set(v);
}
});
}
@@ -353,11 +352,11 @@ public class ViewAttributes {
mAttributes.put(name, new BaseAttribute(setter));
}
- protected void registerAttr(String name, ValueConverter converter, ValueApplier applier) {
+ protected void registerAttr(String name, ValueConverter converter, Setter applier) {
mAttributes.put(name, new BaseAttribute(new MappingAttributeSetter<>(converter, applier)));
}
- protected void registerAttrs(String[] names, ValueConverter converter, ValueApplier applier) {
+ protected void registerAttrs(String[] names, ValueConverter converter, Setter applier) {
registerAttrs(names, new MappingAttributeSetter<>(converter, applier));
}
@@ -371,30 +370,30 @@ public class ViewAttributes {
}
}
- protected void registerDrawableAttr(String name, ValueApplier applier) {
+ protected void registerDrawableAttr(String name, Setter applier) {
mAttributes.put(name, new BaseAttribute(new MappingAttributeSetter<>(
this::parseDrawable, applier)));
}
- protected void registerDrawableAttrs(String[] names, ValueApplier applier) {
+ protected void registerDrawableAttrs(String[] names, Setter applier) {
registerAttrs(names, new BaseAttribute(new MappingAttributeSetter<>(
this::parseDrawable, applier)));
}
- protected void registerPixelAttr(String name, ValueApplier applier) {
+ protected void registerPixelAttr(String name, Setter applier) {
registerAttr(name, this::parseDimensionToPixel, applier);
}
- protected void registerIntPixelAttr(String name, ValueApplier applier) {
+ protected void registerIntPixelAttr(String name, Setter applier) {
registerAttr(name, this::parseDimensionToIntPixel, applier);
}
- protected void registerIdAttr(String name, ValueApplier applier) {
+ protected void registerIdAttr(String name, Setter applier) {
registerAttr(name, Ids::parse, applier);
}
- protected void registerBooleanAttr(String name, ValueApplier applier) {
+ protected void registerBooleanAttr(String name, Setter applier) {
registerAttr(name, Boolean::parseBoolean, applier);
}
@@ -414,14 +413,16 @@ public class ViewAttributes {
}
}
- protected void setMargin(int margin) {
+ protected void setMargin(String margin) {
if (mView.getLayoutParams() instanceof ViewGroup.MarginLayoutParams) {
ViewGroup.MarginLayoutParams params = (ViewGroup.MarginLayoutParams) mView.getLayoutParams();
- params.bottomMargin = params.leftMargin = params.topMargin = params.rightMargin = margin;
+ int[] pixels = Dimensions.parseToIntPixelArray(getView(), margin);
+ params.setMargins(pixels[0], pixels[1], pixels[2], pixels[3]);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
- params.setMarginStart(margin);
- params.setMarginEnd(margin);
+ params.setMarginStart(pixels[0]);
+ params.setMarginEnd(pixels[2]);
}
+ getView().setLayoutParams(params);
}
}
@@ -469,8 +470,9 @@ public class ViewAttributes {
}
}
- protected void setPadding(int padding) {
- mView.setPadding(padding, padding, padding, padding);
+ protected void setPadding(String padding) {
+ int[] pixels = Dimensions.parseToIntPixelArray(getView(), padding);
+ mView.setPadding(pixels[0], pixels[1], pixels[2], pixels[3]);
}
protected void setPaddingLeft(int padding) {
@@ -567,7 +569,7 @@ public class ViewAttributes {
return Strings.parse(mView, value);
}
- protected static ValueApplier bind(Functions.VoidFunc2 func2, T1 t1) {
+ protected static Setter bind(Functions.VoidFunc2 func2, T1 t1) {
return value -> func2.call(t1, value);
}
diff --git a/autojs/src/main/java/com/stardust/autojs/core/ui/attribute/ViewAttributesFactory.java b/autojs/src/main/java/com/stardust/autojs/core/ui/attribute/ViewAttributesFactory.java
index 7241977f..036cf55d 100644
--- a/autojs/src/main/java/com/stardust/autojs/core/ui/attribute/ViewAttributesFactory.java
+++ b/autojs/src/main/java/com/stardust/autojs/core/ui/attribute/ViewAttributesFactory.java
@@ -1,6 +1,7 @@
package com.stardust.autojs.core.ui.attribute;
import android.support.design.widget.AppBarLayout;
+import android.support.v7.widget.CardView;
import android.view.View;
import android.widget.ImageView;
import android.widget.RadioGroup;
@@ -22,6 +23,7 @@ public class ViewAttributesFactory {
sViewAttributesCreators.put(ImageView.class, ImageViewAttributes::new);
sViewAttributesCreators.put(AppBarLayout.class, AppbarAttributes::new);
sViewAttributesCreators.put(TextView.class, TextViewAttributes::new);
+ sViewAttributesCreators.put(CardView.class, CardAttributes::new);
}
public static void put(Class extends View> clazz, ViewAttributesCreator creator) {
diff --git a/autojs/src/main/java/com/stardust/autojs/core/ui/inflater/util/Dimensions.java b/autojs/src/main/java/com/stardust/autojs/core/ui/inflater/util/Dimensions.java
index 98aca4d0..6786adc1 100644
--- a/autojs/src/main/java/com/stardust/autojs/core/ui/inflater/util/Dimensions.java
+++ b/autojs/src/main/java/com/stardust/autojs/core/ui/inflater/util/Dimensions.java
@@ -2,6 +2,7 @@ package com.stardust.autojs.core.ui.inflater.util;
import android.content.Context;
import android.content.res.TypedArray;
+import android.support.v7.widget.CardView;
import android.util.DisplayMetrics;
import android.util.TypedValue;
import android.view.InflateException;
@@ -71,6 +72,21 @@ public class Dimensions {
public static int parseToIntPixel(String value, Context context) {
return Math.round(parseToPixel(value, context));
}
+
+ public static int[] parseToIntPixelArray(View view, String value) {
+ String[] split = value.split(" ");
+ int[] pixels = new int[4];
+ for (int i = 0; i < split.length; i++) {
+ pixels[i] = parseToIntPixel(split[i], view);
+ }
+ if (split.length == 1) {
+ pixels[1] = pixels[2] = pixels[3] = pixels[0];
+ } else if (split.length == 2) {
+ pixels[2] = pixels[0];
+ pixels[3] = pixels[1];
+ }
+ return pixels;
+ }
}
diff --git a/autojs/src/main/java/com/stardust/autojs/core/ui/xml/XmlConverter.java b/autojs/src/main/java/com/stardust/autojs/core/ui/xml/XmlConverter.java
index c1b71815..58262dfd 100644
--- a/autojs/src/main/java/com/stardust/autojs/core/ui/xml/XmlConverter.java
+++ b/autojs/src/main/java/com/stardust/autojs/core/ui/xml/XmlConverter.java
@@ -3,6 +3,7 @@ package com.stardust.autojs.core.ui.xml;
import android.support.design.widget.AppBarLayout;
import android.support.design.widget.TabLayout;
import android.support.v4.widget.DrawerLayout;
+import android.support.v7.widget.CardView;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.Toolbar;
import android.webkit.WebView;
@@ -82,6 +83,7 @@ public class XmlConverter {
.map("appbar", AppBarLayout.class.getName())
.map("tabs", JsTabLayout.class.getName())
.map("viewpager", JsViewPager.class.getName())
+ .map("card", CardView.class.getName())
);
private static final AttributeHandler ATTRIBUTE_HANDLER = new AttributeHandler.AttrNameRouter()
@@ -90,8 +92,8 @@ public class XmlConverter {
.handler("size", new AttributeHandler.DimenHandler("textSize"))
.handler("id", new AttributeHandler.IdHandler())
.handler("vertical", new AttributeHandler.OrientationHandler())
- .handler("margin", new AttributeHandler.MarginPaddingHandler("layout_margin"))
- .handler("padding", new AttributeHandler.MarginPaddingHandler("padding"))
+ .handler("margin", new AttributeHandler.DimenHandler("layout_margin"))
+ .handler("padding", new AttributeHandler.DimenHandler("padding"))
.handler("marginLeft", new AttributeHandler.DimenHandler("layout_marginLeft"))
.handler("marginRight", new AttributeHandler.DimenHandler("layout_marginRight"))
.handler("marginTop", new AttributeHandler.DimenHandler("layout_marginTop"))