其他

## ui.layout(xml) * `xml` {XML} | {string} 布局XML或者XML字符串 将布局XML渲染为视图(View)对象, 并设置为当前视图。 ## ui.layoutFile(xmlFile) * `xml` {string} 布局XML文件的路径 此函数和`ui.layout`相似,只不过允许传入一个xml文件路径来渲染布局。 ## ui.inflate(xml[, parent = null, attachToParent = false]) * `xml` {string} | {XML} 布局XML或者XML字符串 * `parent` {View} 父视图 * `attachToParent` {boolean} 是否渲染的View加到父视图中,默认为false * 返回 {View} 将布局XML渲染为视图(View)对象。如果该View将作为某个View的子View,我们建议传入`parent`参数,这样在渲染时依赖于父视图的一些布局属性能够正确应用。 此函数用于动态创建、显示View。 ```javascript "ui"; $ui.layout( <linear id="container"> </linear> ); // 动态创建3个文本控件,并加到container容器中 // 这里仅为实例,实际上并不推荐这种做法,如果要展示列表, // 使用list组件;动态创建十几个、几十个View会让界面卡顿 for (let i = 0; i < 3; i++) { let textView = $ui.inflate( <text textColor="#000000" textSize="14sp"/> , $ui.container); textView.attr("text", "文本控件" + i); $ui.container.addView(textView); } ``` ## ui.registerWidget(name, widget) * `name` {string} 组件名称 * `widget` {Function} 组件 注册一个自定义组件。参考示例->界面控件->自定义控件。 ## ui.isUiThread() * 返回 {boolean} 返回当前线程是否是UI线程。 ```javascript "ui"; log($ui.isUiThread()); // => true $threads.start(function () { log($ui.isUiThread()); // => false }); ``` ## ui.findView(id) * `id` {string} View的ID * 返回 {View} 在当前视图中根据ID查找相应的视图对象并返回。如果当前未设置视图或找不到此ID的视图时返回`null`。 一般我们都是通过`ui.xxx`来获取id为xxx的控件,如果xxx是一个ui已经有的属性,就可以通过`$ui.findView()`来获取这个控件。 ## ui.finish() 结束当前活动并销毁界面。 ## ui.setContentView(view) * `view` {View} 将视图对象设置为当前视图。 ## ui.post(callback[, delay = 0]) * `callback` {Function} 回调函数 * `delay` {number} 延迟,单位毫秒 将`callback`加到UI线程的消息循环中,并延迟delay毫秒后执行(不能准确保证一定在delay毫秒后执行)。 此函数可以用于UI线程中延时执行动作(sleep不能在UI线程中使用),也可以用于子线程中更新UI。 ```javascript "ui"; ui.layout( <frame> <text id="result"/> </frame> ); ui.result.attr("text", "计算中"); // 在子线程中计算1+ ... + 10000000 threads.start({ let sum = 0; for (let i = 0; i < 1000000; i++) { sum += i; } // 由于不能在子线程操作UI,所以要抛到UI线程执行 ui.post(() => { ui.result.attr("text", String(sum)); }); }); ``` ## ui.run(callback) * `callback` {Function} 回调函数 * 返回 callback的执行结果 将`callback`在UI线程中执行。如果当前已经在UI线程中,则直接执行`callback`;否则将`callback`抛到UI线程中执行(加到UI线程的消息循环的末尾),**并等待callback执行结束(阻塞当前线程)**。 ## ui.statusBarColor(color) * color {string} | {number} 颜色 设置当前界面的状态栏颜色。 ```javascript "ui"; ui.statusBarColor("#000000"); ``` ## ui.useAndroidResources() 启用使用Android的布局(layout)、绘图(drawable)、动画(anim)、样式(style)等资源的特性。启用该特性后,在project.json中进行以下配置,就可以像写Android原生一样写界面: ```json { // ... androidResources: { "resDir": "res", // 资源文件夹 "manifest": "AndroidManifest.xml" // AndroidManifest文件路径 } } ``` res文件夹通常为以下结构: ``` - res - layout // 布局资源 - drawable // 图片、形状等资源 - menu // 菜单资源 - values // 样式、字符串等资源 // ... ``` 可参考示例->复杂界面->Android原生界面。 ## $ui.imageCache.clearDiskCache() **[[Pro 8.8.16新增](https://pro.autojs.org/)]** 清除UI的图片文件缓存,通常是清除使用url下载的图片缓存。(比如img控件的url链接加载的图片) 此函数也可用于清除自定义启动图中的图片控件的文件缓存。 此函数和找图找色无关,并不会清除图色相关的图片内存、缓存。 此函数需要若在UI线程执行,会自动切换到IO线程异步执行,因此在UI线程执行时,函数返回不代表文件缓存已全部清理完毕。 ## $ui.imageCache.clearMemory() **[[Pro 8.8.16新增](https://pro.autojs.org/)]** 清除UI的图片内存缓存。 此函数和找图找色无关,并不会清除图色相关的图片内存、缓存。 # 尺寸的单位: Dimension # Drawables # 颜色 **(完善中...)** ## 使用AutoJs编写UI的踩坑记录 相对于脚本而言,一般不写UI最好.但有时候要确认用户的选择和输入,不得不使用UI或者悬浮窗... 但两者的功能和实现方法 是一样的. 针对于初次编写UI界面的同学来说,可能会遇到各种各样的坑. #### 坑1: 不管你的代码多么少, "ui"; 这个字符串,必须放在第一行,在它之上,不能有任何的代码和注释 #### 坑2: 整个UI编写过程中,有一个非常重要的原则: UI线程中除函数和公用变量外不要写任何流程性质的代码,如果要写流程,必须使用线程 ```js threads.start(function() { //这里写你的流程代码 }); ``` #### 坑3: 使用线程时,如果要对UI中的数据进行修改,最好使用下面的方法来执行: ``` threads.start(function() { //流程代码 ui.run(()=>{ //这里写针对UI的操作 }); }); ``` #### 坑4: 为了方便管理,所有开的线程,根据不同功能,最好都定义各个线程的变量名 ``` var Thread = threads.start(function() {}); ``` #### 坑5: 线程函数,不能简写 观察上面的代码,你会发现: ui.run()中 我的写法是: ``` ui.run(()=>{}); ``` 而在线程 threads.start();中,我的写法是: ``` threads.start(function() {}); ``` #### 坑6: 使用setVisibility()方法时,一定要 importClass(android.view.View); 括号中的属性包括: - View.GONE //完全隐藏控件 - View.INVISIBLE //隐藏控件,但保留控件的位置 - View.VISIBLE //默认属性, 显示控件 #### 坑7: 针对text控件的对齐 gravity 要在 linear 布局中进行设置,例如 ``` <linear gravity="right|center" w="80" h="*"> <text text="当前速度: " textColor="#FFFFFF" textSize="16sp" /> </linear> ``` #### 坑8: 不同机型,不同DPI适配 在线性布局中 务必灵活运用 layout_weight,否则,分辨率改变 DPI改变后,你的UI 会变形 # 常见问题 ## ui组件上面的属性能设置变量吗? 可以。参考下列代码: ```js // 唯一的全局变量MYAPP "ui"; var myAPP = {}; myAPP.title = "某音关注私信"; //脚本名称 myAPP.programVersion = "v20190610"; //版本号 myAPP.identifier = ""; //程序编号 myAPP.packageName = "com.ss.android.ugc.aweme"; //包名 myAPP.interface = "我的/TA的粉丝列表"; //起始界面 myAPP.appVersion = "6.6.0" //APP版本 myAPP.fitRatio = "全分辨率" //适配的分辨率 myAPP.fitDevice = "真机、模拟器" //适配的设备 ui.layout( <drawer id="drawer"> <vertical> <appbar background="{{myAPP.color}}"> <toolbar id="toolbar" title="{{myAPP.identifier + myAPP.title}}" /> <tabs id="tabs" /> </appbar> <viewpager id="viewpager"> <frame> <ScrollView> <vertical marginTop="10"> <card w="*" h="auto" margin="10 5" cardCornerRadius="2dp" cardElevation="1dp" gravity="center_vertical"> <vertical padding="18 8" h="auto"> <text margin="0 5" text="程序版本:{{myAPP.programVersion}}" textColor="black" w="auto" /> <text margin="0 5" text="程序编号:{{myAPP.identifier}}" textColor="black" w="auto" /> <text margin="0 5" text="适配APP版本:{{myAPP.appVersion}}" textColor="black" w="auto" /> <text margin="0 5" text="适配分辨率:{{myAPP.fitRatio}}" textColor="black" w="auto" /> <text margin="0 5" text="APP起始界面:{{myAPP.interface}}" textColor="black" w="auto" /> <text margin="0 5" text="适配设备:{{myAPP.fitDevice}}" textColor="black" w="auto" /> </vertical> <View bg="#00ABA9" h="*" w="5" /> </card> </vertical> </ScrollView> </frame> </viewpager> </vertical> </drawer> ); ```