复杂界面

## WannaCry(仅为娱乐) ```js "ui"; /** * By Da Zhang * 本脚本仅为娱乐,没有任何破坏性质 */ ui.statusBarColor("#AA0000"); var Quin = 32552732; ui.layout( <frame background="#AA0000"> <vertical align="top" paddingTop="5" margin="10"> <text id="oops" color="#FFFFFF" gravity="center" size="20">Oops, your files have been encrypted!</text> <text id="text" bg="#FFFFFF" gravity="left" color="#000000" size="15" marginTop="15" h="425"></text> <button id="payment" text="Payment" margin="20 0 0 0"/> <button id="decrypt" text="Decrypt"/> </vertical> </frame> ); ui.text.text("我的手机出了什么问题?\n您的一些重要文件被我加密保存了。\n" + "照片、图片、文档、压缩包、音频、视频文件、apk文件等,几乎所有类型的文件都被加密了,因此不能正常打开。\n" + "这和一般文件损坏有本质上的区别。您大可在网上找找恢复文件的方法,我敢保证,没有我们的解密服务,就算老天爷来了也不能恢复这些文档。\n\n" + "有没有恢复这些文档的方法?\n当然有可恢复的方法。只能通过我们的解密服务才能恢复。我以人格担保,能够提供安全有效的恢复服务。\n" + "但这是收费的,也不能无限期的推迟。\n请点击 <Decrypt> 按钮,就可以免费恢复一些文档。请您放心,我是绝不会骗你的。\n" + "但想要恢复全部文档,需要付款点费用。\n是否随时都可以固定金额付款,就会恢复的吗,当然不是,推迟付款时间越长,对你不利。\n" + "最好3天之内付款费用,过了三天费用就会翻倍。\n还有,一个礼拜之内未付款,将会永远恢复不了。\n" + "对了,忘了告诉你,对半年以上没钱付款的穷人,会有活动免费恢复,能否轮到你,就要看您的运气怎么样了。"); ui.oops.click(() => toast("Fuck you!")); ui.oops.longClick(() => { var thisjoke="This is a joke : )"; if(ui.oops.text() != thisjoke){ ui.oops.text(thisjoke); }else{ ui.oops.text("Oops, your files have been encrypted!"); } return true; }); ui.text.click(() => ui.text.append("。")); ui.text.longClick(() => { ui.text.setText("\n"+ui.text.getText()) return true; }); ui.payment.click(() => { try{ app.startActivity({ action:"android.intent.action.VIEW", data:"mqqapi://card/show_pslcard?&uin=" + Quin }); toast("Please payment by QQ"); }catch(e){ toast("Payment Error"); } }); ui.payment.longClick(() => { toast("You are silly b!"); return true; }); ui.decrypt.click(() => { toast("Decrypt Error"); activity.finish(); }); ui.decrypt.longClick(() => { toast("You can't decrypt!"); return true; }); ``` ## 待办事项 ```js "ui"; ui.layout( <frame> <vertical> <appbar> <toolbar id="toolbar" title="Todo" /> </appbar> <list id="todoList"> <card w="*" h="70" margin="10 5" cardCornerRadius="2dp" cardElevation="1dp" foreground="?selectableItemBackground"> <horizontal gravity="center_vertical"> <View bg="{{this.color}}" h="*" w="10" /> <vertical padding="10 8" h="auto" w="0" layout_weight="1"> <text id="title" text="{{this.title}}" textColor="#222222" textSize="16sp" maxLines="1" /> <text text="{{this.summary}}" textColor="#999999" textSize="14sp" maxLines="1" /> </vertical> <checkbox id="done" marginLeft="4" marginRight="6" checked="{{this.done}}" /> </horizontal> </card> </list> </vertical> <fab id="add" w="auto" h="auto" src="@drawable/ic_add_black_48dp" margin="16" layout_gravity="bottom|right" tint="#ffffff" /> </frame> ); var materialColors = ["#e91e63", "#ab47bc", "#5c6bc0", "#7e57c2", "##2196f3", "#00bcd4", "#26a69a", "#4caf50", "#8bc34a", "#ffeb3b", "#ffa726", "#78909c", "#8d6e63"]; var storage = storages.create("todoList"); //从storage获取todo列表 var todoList = storage.get("items", [ { title: "写操作系统作业", summary: "明天第1~2节", color: "#f44336", done: false }, { title: "给ui模式增加若干Bug", summary: "无限期", color: "#ff5722", done: false }, { title: "发布Auto.js 5.0.0正式版", summary: "2019年1月", color: "#4caf50", done: false }, { title: "完成毕业设计和论文", summary: "2019年4月", color: "#2196f3", done: false } ]);; ui.todoList.setDataSource(todoList); ui.todoList.on("item_bind", function (itemView, itemHolder) { //绑定勾选框事件 itemView.done.on("check", function (checked) { let item = itemHolder.item; item.done = checked; let paint = itemView.title.paint; //设置或取消中划线效果 if (checked) { paint.flags |= Paint.STRIKE_THRU_TEXT_FLAG; } else { paint.flags &= ~Paint.STRIKE_THRU_TEXT_FLAG; } itemView.title.invalidate(); }); }); ui.todoList.on("item_click", function (item, i, itemView, listView) { itemView.done.checked = !itemView.done.checked; }); ui.todoList.on("item_long_click", function (e, item, i, itemView, listView) { confirm("确定要删除" + item.title + "吗?") .then(ok => { if (ok) { todoList.splice(i, 1); } }); e.consumed = true; }); //当离开本界面时保存todoList ui.emitter.on("pause", () => { storage.put("items", todoList); }); ui.add.on("click", () => { dialogs.rawInput("请输入标题") .then(title => { if (!title) { return; } dialogs.rawInput("请输入期限", "明天") .then(summary => { todoList.push({ title: title, summary: summary, color: materialColors[random(0, materialColors.length - 1)] }); }); }) }); ``` ## 登录界面 ```js "ui"; showLoginUI(); ui.statusBarColor("#000000") //显示登录界面 function showLoginUI(){ ui.layout( <frame> <vertical h="auto" align="center" margin="0 50"> <linear> <text w="56" gravity="center" color="#111111" size="16">用户名</text> <input id="name" w="*" h="40"/> </linear> <linear> <text w="56" gravity="center" color="#111111" size="16">密码</text> <input id="password" w="*" h="40" password="true"/> </linear> <linear gravity="center"> <button id="login" text="登录"/> <button id="register" text="注册"/> </linear> </vertical> </frame> ); ui.login.on("click", () => { toast("您输入的用户名为" + ui.name.text() + " 密码为" + ui.password.text()); }); ui.register.on("click", () => showRegisterUI()); } //显示注册界面 function showRegisterUI(){ ui.layout( <frame> <vertical h="auto" align="center" margin="0 50"> <linear> <text w="56" gravity="center" color="#111111" size="16">用户名</text> <input w="*" h="40"/> </linear> <linear> <text w="56" gravity="center" color="#111111" size="16">密码</text> <input w="*" h="40" password="true"/> </linear> <linear> <text w="56" gravity="center" color="#111111" size="16">邮箱</text> <input w="*" h="40" inputType="textEmailAddress"/> </linear> <linear gravity="center"> <button>确定</button> <button id="cancel">取消</button> </linear> </vertical> </frame> ); ui.cancel.on("click", () => showLoginUI()); } ``` ## 界面模板一 ```js "ui"; var color = "#009688"; ui.layout( <drawer id="drawer"> <vertical> <appbar> <toolbar id="toolbar" title="示例"/> <tabs id="tabs"/> </appbar> <viewpager id="viewpager"> <frame> <text text="第一页内容" textColor="black" textSize="16sp"/> </frame> <frame> <text text="第二页内容" textColor="red" textSize="16sp"/> </frame> <frame> <text text="第三页内容" textColor="green" textSize="16sp"/> </frame> </viewpager> </vertical> <vertical layout_gravity="left" bg="#ffffff" w="280"> <img w="280" h="200" scaleType="fitXY" src="http://images.shejidaren.com/wp-content/uploads/2014/10/023746fki.jpg"/> <list id="menu"> <horizontal bg="?selectableItemBackground" w="*"> <img w="50" h="50" padding="16" src="{{this.icon}}" tint="{{color}}"/> <text textColor="black" textSize="15sp" text="{{this.title}}" layout_gravity="center"/> </horizontal> </list> </vertical> </drawer> ); //创建选项菜单(右上角) ui.emitter.on("create_options_menu", menu=>{ menu.add("设置"); menu.add("关于"); }); //监听选项菜单点击 ui.emitter.on("options_item_selected", (e, item)=>{ switch(item.getTitle()){ case "设置": toast("还没有设置"); break; case "关于": alert("关于", "Auto.js界面模板 v1.0.0"); break; } e.consumed = true; }); activity.setSupportActionBar(ui.toolbar); //设置滑动页面的标题 ui.viewpager.setTitles(["标签一", "标签二", "标签三"]); //让滑动页面和标签栏联动 ui.tabs.setupWithViewPager(ui.viewpager); //让工具栏左上角可以打开侧拉菜单 ui.toolbar.setupWithDrawer(ui.drawer); ui.menu.setDataSource([ { title: "选项一", icon: "@drawable/ic_android_black_48dp" }, { title: "选项二", icon: "@drawable/ic_settings_black_48dp" }, { title: "选项三", icon: "@drawable/ic_favorite_black_48dp" }, { title: "退出", icon: "@drawable/ic_exit_to_app_black_48dp" } ]); ui.menu.on("item_click", item => { switch(item.title){ case "退出": ui.finish(); break; } }) ``` ## 音乐浏览器 ```js "ui"; var IconView = (function() { //继承ui.Widget util.extend(IconView, ui.Widget); function IconView() { //调用父类构造函数 ui.Widget.call(this); //自定义属性color,定义按钮颜色 this.defineAttr("icon", (view, name, defaultGetter) => { return this._icon; }, (view, name, value, defaultSetter) => { this._icon = value; view.setImageResource(value); }); } IconView.prototype.render = function() { return ( <img /> ); } ui.registerWidget("icon", IconView); return IconView; })(); var apps = []; ui.layout( <vertical bg="#ffffff"> <list id="apps" layout_weight="1"> <linear bg="?selectableItemBackground"> <icon icon="{{this.icon}}" w="50" h="70" margin="16" /> <vertical> <text id="name" textSize="16sp" textColor="#000000" text="{{this.appName}}" marginTop="16" maxLines="1" ellipsize="end"/> <text id="path" textSize="13sp" textColor="#929292" text="{{this.packageName}}" marginTop="8" maxLines="1" ellipsize="end"/> </vertical> </linear> </list> <progressbar id="progressbar" indeterminate="true" style="@style/Base.Widget.AppCompat.ProgressBar.Horizontal"/> </vertical> ); ui.apps.setDataSource(apps); ui.apps.on("item_click", function(item, pos){ toast(item); }); //启动线程来扫描音乐文件 threads.start(function () { listApps(apps); ui.run(()=> { ui.progressbar.setVisibility(8); }); }); function listApps(apps) { var pm = context.getPackageManager(); let list = pm.getInstalledPackages(0); for(let i = 0; i < list.size(); i++){ let p = list.get(i); apps.push({ appName: p.applicationInfo.loadLabel(pm).toString(), packageName: p.packageName, versionName: p.versionName, versionCode: p.versionCode, icon: p.applicationInfo.loadIcon(pm) }); } } ``` ## 用户调查 ```js "ui"; ui.layout( <vertical> <text textSize="18sp" textColor="#000000" margin="20" textStyle="bold"> 关于Auto.js的用户调查 </text> <ScrollView> <vertical> <text textSize="16sp" margin="8">1. 您的年龄是?</text> <input text="18" inputType="number" margin="0 16"/> <text textSize="16sp" margin="8">2. 您用过其他类似软件(脚本精灵,按键精灵等)吗?</text> <radiogroup margin="0 16"> <radio text="没有用过"/> <radio text="用过"/> <radio text="用过,感觉不好用"/> <radio text="没有Root权限无法使用"/> </radiogroup> <text textSize="16sp" margin="8">3. 您使用Auto.js通常用于做什么?(多选)</text> <checkbox text="游戏辅助" marginLeft="16"/> <checkbox text="点赞" marginLeft="16"/> <checkbox text="日常生活工作辅助" marginLeft="16"/> <checkbox text="练习编程" marginLeft="16"/> <checkbox text="自动化测试" marginLeft="16"/> <linear> <checkbox text="其他" marginLeft="16"/> <input w="*" margin="0 16"/> </linear> <text textSize="16sp" margin="8">4. 您更喜欢以下哪个图标?</text> <radiogroup margin="0 16"> <radio/> <img w="100" h="100" margin="0 16" src="http://www.autojs.org/assets/uploads/profile/3-profileavatar.png"/> <radio/> <img w="100" h="100" margin="0 16" src="http://www.autojs.org/assets/uploads/files/1511945512596-autojs_logo.png"/> </radiogroup> <text textSize="16sp" margin="8">5. 您是什么时候开始使用Auto.js的呢?</text> <datepicker margin="4 16" datePickerMode="spinner"/> <text textSize="16sp" margin="8">6. 您用过下面这个Auto.js的论坛吗?</text> <webview id="webview" h="300" margin="0 16"/> <radiogroup marginLeft="16" marginTop="16"> <radio text="没有用过"/> <radio text="用过"/> <radio text="用过,感觉不好用"/> </radiogroup> <linear gravity="center"> <button margin="16">提交</button> <button margin="16">放弃</button> </linear> </vertical> </ScrollView> </vertical> ) ui.webview.loadUrl("http://www.autojs.org"); ```