add: some samples of ui widgets
This commit is contained in:
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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()
|
||||
|
||||
Reference in New Issue
Block a user