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 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"))