add: some samples of ui widgets

This commit is contained in:
hyb1996
2017-11-30 14:14:54 +08:00
parent 7bf9b3f0d9
commit 45bbc33ab7
23 changed files with 357 additions and 17 deletions

View File

@@ -18,7 +18,7 @@ module.exports = function(__runtime__, scope){
ui.id = function(id){
if(!ui.view)
return null;
var v = ui.view.getChildAt(0).id(id);
var v = ui.findViewByStringId(ui.view.getChildAt(0), id);
if(v){
v = decorate(v);
}

View File

@@ -7,6 +7,8 @@ import android.view.ViewGroup;
import android.widget.TextView;
import com.stardust.autojs.core.ui.widget.JsFrameLayout;
import com.stardust.autojs.core.ui.widget.JsImageView;
import com.stardust.autojs.core.ui.xml.JsImageViewAttrSetter;
import com.stardust.autojs.core.ui.xml.XmlConverter;
import com.stardust.util.MapEntries;
@@ -23,13 +25,28 @@ import java.util.Map;
public class ConvertLayoutInflater implements JsLayoutInflater {
private DynamicLayoutInflater mDynamicLayoutInflater;
public ConvertLayoutInflater() {
}
private void ensureInflater(Context context) {
if (mDynamicLayoutInflater != null) {
return;
}
mDynamicLayoutInflater = new DynamicLayoutInflater(context);
mDynamicLayoutInflater.registerViewAttrSetter(JsImageView.class.getName(),
new JsImageViewAttrSetter<>());
}
@Override
public View inflate(Context context, String xml) {
ensureInflater(context);
try {
String androidLayoutXml = XmlConverter.convertToAndroidLayout(xml);
JsFrameLayout root = new JsFrameLayout(context);
new DynamicLayoutInflater(context).inflate(androidLayoutXml, root);
mDynamicLayoutInflater.inflate(androidLayoutXml, root);
return root;
} catch (Exception e) {
throw new RuntimeException(e);

View File

@@ -0,0 +1,54 @@
package com.stardust.autojs.core.ui.widget;
import android.content.Context;
import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.util.AttributeSet;
import com.makeramen.roundedimageview.RoundedImageView;
import org.autojs.dynamiclayoutinflater.util.Drawables;
/**
* Created by Stardust on 2017/11/30.
*/
public class JsImageView extends RoundedImageView {
private boolean mCircle;
public JsImageView(Context context) {
super(context);
}
public JsImageView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public JsImageView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
public void setCircle(boolean circle) {
mCircle = circle;
if (circle && getWidth() != 0) {
setCornerRadius(Math.min(getWidth(), getHeight()) / 2);
}
}
public boolean isCircle() {
return mCircle;
}
public void setSource(String uri) {
Drawables.loadInto(this, Uri.parse(uri));
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
if (mCircle) {
setCornerRadius(Math.min(getWidth(), getHeight()) / 2);
}
}
}

View File

@@ -1,5 +1,7 @@
package com.stardust.autojs.core.ui.xml;
import android.util.Log;
import org.w3c.dom.Node;
import java.util.HashMap;
@@ -44,7 +46,10 @@ public interface AttributeHandler {
@Override
public boolean handle(String nodeName, Node attr, StringBuilder layoutXml) {
layoutXml.append("android:").append(mapAttrName(nodeName, attr.getNodeName()))
if (!attr.getNodeName().equals("style")) {
layoutXml.append("android:");
}
layoutXml.append(mapAttrName(nodeName, attr.getLocalName()))
.append("=\"").append(mapAttrValue(nodeName, attr.getNodeName(), attr.getNodeValue())).append("\"\n");
return true;
}

View File

@@ -0,0 +1,57 @@
package com.stardust.autojs.core.ui.xml;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.ImageView.ScaleType;
import com.stardust.autojs.core.ui.widget.JsImageView;
import org.autojs.dynamiclayoutinflater.attrsetter.BaseViewAttrSetter;
import org.autojs.dynamiclayoutinflater.attrsetter.ImageViewAttrSetter;
import org.autojs.dynamiclayoutinflater.util.Colors;
import org.autojs.dynamiclayoutinflater.util.Dimensions;
import org.autojs.dynamiclayoutinflater.util.ValueMapper;
import java.util.Map;
/**
* Created by Stardust on 2017/11/30.
*/
public class JsImageViewAttrSetter<V extends JsImageView> extends ImageViewAttrSetter<V> {
protected static final ValueMapper<ScaleType> SCALE_TYPES = new ValueMapper<ScaleType>("scaleType")
.map("center", ScaleType.CENTER)
.map("centerCrop", ScaleType.CENTER_CROP)
.map("centerInside", ScaleType.CENTER_INSIDE)
.map("fitCenter", ScaleType.FIT_CENTER)
.map("fitEnd", ScaleType.FIT_END)
.map("fitStart", ScaleType.FIT_START)
.map("fitXY", ScaleType.FIT_XY)
.map("matrix", ScaleType.MATRIX);
@Override
public boolean setAttr(V view, String attr, String value, ViewGroup parent, Map<String, String> attrs) {
switch (attr) {
case "radius":
view.setCornerRadius(Dimensions.parseToPixel(value, view));
break;
case "borderWidth":
view.setBorderWidth(Dimensions.parseToPixel(value, view));
break;
case "borderColor":
view.setBorderColor(Colors.parse(view, value));
break;
case "circle":
view.setCircle(true);
break;
case "scaleType":
view.setScaleType(SCALE_TYPES.get(value));
break;
default:
return super.setAttr(view, attr, value, parent, attrs);
}
return true;
}
}

View File

@@ -1,11 +1,13 @@
package com.stardust.autojs.core.ui.xml;
import android.support.v7.widget.Toolbar;
import android.webkit.WebView;
import android.widget.CheckBox;
import android.widget.DatePicker;
import android.widget.ProgressBar;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import android.widget.ScrollView;
import android.widget.SeekBar;
import android.widget.Spinner;
import android.widget.TimePicker;
@@ -13,6 +15,7 @@ import android.widget.TimePicker;
import com.stardust.autojs.core.ui.widget.JsButton;
import com.stardust.autojs.core.ui.widget.JsEditText;
import com.stardust.autojs.core.ui.widget.JsFrameLayout;
import com.stardust.autojs.core.ui.widget.JsImageView;
import com.stardust.autojs.core.ui.widget.JsLinearLayout;
import com.stardust.autojs.core.ui.widget.JsRelativeLayout;
import com.stardust.autojs.core.ui.widget.JsTextView;
@@ -49,7 +52,7 @@ public class XmlConverter {
.map("button", JsButton.class.getName())
.map("text", JsTextView.class.getName())
.map("input", JsEditText.class.getName())
.map("img", "ImageView")
.map("img", JsImageView.class.getName())
.map("datepicker", DatePicker.class.getName())
.map("timepicker", TimePicker.class.getName())
.map("webview", JsWebView.class.getName())
@@ -59,6 +62,8 @@ public class XmlConverter {
.map("radio", RadioButton.class.getName())
.map("radiogroup", RadioGroup.class.getName())
.map("checkbox", CheckBox.class.getName())
.map("scroll", ScrollView.class.getName())
.map("toolbar", Toolbar.class.getName())
);
private static final AttributeHandler ATTRIBUTE_HANDLER = new AttributeHandler.AttrNameRouter()