From 45bbc33ab752976bb1776eb05b378999d05d4c65 Mon Sep 17 00:00:00 2001 From: hyb1996 <946994919@qq.com> Date: Thu, 30 Nov 2017 14:14:54 +0800 Subject: [PATCH] add: some samples of ui widgets --- .idea/modules.xml | 2 +- app/build.gradle | 1 - .../{界面 => 复杂界面}/QQ打开聊天窗口.js | 0 .../{界面 => 复杂界面}/WannaCry(仅为娱乐).js | 0 .../sample/{界面 => 复杂界面}/用户调查.js | 2 +- .../sample/{界面 => 复杂界面}/登录界面.js | 0 .../sample/{界面 => 复杂界面}/简单计算器.js | 0 app/src/main/assets/sample/界面/图片.js | 8 --- .../main/assets/sample/界面控件/下拉菜单.js | 26 +++++++++ .../main/assets/sample/界面控件/图片控件.js | 32 +++++++++++ .../sample/界面控件/复选框单选框控件.js | 18 ++++++ .../main/assets/sample/界面控件/按钮控件.js | 16 ++++++ .../sample/{界面 => 界面控件}/文本控件.js | 4 +- .../sample/界面控件/时间日期选择控件.js | 20 +++++++ .../main/assets/sample/界面控件/输入框控件.js | 42 ++++++++++++++ .../main/assets/sample/界面控件/进度条控件.js | 56 ++++++++++++++++++ autojs/build.gradle | 1 + autojs/src/main/assets/modules/__ui__.js | 2 +- .../autojs/core/ui/ConvertLayoutInflater.java | 19 ++++++- .../autojs/core/ui/widget/JsImageView.java | 54 ++++++++++++++++++ .../autojs/core/ui/xml/AttributeHandler.java | 7 ++- .../core/ui/xml/JsImageViewAttrSetter.java | 57 +++++++++++++++++++ .../autojs/core/ui/xml/XmlConverter.java | 7 ++- 23 files changed, 357 insertions(+), 17 deletions(-) rename app/src/main/assets/sample/{界面 => 复杂界面}/QQ打开聊天窗口.js (100%) rename app/src/main/assets/sample/{界面 => 复杂界面}/WannaCry(仅为娱乐).js (100%) rename app/src/main/assets/sample/{界面 => 复杂界面}/用户调查.js (97%) rename app/src/main/assets/sample/{界面 => 复杂界面}/登录界面.js (100%) rename app/src/main/assets/sample/{界面 => 复杂界面}/简单计算器.js (100%) delete mode 100644 app/src/main/assets/sample/界面/图片.js create mode 100644 app/src/main/assets/sample/界面控件/下拉菜单.js create mode 100644 app/src/main/assets/sample/界面控件/图片控件.js create mode 100644 app/src/main/assets/sample/界面控件/复选框单选框控件.js create mode 100644 app/src/main/assets/sample/界面控件/按钮控件.js rename app/src/main/assets/sample/{界面 => 界面控件}/文本控件.js (70%) create mode 100644 app/src/main/assets/sample/界面控件/时间日期选择控件.js create mode 100644 app/src/main/assets/sample/界面控件/输入框控件.js create mode 100644 app/src/main/assets/sample/界面控件/进度条控件.js create mode 100644 autojs/src/main/java/com/stardust/autojs/core/ui/widget/JsImageView.java create mode 100644 autojs/src/main/java/com/stardust/autojs/core/ui/xml/JsImageViewAttrSetter.java diff --git a/.idea/modules.xml b/.idea/modules.xml index 4fac18b4..7e950955 100644 --- a/.idea/modules.xml +++ b/.idea/modules.xml @@ -2,8 +2,8 @@ + - diff --git a/app/build.gradle b/app/build.gradle index 0d4cb25f..d98cb5dd 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -135,7 +135,6 @@ dependencies { compile('com.afollestad.material-dialogs:commons:0.9.2.3', { exclude group: 'com.android.support' }) - compile 'com.makeramen:roundedimageview:2.3.0' compile 'com.rengwuxian.materialedittext:library:2.0.3' compile 'org.msgpack:msgpack-core:0.8.11' compile project(':automator') diff --git a/app/src/main/assets/sample/界面/QQ打开聊天窗口.js b/app/src/main/assets/sample/复杂界面/QQ打开聊天窗口.js similarity index 100% rename from app/src/main/assets/sample/界面/QQ打开聊天窗口.js rename to app/src/main/assets/sample/复杂界面/QQ打开聊天窗口.js diff --git a/app/src/main/assets/sample/界面/WannaCry(仅为娱乐).js b/app/src/main/assets/sample/复杂界面/WannaCry(仅为娱乐).js similarity index 100% rename from app/src/main/assets/sample/界面/WannaCry(仅为娱乐).js rename to app/src/main/assets/sample/复杂界面/WannaCry(仅为娱乐).js diff --git a/app/src/main/assets/sample/界面/用户调查.js b/app/src/main/assets/sample/复杂界面/用户调查.js similarity index 97% rename from app/src/main/assets/sample/界面/用户调查.js rename to app/src/main/assets/sample/复杂界面/用户调查.js index 0e6efe17..0aa410cb 100644 --- a/app/src/main/assets/sample/界面/用户调查.js +++ b/app/src/main/assets/sample/复杂界面/用户调查.js @@ -51,4 +51,4 @@ ui.layout( ) -ui.webview.getWebView().loadUrl("http://www.autojs.org"); \ No newline at end of file +ui.webview.loadUrl("http://www.autojs.org"); \ No newline at end of file diff --git a/app/src/main/assets/sample/界面/登录界面.js b/app/src/main/assets/sample/复杂界面/登录界面.js similarity index 100% rename from app/src/main/assets/sample/界面/登录界面.js rename to app/src/main/assets/sample/复杂界面/登录界面.js diff --git a/app/src/main/assets/sample/界面/简单计算器.js b/app/src/main/assets/sample/复杂界面/简单计算器.js similarity index 100% rename from app/src/main/assets/sample/界面/简单计算器.js rename to app/src/main/assets/sample/复杂界面/简单计算器.js diff --git a/app/src/main/assets/sample/界面/图片.js b/app/src/main/assets/sample/界面/图片.js deleted file mode 100644 index daeeb545..00000000 --- a/app/src/main/assets/sample/界面/图片.js +++ /dev/null @@ -1,8 +0,0 @@ -"ui"; - -ui.layout( - - - -) \ No newline at end of file diff --git a/app/src/main/assets/sample/界面控件/下拉菜单.js b/app/src/main/assets/sample/界面控件/下拉菜单.js new file mode 100644 index 00000000..ee72718c --- /dev/null +++ b/app/src/main/assets/sample/界面控件/下拉菜单.js @@ -0,0 +1,26 @@ +"ui"; + +ui.layout( + + + 下拉菜单 + + + + 对话框菜单 + + + + + +); + +ui.ok.click(()=>{ + var i = ui.sp1.getSelectedItemPosition(); + var j = ui.sp2.getSelectedItemPosition(); + toast("您的选择是选项" + (i + 1) + "和选项" + (j + 4)); +}); + +ui.select3.click(()=>{ + ui.sp1.setSelection(2); +}); \ No newline at end of file diff --git a/app/src/main/assets/sample/界面控件/图片控件.js b/app/src/main/assets/sample/界面控件/图片控件.js new file mode 100644 index 00000000..04410526 --- /dev/null +++ b/app/src/main/assets/sample/界面控件/图片控件.js @@ -0,0 +1,32 @@ +"ui"; + +ui.layout( + + + + + + + + + + + + + + + + + + +); + +var downloadId = null; + +ui.download.click(()=>{ + if(downloadId != null){ + stopDownload(); + }else{ + startDownload(); + } +}); + +function stopDownload(){ + ui.download.text("开始下载"); + clearInterval(downloadId); + downloadId = null; +} + +function startDownload(){ + if(ui.progress.getProgress() == 100){ + ui.progress.setProgress(0); + } + ui.download.text("停止下载"); + downloadId = setInterval(()=>{ + var p = ui.progress.getProgress(); + p++; + if(p > 100){ + stopDownload(); + return; + } + ui.progress.setProgress(p); + ui.progress_value.setText(p.toString()); + }, 200); +} \ No newline at end of file diff --git a/autojs/build.gradle b/autojs/build.gradle index bf93d404..fb6ec486 100644 --- a/autojs/build.gradle +++ b/autojs/build.gradle @@ -50,6 +50,7 @@ dependencies { compile 'com.android.support:appcompat-v7:25.4.0' compile 'com.github.hyb1996:EnhancedFloaty:0.17' compile 'com.github.hyb1996:OpenCvLib:2.4.13.4-imgproc' + compile 'com.makeramen:roundedimageview:2.3.0' // Gson compile 'com.google.code.gson:gson:2.8.0' // Terminal emulator diff --git a/autojs/src/main/assets/modules/__ui__.js b/autojs/src/main/assets/modules/__ui__.js index a4827cbc..91eb34a2 100644 --- a/autojs/src/main/assets/modules/__ui__.js +++ b/autojs/src/main/assets/modules/__ui__.js @@ -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); } diff --git a/autojs/src/main/java/com/stardust/autojs/core/ui/ConvertLayoutInflater.java b/autojs/src/main/java/com/stardust/autojs/core/ui/ConvertLayoutInflater.java index 67d771a5..a125ae55 100644 --- a/autojs/src/main/java/com/stardust/autojs/core/ui/ConvertLayoutInflater.java +++ b/autojs/src/main/java/com/stardust/autojs/core/ui/ConvertLayoutInflater.java @@ -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); diff --git a/autojs/src/main/java/com/stardust/autojs/core/ui/widget/JsImageView.java b/autojs/src/main/java/com/stardust/autojs/core/ui/widget/JsImageView.java new file mode 100644 index 00000000..fb589bd5 --- /dev/null +++ b/autojs/src/main/java/com/stardust/autojs/core/ui/widget/JsImageView.java @@ -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); + } + } +} diff --git a/autojs/src/main/java/com/stardust/autojs/core/ui/xml/AttributeHandler.java b/autojs/src/main/java/com/stardust/autojs/core/ui/xml/AttributeHandler.java index e9688860..477b931f 100644 --- a/autojs/src/main/java/com/stardust/autojs/core/ui/xml/AttributeHandler.java +++ b/autojs/src/main/java/com/stardust/autojs/core/ui/xml/AttributeHandler.java @@ -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; } diff --git a/autojs/src/main/java/com/stardust/autojs/core/ui/xml/JsImageViewAttrSetter.java b/autojs/src/main/java/com/stardust/autojs/core/ui/xml/JsImageViewAttrSetter.java new file mode 100644 index 00000000..3f869abb --- /dev/null +++ b/autojs/src/main/java/com/stardust/autojs/core/ui/xml/JsImageViewAttrSetter.java @@ -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 extends ImageViewAttrSetter { + + + protected static final ValueMapper SCALE_TYPES = new ValueMapper("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 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; + } +} 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 38459328..4094810b 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 @@ -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()