diff --git a/app/src/main/assets/docs/all.html b/app/src/main/assets/docs/all.html index ef9bb41b..051d0aa2 100644 --- a/app/src/main/assets/docs/all.html +++ b/app/src/main/assets/docs/all.html @@ -19,7 +19,7 @@
@@ -28,7 +28,7 @@The goal of this documentation is to comprehensively explain the Node.js -API, both from a reference as well as a conceptual point of view. Each -section describes a built-in module or high-level concept.
-Where appropriate, property types, method arguments, and the arguments -provided to event handlers are detailed in a list underneath the topic -heading.
-Every .html document has a corresponding .json document presenting
-the same information in a structured manner. This feature is
-experimental, and added for the benefit of IDEs and other utilities that
-wish to do programmatic things with the documentation.
Every .html and .json file is generated based on the corresponding
-.md file in the doc/api/ folder in Node.js's source tree. The
-documentation is generated using the tools/doc/generate.js program.
-The HTML template is located at doc/template.html.
If errors are found in this documentation, please submit an issue -or see the contributing guide for directions on how to submit a patch.
-Throughout the documentation are indications of a section's -stability. The Node.js API is still somewhat changing, and as it -matures, certain parts are more reliable than others. Some are so -proven, and so relied upon, that they are unlikely to ever change at -all. Others are brand new and experimental, or known to be hazardous -and in the process of being redesigned.
-The stability indices are as follows:
-Note: Caution must be used when making use of Experimental features,
-particularly within modules that may be used as dependencies (or dependencies
-of dependencies) within a Node.js application. End users may not be aware that
-experimental features are being used, and therefore may experience unexpected
-failures or behavioral changes when changes occur. To help avoid such surprises,
-Experimental features may require a command-line flag to explicitly enable
-them, or may cause a process warning to be emitted. By default, such warnings
-are printed to stderr and may be handled by attaching a listener to the
-process.on('warning') event.
Every HTML file in the markdown has a corresponding JSON file with the -same data.
-This feature was added in Node.js v0.6.12. It is experimental.
-System calls like open(2) and read(2) define the interface between user programs
-and the underlying operating system. Node functions which simply wrap a syscall,
-like fs.open(), will document that. The docs link to the corresponding man
-pages (short for manual pages) which describe how the syscalls work.
Note: some syscalls, like lchown(2), are BSD-specific. That means, for
-example, that fs.lchown() only works on macOS and other BSD-derived systems,
-and is not available on Linux.
Most Unix syscalls have Windows equivalents, but behavior may differ on Windows -relative to Linux and macOS. For an example of the subtle ways in which it's -sometimes impossible to replace Unix syscall semantics on Windows, see Node -issue 4760.
+本文档为Auto.js的文档,解释了Auto.js各个模块的API的使用方法、作用和例子。
+文档借助Node.js的文档构建工具生成,并在github上开源(https://github.com/hyb1996/AutoJs-Docs ),目前由开发者维护。
+由于Auto.js处于活跃的更新和开发状态,API可能随时有变动,我们用Stability来标记模块、函数的稳定性。这些标记包括:
+先看一个例子,下面是基于控件的操作模拟的章节中input函数的部分说明。
+input表示函数名,括号内的[i, ]text为函数的参数。下面是参数列表,"number"表示参数i的类型为数值,"string"表示参数text的类型为字符串。
例如input(1, "啦啦啦"),执行这个语句会在屏幕上的第2个输入框处输入"啦啦啦"。
+方括号[ ]表示参数为可选参数。也就是说,可以省略i直接调用input。例如input("嘿嘿嘿"),按照文档,这个语句会在屏幕上所有输入框输入"嘿嘿嘿"。
+调用有可选参数的函数时请不要写上方括号。
+我们再看第二个例子。图片和图色处理中detectsColor函数的部分说明。
+image <Image> 图片color <number> | <string> 要检测的颜色x <number> 要检测的位置横坐标y <number> 要检测的位置纵坐标threshold <number> 颜色相似度临界值,默认为16。取值范围为0~255。algorithm <string> 颜色匹配算法,包括:
"rgb": rgb欧拉距离相似度。与给定颜色color的rgb欧拉距离小于等于threshold时匹配。
+"rgb+": 加权rgb欧拉距离匹配(LAB Delta E)。
+同样地,[, threshold = 16, algorithm = "rgb"]为可选参数,并且,等于号=后面的值为参数的默认值。也就是如果不指定该参数,则该参数将会为这个值。
例如 images.detectsColor(captureScreen(), "#112233", 100, 200) 相当于 images.detectsColor(captureScreen(), "#112233", 100, 200, 16, "rgb"),
+而images.detectsColor(captureScreen(), "#112233", 100, 200, 64) 相当于images.detectsColor(captureScreen(), "#112233", 100, 200, 64, "rgb")。
调用有可选参数及默认值的函数时请不要写上方括号和等于号。
该函数也可以作为全局函数使用。
严格找色的简便方法。找色时要求颜色完全相等才匹配。
-相当于
-images.findColor(img, color, {
- region: [x, y, width, height],
- threshold: 0
-});
-该函数也可以作为全局函数使用。
+在图片img指定区域中找到颜色和color完全相等的某个点,并返回该点的左边;如果没有找到,则返回null。
找色区域通过x, y, width, height指定,如果不指定找色区域,则在整张图片中寻找。
该函数也可以作为全局函数使用。
示例: (通过找QQ红点的颜色来判断是否有未读消息)
requestScreenCapture();
@@ -276,11 +281,14 @@ if(p){
x <number> 要检测的位置横坐标
y <number> 要检测的位置纵坐标
threshold <number> 颜色相似度临界值,默认为16。取值范围为0~255。
-algorithm <string> 颜色匹配算法,包括:
+algorithm <string> 颜色匹配算法,包括:
+
- "equal": 相等匹配,只有与给定颜色color完全相等时才匹配。
- "diff": 差值匹配。与给定颜色的R、G、B差的绝对值之和小于threshold时匹配。
-- "rgb": rgb欧拉距离相似度。与给定颜色color的rgb欧拉距离小于等于threshold时匹配。
-- "rgb+": 加权rgb欧拉距离匹配(LAB Delta E)。
+"rgb": rgb欧拉距离相似度。与给定颜色color的rgb欧拉距离小于等于threshold时匹配。
+
+"rgb+": 加权rgb欧拉距离匹配(LAB Delta E)。
+
- "hs": hs欧拉距离匹配。hs为HSV空间的色调值。
diff --git a/app/src/main/assets/docs/index.html b/app/src/main/assets/docs/index.html
index fa4ef16b..117bac9f 100644
--- a/app/src/main/assets/docs/index.html
+++ b/app/src/main/assets/docs/index.html
@@ -19,7 +19,7 @@
@@ -28,7 +28,7 @@
- Q&A - 常见问题
- App - 应用
- Console - 控制台
-- CoordinatesBasedAutomation - 基于坐标的触摸模拟
+- CoordinatesBasedAutomation - 基于坐标的操作
- Device - 设备
- Dialogs - 对话框
- Engines - 脚本引擎
@@ -40,7 +40,7 @@
- Images - 图片与图色处理
- Keys - 按键模拟
- Modules - 模块
-- WidgetsBasedAutomation - 基于控件的触摸模拟
+- WidgetsBasedAutomation - 基于控件的操作
- Shell - Shell命令
- Storages - 本地存储
- Threads - 多线程
@@ -78,7 +78,7 @@
@@ -87,7 +87,7 @@
- Q&A - 常见问题
- App - 应用
- Console - 控制台
-- CoordinatesBasedAutomation - 基于坐标的触摸模拟
+- CoordinatesBasedAutomation - 基于坐标的操作
- Device - 设备
- Dialogs - 对话框
- Engines - 脚本引擎
@@ -99,7 +99,7 @@
- Images - 图片与图色处理
- Keys - 按键模拟
- Modules - 模块
-- WidgetsBasedAutomation - 基于控件的触摸模拟
+- WidgetsBasedAutomation - 基于控件的操作
- Shell - Shell命令
- Storages - 本地存储
- Threads - 多线程
diff --git a/app/src/main/assets/docs/keys.html b/app/src/main/assets/docs/keys.html
index 05df24b6..444ef845 100644
--- a/app/src/main/assets/docs/keys.html
+++ b/app/src/main/assets/docs/keys.html
@@ -19,7 +19,7 @@
@@ -28,7 +28,7 @@
- Q&A - 常见问题
- App - 应用
- Console - 控制台
-- CoordinatesBasedAutomation - 基于坐标的触摸模拟
+- CoordinatesBasedAutomation - 基于坐标的操作
- Device - 设备
- Dialogs - 对话框
- Engines - 脚本引擎
@@ -40,7 +40,7 @@
- Images - 图片与图色处理
- Keys - 按键模拟
- Modules - 模块
-- WidgetsBasedAutomation - 基于控件的触摸模拟
+- WidgetsBasedAutomation - 基于控件的操作
- Shell - Shell命令
- Storages - 本地存储
- Threads - 多线程
diff --git a/app/src/main/assets/docs/modules.html b/app/src/main/assets/docs/modules.html
index 972fb550..42b3a6fc 100644
--- a/app/src/main/assets/docs/modules.html
+++ b/app/src/main/assets/docs/modules.html
@@ -19,7 +19,7 @@
@@ -28,7 +28,7 @@
- Q&A - 常见问题
- App - 应用
- Console - 控制台
-- CoordinatesBasedAutomation - 基于坐标的触摸模拟
+- CoordinatesBasedAutomation - 基于坐标的操作
- Device - 设备
- Dialogs - 对话框
- Engines - 脚本引擎
@@ -40,7 +40,7 @@
- Images - 图片与图色处理
- Keys - 按键模拟
- Modules - 模块
-- WidgetsBasedAutomation - 基于控件的触摸模拟
+- WidgetsBasedAutomation - 基于控件的操作
- Shell - Shell命令
- Storages - 本地存储
- Threads - 多线程
diff --git a/app/src/main/assets/docs/overview.html b/app/src/main/assets/docs/overview.html
index a6e16969..41a2c3ae 100644
--- a/app/src/main/assets/docs/overview.html
+++ b/app/src/main/assets/docs/overview.html
@@ -2,7 +2,7 @@
- Index | Auto.js 3.0.0 文档
+ 综述 | Auto.js 3.0.0 文档
@@ -19,7 +19,7 @@
@@ -28,7 +28,7 @@
- Q&A - 常见问题
- App - 应用
- Console - 控制台
-- CoordinatesBasedAutomation - 基于坐标的触摸模拟
+- CoordinatesBasedAutomation - 基于坐标的操作
- Device - 设备
- Dialogs - 对话框
- Engines - 脚本引擎
@@ -40,7 +40,7 @@
- Images - 图片与图色处理
- Keys - 按键模拟
- Modules - 模块
-- WidgetsBasedAutomation - 基于控件的触摸模拟
+- WidgetsBasedAutomation - 基于控件的操作
- Shell - Shell命令
- Storages - 本地存储
- Threads - 多线程
@@ -71,11 +71,39 @@
目录
-
+
+- 综述
+
+
-
+ 综述#
+Auto.js使用JavaScript作为脚本语言,目前使用Rhino 1.7.7.2作为脚本引擎,支持ES5与部分ES6特性。
+
+- 因为Auto.js是基于JavaScript的,学习Auto.js的API之前建议先学习JavaScript的基本语法和内置对象,可以使用教程前面的两个JavaScript教程链接来学习。
+- 如果您想要使用TypeScript来开发,目前已经有开发者公布了一个可以把使用TypeScript进行Auto.js开发的工具,参见Auto.js DevTools。
+- 如果想要在电脑而不是手机上开发Auto.js,可以使用VS Code以及相应的Auto.js插件使得在电脑上编辑的脚本能推送到手机运行,参见Auto.js-VSCode-Extension。
+
+本文档的章节大致上是以模块来分的,总体上可以分成"自动操作"类模块(控件操作、触摸模拟、按键模拟等)和其他类模块(设备、应用、界面等)。
+"自动操作"的部分又可以大致分为基于控件和基于坐标的操作。基于坐标的操作是传统按键精灵、触摸精灵等脚本软件采用的方式,通过屏幕坐标来点击、长按指定位置模拟操作,从而到达目的。例如click(100, 200), press(100, 200, 500)等。这种方式在游戏类脚本中比较有可行性,结合找图找色、坐标放缩功能也能达到较好的兼容性。但是,这种方式对一般软件脚本却难以达到想要的效果,而且这种方式需要安卓7.0版本以上或者root权限才能执行。所以对于一般软件脚本(例如批量添加联系人、自动提取短信验证码等等),我们采用基于控件的模拟操作方式,结合通知事情、按键事情等达成更好的工作流。这些部分的文档参见基于控件的操作和基于坐标的操作。
+其他部分主要包括:
+
+- app: 应用。启动应用,卸载应用,使用应用查看、编辑文件、访问网页,发送应用间广播等。
+- console: 控制台。记录运行的日志、错误、信息等。
+- device: 设备。获取设备屏幕宽高、系统版本等信息,控制设备音量、亮度等。
+- engines: 脚本引擎。用于启动其他脚本。
+- events: 事件与监听。按键监听,通知监听,触摸监听等。
+- floaty: 悬浮窗。用于显示自定义的悬浮窗。
+- files: 文件系统。文件创建、获取信息、读写。
+- http: HTTP。发送HTTP请求,例如GET, POST等。
+- images, colors: 图片和图色处理。截图,剪切图片,找图找色,读取保存图片等。
+- keys: 按键模拟。比如音量键、Home键模拟等。
+- shell: Shell命令。
+- threads: 多线程支持。
+- ui: UI界面。用于显示自定义的UI界面,和用户交互。
+
+
diff --git a/app/src/main/assets/docs/qa.html b/app/src/main/assets/docs/qa.html
index 70a71cf5..715a7c70 100644
--- a/app/src/main/assets/docs/qa.html
+++ b/app/src/main/assets/docs/qa.html
@@ -2,7 +2,7 @@
- Index | Auto.js 3.0.0 文档
+ Q & A | Auto.js 3.0.0 文档
@@ -19,7 +19,7 @@
@@ -28,7 +28,7 @@
- Q&A - 常见问题
- App - 应用
- Console - 控制台
-- CoordinatesBasedAutomation - 基于坐标的触摸模拟
+- CoordinatesBasedAutomation - 基于坐标的操作
- Device - 设备
- Dialogs - 对话框
- Engines - 脚本引擎
@@ -40,7 +40,7 @@
- Images - 图片与图色处理
- Keys - 按键模拟
- Modules - 模块
-- WidgetsBasedAutomation - 基于控件的触摸模拟
+- WidgetsBasedAutomation - 基于控件的操作
- Shell - Shell命令
- Storages - 本地存储
- Threads - 多线程
@@ -71,11 +71,59 @@
目录
-
+
+
-
+ Q & A#
+如何定时运行脚本#
+点击脚本右边的菜单按钮->更多->定时任务即可定时运行脚本,但是必须保持Auto.js后台运行(自启动白名单、电源管理白名单等)。同时,可以在脚本的开头使用device.wakeUp()来唤醒屏幕;但是,Auto.js没有解锁屏幕的功能,因此难以在有锁屏密码的设备上达到效果。
+如何把图片和脚本一起打包,或者打包多个脚本#
+如果除了单脚本以外还有其他脚本、图片、音乐等资源一起打包,则需要使用项目打包功能。
+
+- 新建一个文件夹,命名为项目名称。
+- 在该文件夹下新建脚本,或者移动脚本到该文件夹,命名为main.js,表示主脚本。脚本打包后将会从该脚本开始运行。
+- 把其他资源或脚本放在该文件夹,并通过相对路径引用。
+- 通过文件夹菜单的"打包"功能来打包该项目
+
+例如,主脚本要读取同一文件夹下的图片1.png,再执行找图,则可以通过images.read("./1.png")来读取,其中"./1.png"表示同一目录1.png图片;ui中的图片控件要引用同一文件夹的2.png图片则为<img src="file://2.png"/>。Auto.js内置的函数和模块都支持相对路径,但是,其他情况则需要使用files.path()函数来把相对路径转换为绝对路径。
+目前Auto.js还不支持项目的图形化管理,后续会加入。
+Auto.js自带的模块和函数中没有的功能如何实现#
+由于Auto.js支持直接调用Android的API,对于Auto.js没有内置的函数,可以直接通过修改Android代码为JavaScript代码实现。例如旋转图片的Android代码为:
+import android.graphics.Bitmap;
+import android.graphics.Matrix;
+
+public static Bitmap rotate(final Bitmap src,
+ final int degrees,
+ final float px,
+ final float py) {
+ if (degrees == 0) return src;
+ Matrix matrix = new Matrix();
+ matrix.setRotate(degrees, px, py);
+ Bitmap ret = Bitmap.createBitmap(src, 0, 0, src.getWidth(), src.getHeight(), matrix, true);
+ return ret;
+}
+
转换为JavaScript的代码后为:
+importClass(android.graphics.Bitmap);
+importClass(android.graphics.Matrix);
+
+function rotate(src, degrees, px, py){
+ if (degrees == 0) return src;
+ var matrix = new Matrix();
+ matrix.setRotate(degrees, px, py);
+ var ret = Bitmap.createBitmap(src, 0, 0, src.getWidth(), src.getHeight(), matrix, true);
+ return ret;
+}
+
有关调用Android和Java的API的更多信息,参见Work with Java。
+
diff --git a/app/src/main/assets/docs/shell.html b/app/src/main/assets/docs/shell.html
index 28dc1de7..c0a3b1cf 100644
--- a/app/src/main/assets/docs/shell.html
+++ b/app/src/main/assets/docs/shell.html
@@ -19,7 +19,7 @@
@@ -28,7 +28,7 @@
- Q&A - 常见问题
- App - 应用
- Console - 控制台
-- CoordinatesBasedAutomation - 基于坐标的触摸模拟
+- CoordinatesBasedAutomation - 基于坐标的操作
- Device - 设备
- Dialogs - 对话框
- Engines - 脚本引擎
@@ -40,7 +40,7 @@
- Images - 图片与图色处理
- Keys - 按键模拟
- Modules - 模块
-- WidgetsBasedAutomation - 基于控件的触摸模拟
+- WidgetsBasedAutomation - 基于控件的操作
- Shell - Shell命令
- Storages - 本地存储
- Threads - 多线程
diff --git a/app/src/main/assets/docs/storages.html b/app/src/main/assets/docs/storages.html
index cd2b7ae7..89388932 100644
--- a/app/src/main/assets/docs/storages.html
+++ b/app/src/main/assets/docs/storages.html
@@ -19,7 +19,7 @@
@@ -28,7 +28,7 @@
- Q&A - 常见问题
- App - 应用
- Console - 控制台
-- CoordinatesBasedAutomation - 基于坐标的触摸模拟
+- CoordinatesBasedAutomation - 基于坐标的操作
- Device - 设备
- Dialogs - 对话框
- Engines - 脚本引擎
@@ -40,7 +40,7 @@
- Images - 图片与图色处理
- Keys - 按键模拟
- Modules - 模块
-- WidgetsBasedAutomation - 基于控件的触摸模拟
+- WidgetsBasedAutomation - 基于控件的操作
- Shell - Shell命令
- Storages - 本地存储
- Threads - 多线程
diff --git a/app/src/main/assets/docs/threads.html b/app/src/main/assets/docs/threads.html
index 85d2d2bf..4b6ea3e3 100644
--- a/app/src/main/assets/docs/threads.html
+++ b/app/src/main/assets/docs/threads.html
@@ -19,7 +19,7 @@
@@ -28,7 +28,7 @@
- Q&A - 常见问题
- App - 应用
- Console - 控制台
-- CoordinatesBasedAutomation - 基于坐标的触摸模拟
+- CoordinatesBasedAutomation - 基于坐标的操作
- Device - 设备
- Dialogs - 对话框
- Engines - 脚本引擎
@@ -40,7 +40,7 @@
- Images - 图片与图色处理
- Keys - 按键模拟
- Modules - 模块
-- WidgetsBasedAutomation - 基于控件的触摸模拟
+- WidgetsBasedAutomation - 基于控件的操作
- Shell - Shell命令
- Storages - 本地存储
- Threads - 多线程
diff --git a/app/src/main/assets/docs/timers.html b/app/src/main/assets/docs/timers.html
index e30dea22..135e0f06 100644
--- a/app/src/main/assets/docs/timers.html
+++ b/app/src/main/assets/docs/timers.html
@@ -19,7 +19,7 @@
@@ -28,7 +28,7 @@
- Q&A - 常见问题
- App - 应用
- Console - 控制台
-- CoordinatesBasedAutomation - 基于坐标的触摸模拟
+- CoordinatesBasedAutomation - 基于坐标的操作
- Device - 设备
- Dialogs - 对话框
- Engines - 脚本引擎
@@ -40,7 +40,7 @@
- Images - 图片与图色处理
- Keys - 按键模拟
- Modules - 模块
-- WidgetsBasedAutomation - 基于控件的触摸模拟
+- WidgetsBasedAutomation - 基于控件的操作
- Shell - Shell命令
- Storages - 本地存储
- Threads - 多线程
diff --git a/app/src/main/assets/docs/ui.html b/app/src/main/assets/docs/ui.html
index 9fc20346..a1e2e3d8 100644
--- a/app/src/main/assets/docs/ui.html
+++ b/app/src/main/assets/docs/ui.html
@@ -19,7 +19,7 @@
@@ -28,7 +28,7 @@
- Q&A - 常见问题
- App - 应用
- Console - 控制台
-- CoordinatesBasedAutomation - 基于坐标的触摸模拟
+- CoordinatesBasedAutomation - 基于坐标的操作
- Device - 设备
- Dialogs - 对话框
- Engines - 脚本引擎
@@ -40,7 +40,7 @@
- Images - 图片与图色处理
- Keys - 按键模拟
- Modules - 模块
-- WidgetsBasedAutomation - 基于控件的触摸模拟
+- WidgetsBasedAutomation - 基于控件的操作
- Shell - Shell命令
- Storages - 本地存储
- Threads - 多线程
diff --git a/app/src/main/assets/docs/util.html b/app/src/main/assets/docs/util.html
index 8962167e..4c437983 100644
--- a/app/src/main/assets/docs/util.html
+++ b/app/src/main/assets/docs/util.html
@@ -19,7 +19,7 @@
@@ -28,7 +28,7 @@
- Q&A - 常见问题
- App - 应用
- Console - 控制台
-- CoordinatesBasedAutomation - 基于坐标的触摸模拟
+- CoordinatesBasedAutomation - 基于坐标的操作
- Device - 设备
- Dialogs - 对话框
- Engines - 脚本引擎
@@ -40,7 +40,7 @@
- Images - 图片与图色处理
- Keys - 按键模拟
- Modules - 模块
-- WidgetsBasedAutomation - 基于控件的触摸模拟
+- WidgetsBasedAutomation - 基于控件的操作
- Shell - Shell命令
- Storages - 本地存储
- Threads - 多线程
diff --git a/app/src/main/assets/docs/widgets-based-automation.html b/app/src/main/assets/docs/widgets-based-automation.html
index 59685619..ee290346 100644
--- a/app/src/main/assets/docs/widgets-based-automation.html
+++ b/app/src/main/assets/docs/widgets-based-automation.html
@@ -2,7 +2,7 @@
- SimpleActionAutomator | Auto.js 3.0.0 文档
+ 基于控件的操作 | Auto.js 3.0.0 文档
@@ -19,7 +19,7 @@
@@ -28,7 +28,7 @@
- Q&A - 常见问题
- App - 应用
- Console - 控制台
-- CoordinatesBasedAutomation - 基于坐标的触摸模拟
+- CoordinatesBasedAutomation - 基于坐标的操作
- Device - 设备
- Dialogs - 对话框
- Engines - 脚本引擎
@@ -40,7 +40,7 @@
- Images - 图片与图色处理
- Keys - 按键模拟
- Modules - 模块
-- WidgetsBasedAutomation - 基于控件的触摸模拟
+- WidgetsBasedAutomation - 基于控件的操作
- Shell - Shell命令
- Storages - 本地存储
- Threads - 多线程
@@ -72,6 +72,10 @@
目录
+- 基于控件的操作
+- auto([mode])
+
+
- SimpleActionAutomator
- click(text[, i])
- click(left, top, bottom, right)
@@ -83,68 +87,85 @@
- UiSelector
-- id(resId)
-- idContains(str)
-- idStartsWith(prefix)
-- idEndsWith(suffix)
-- idMatches(String)
-- text(str)
-- textContains(str)
-- textStartsWith(prefix)
-- textEndsWith(suffix)
-- textMatches(str)
-- desc(str)
-- descContains(str)
-- descStartsWith(prefix)
-- descEndsWith(suffix)
-- descMatches(str)
-- className(str)
-- classNameContains(str)
-- classNameStartsWith(prefix)
-- classNameEndsWith(suffix)
-- classNameMatches(str)
-- packageName(str)
-- packageNameContains(str)
-- packageNameStartsWith(prefix)
-- packageNameEndsWith(suffix)
-- packageNameMatches(str)
-- bounds(l, t, r, b)
-- boundsInside(l, t, r, b)
-- boundsContains(l, t, r, b)
-- drawingOrder(order)
-- checkable([b = true])
-- selected([b = true])
-- clickable([b = true])
-- longClickable([b = true])
-- enabled([b = true])
-- scrollable([b = true])
-- editable([b = true])
-- contentInvalid([b = true])
-- contextClickable([b = true])
-- multiLine([b = true])
-- findOne()
-- find()
-- untilFind()
-- exists()
-- waitFor()
-- click()
-- longClick()
-- copy()
-- paste()
-- select()
-- cut()
-- collapse()
-- expand()
-- show()
-- scrollForward()
-- scrollBackward()
-- scrollUp()
-- scrollDown()
-- scrollLeft()
-- scrollRight()
-- contextClick()
-- setSelection(start, end)
-- setText(text)
+- selector()
+- UiSelector.text(str)
+- UiSelector.textContains(str)
+- UiSelector.textStartsWith(prefix)
+- UiSelector.textEndsWith(suffix)
+- UiSelector.textMatches(reg)
+- UiSelector.desc(str)
+- UiSelector.descContains(str)
+- UiSelector.descStartsWith(prefix)
+- UiSelector.descEndsWith(suffix)
+- UiSelector.descMatches(reg)
+- UiSelector.id(resId)
+- UiSelector.idContains(str)
+- UiSelector.idStartsWith(prefix)
+- UiSelector.idEndsWith(suffix)
+- UiSelector.idMatches(reg)
+- UiSelector.className(str)
+- UiSelector.classNameContains(str)
+- UiSelector.classNameStartsWith(prefix)
+- UiSelector.classNameEndsWith(suffix)
+- UiSelector.classNameMatches(reg)
+- UiSelector.packageName(str)
+- UiSelector.packageNameContains(str)
+- UiSelector.packageNameStartsWith(prefix)
+- UiSelector.packageNameEndsWith(suffix)
+- UiSelector.packageNameMatches(reg)
+- UiSelector.bounds(left, top, right, buttom)
+- UiSelector.boundsInside(left, top, right, buttom)
+- UiSelector.boundsContains(left, top, right, buttom)
+- UiSelector.drawingOrder(order)
+- UiSelector.clickable([b = true])
+- UiSelector.longClickable([b = true])
+- UiSelector.checkable([b = true])
+- UiSelector.selected([b = true])
+- UiSelector.enabled([b = true])
+- UiSelector.scrollable([b = true])
+- UiSelector.editable([b = true])
+- UiSelector.multiLine([b = true])
+- UiSelector.findOne()
+- UiSelector.findOne(timeout)
+- UiSelector.findOnce()
+- UiSelector.findOnce(i)
+- UiSelector.find()
+- UiSelector.untilFind()
+- UiSelector.exists()
+- UiSelector.waitFor()
+- UiSelector.filter(f)
+
+
+- UiObject
+- UiObject.click()
+- UiObject.longClick()
+- UiObject.setText(text)
+- UiObject.copy()
+- UiObject.cut()
+- UiObject.paste()
+- UiObject.setSelection(start, end)
+- UiObject.scrollForward()
+- UiObject.scrollBackward()
+- UiObject.select()
+- UiObject.collapse()
+- UiObject.expand()
+- UiObject.show()
+- UiObject.scrollUp()
+- UiObject.scrollDown()
+- UiObject.scrollLeft()
+- UiObject.scrollRight()
+- children()
+- childCount()
+- child(i)
+- parent()
+- bounds()
+- boundsInParent()
+- drawingOrder()
+- id()
+- text()
+- findByText(str)
+- findOne(selector)
+- find(selector)
- UiCollection
@@ -153,43 +174,8 @@
- UiCollection.each(func)
- empty()
- nonEmpty()
-- UiCollection.filter(filter)
- UiCollection.find(selector)
- UiCollection.findOne(selector)
-- UiCollection.click()
-- UiCollection.longClick()
-- UiCollection.copy()
-- UiCollection.paste()
-- UiCollection.select()
-- UiCollection.cut()
-- UiCollection.collapse()
-- UiCollection.expand()
-- UiCollection.show()
-- UiCollection.scrollForward()
-- UiCollection.scrollBackward()
-- UiCollection.scrollUp()
-- UiCollection.scrollDown()
-- UiCollection.scrollLeft()
-- UiCollection.scrollRight()
-- UiCollection.contextClick()
-- UiCollection.setSelection(start, end)
-- UiCollection.setText(text)
-
-
-- UiObject
- Rect
@@ -205,12 +191,31 @@
- Rect.intersect(r)
+- UiSelector进阶
- SimpleActionAutomator#
+ 基于控件的操作#
+基于控件的操作指的是选择屏幕上的控件,获取其信息或对其进行操作。对于一般软件而言,基于控件的操作对不同机型有很好的兼容性;但是对于游戏而言,由于游戏界面并不是由控件构成,无法采用本章节的方法,也无法使用本章节的函数。有关游戏脚本的编写,请参考《基于坐标的操作》。
+基于控件的操作依赖于无障碍服务,因此最好在脚本开头使用auto()函数来确保无障碍服务已经启用。如果运行到某个需要权限的语句无障碍服务并没启动,则会抛出异常并跳转到无障碍服务界面。这样的用户体验并不好,因为需要重新运行脚本,后续会加入等待无障碍服务启动并让脚本继续运行的函数。
+您也可以在脚本开头使用"auto";表示这个脚本需要无障碍服务,但是不推荐这种做法,因为这个标记必须在脚本的最开头(前面不能有注释或其他语句、空格等),我们推荐使用auto()函数来确保无障碍服务已启用。
+auto([mode])#
+
+mode <string> 模式
+
+检查无障碍服务是否已经启用,如果没有启用则抛出异常并跳转到无障碍服务启用界面;同时设置无障碍模式为mode。mode的可选值为:
+
+fast 快速模式。该模式下会启用控件缓存,从而选择器获取屏幕控件更快。对于需要快速的控件操作的脚本可以使用该模式,一般脚本则没有必要使用该函数。
+normal 正常模式,默认。
+
+如果不加mode参数,则为正常模式。
+示例:
+auto("fast");
+
示例2:
+auto();
+
SimpleActionAutomator#
Stability: 2 - StableSimpleActionAutomator提供了一些模拟简单操作的函数,例如点击文字、模拟按键等。这些函数可以直接作为全局函数使用。
click(text[, i])#
@@ -274,455 +279,715 @@
返回是否输入成功。当找不到对应的文本框时返回false。
不加参数i则会把所有输入框的文本追加内容text。例如input("测试")。
UiSelector#
-选择器(UiSelector)是稍微复杂的自动操作脚本所必须。使用选择器的一般步骤是:
-
-- 用各种筛选条件找出想要的控件,如某个文本控件、列表控件、图片控件
-- 对找出的控件执行想要的操作,如点击、滑动、设置文字、长按
-
-问题的关键在于如何找出想要的控件。对于文本控件一般通过他的文字来定位他,图片控件则通过id或者图片描述(desc)。选择器所做的就是提供这些筛选条件并给出筛选结果。
-选择器提供了更强大的定位界面控件与对其进行操作的功能,可以用他们完成更多的自动操作和提取界面信息。
选择器通过附加筛选条件,筛选出符合条件的控件或控件集合,之后可以对这些控件这些操作。
可供选择的筛选条件包括:
+UiSelector即选择器,用于通过各种条件选取屏幕上的控件,再对这些控件进行点击、长按等动作。这里需要先简单介绍一下控件和界面的相关知识。
+一般软件的界面是由一个个控件构成的,例如图片部分是一个图片控件(ImageView),文字部分是一个文字控件(TextView);同时,通过各种布局来决定各个控件的位置,例如,线性布局(LinearLayout)里面的控件都是按水平或垂直一次叠放的,列表布局(AbsListView)则是以列表的形式显示控件。
+控件有各种属性,包括文本(text), 描述(desc), 类名(className), id等等。我们通常用一个控件的属性来找到这个控件,例如,想要点击QQ聊天窗口的"发送"按钮,我们就可以通过他的文本属性为"发送"来找到这个控件并点击他,具体代码为:
+var sendButton = text("发送").findOne();
+sendButton.click();
+
在这个例子中, text("发送")表示一个条件(文本属性为"发送"),findOne()表示基于这个条件找到一个符合条件的控件,从而我们可以得到发送按钮sendButton,再执行sendButton.click()即可点击"发送"按钮。
+用文本属性来定位按钮控件、文本控件通常十分有效。但是,如果一个控件是图片控件,比如Auto.js主界面右上角的搜索图标,他没有文本属性,这时需要其他属性来定位他。我们如何查看他有什么属性呢?首先打开悬浮窗和无障碍服务,点击蓝色的图标(布局分析), 可以看到以下界面:
+之后我们点击搜索图标,可以看到他有以下属性:
+我们注意到这个图标的desc(描述)属性为"搜索",那么我们就可以通过desc属性来定位这个控件,得到点击搜索图标的代码为:
+desc("搜索").findOne().click();
+
可能心细的你可能注意到了,这个控件还有很多其他的属性,例如checked, className, clickable等等,为什么不用这些属性来定位搜索图标呢?答案是,其他控件也有这些值相同的属性、尝试一下你就可以发现很多其他控件的checked属性和搜索控件一样都是false,如果我们用checked(false)作为条件,将会找到很多控件,而无法确定哪一个是搜索图标。因此,要找到我们想要的那个控件,选择器的条件通常需要是可唯一确定控件的。我们通常用一个独一无二的属性来定位一个控件,例如这个例子中就没有其他控件的desc(描述)属性为"搜索"。
+另外,对于这个搜索图标而言,id属性也是唯一的,我们也可以用id("action_search").findOne().click()来点击这个控件。如果一个控件有id属性,那么这个属性很可能是唯一的,除了以下几种情况:
-- id
-- text 文本
-- desc 描述(Content-Description)
-- className 类名
-- packageName 包名
-- bounds 在屏幕上的范围
-- drawingOrder 绘制顺序
-- 各种属性,主要包括:
-- clickable 可点击
-- longClickable 可长按
-- checkable 可勾选
-- checked 被勾选
-- scrollable 可滑动
-- selected 被选择
-- editable 可编辑
-- visibleToUser 可见
-- enabled 已启用
+- QQ的控件的id属性很多都是"name",也就是在QQ界面难以通过id来定位一个控件
+- 列表中的控件,比如QQ联系人列表,微信联系人列表等
-
+尽管id属性很方便,但也不总是最方便的,例如对于微信和网易云音乐,每次更新他的控件id都会变化,导致了相同代码对于不同版本的微信、网易云音乐并不兼容。
+除了这些属性外,主要还有以下几种属性:
+
+className 类名。类名表示一个控件的类型,例如文本控件为"android.widget.TextView", 图片控件为"android.widget.ImageView"等。
+packageName 包名。包名表示控件所在的应用包名,例如QQ界面的控件的包名为"com.tencent.mobileqq"。
+bounds 控件在屏幕上的范围。
+drawingOrder 控件在父控件的绘制顺序。
+indexInParent 控件在父控件的位置。
+clickable 控件是否可点击。
+longClickable 控件是否可长按。
+checkable 控件是否可勾选。
+checked 控件是否可已勾选。
+scrollable 控件是否可滑动。
+selected 控件是否已选择。
+editable 控件是否可编辑。
+visibleToUser 控件是否可见。
+enabled 控件是否已启用。
+depth 控件的布局深度。
-要对选择器所确定的筛选条件,对屏幕上的控件进行筛选,调用方法find(), findOne(), untilFind()。其中find(), untilFind()返回控件的集合,findOne()返回一个控件。untilFind和findOne函数会一直寻找直到屏幕上出现满足条件的控件为止。
一个完整的选择器示例如下:
-
var emoj = id("name").packageName("com.tencent.mobileqq").clickable()
- .className("ImageView").drawingOrder(5).findOne();
-emoj.click();
-
上述代码是找到QQ聊天界面下面的表情按钮(第5个按钮)并点击。也可以简化为:
-id("name").packageName("com.tencent.mobileqq").clickable()
- .className("ImageView").click();
-
这段代码意思是,找出id为"name", 包名为"com.tentcent.mobileqq",类名为ImageView的所有可点击控件,对他们执行点击动作。
-最后的click()函数相当于untilFind().click()。也就是如果只需要在找到控件以后立即进行操作,只需要调用相应的操作函数,而不需要先调用find等函数等到控件再操作。
要获取屏幕上的控件的信息(例如id, text, desc, bounds等),可以开启悬浮窗,使用界面层次查看和界面范围查看。
-选择器部分内容如果有安卓开发经验会更容易掌握。
-id(resId)#
+有时候只靠一个属性并不能唯一确定一个控件,这时需要通过属性的组合来完成定位,例如className("ImageView").depth(10).findOne().click(),通过链式调用来组合条件。
+通常用这些技巧便可以解决大部分问题,即使解决不了问题,也可以通过布局分析的"生成代码"功能来尝试生成一些选择器代码。接下来的问题便是对选取的控件进行操作,包括:
+
+click() 点击。点击一个控件,前提是这个控件的clickable属性为true
+longClick() 长按。长按一个控件,前提是这个控件的longClickable属性为true
+setText() 设置文本,用于编辑框控件设置文本。
+scrollForward(), scrollBackward() 滑动。滑动一个控件(列表等), 前提是这个控件的scrollable属性为true
+exits() 判断控件是否存在
+waitFor() 等待控件出现
+
+这些操作包含了绝大部分控件操作。根据这些我们可以很容易写出一个"刷屏"脚本(代码仅为示例,请不要在别人的群里测试,否则容易被踢):
+while(true){
+ className("EditText").findOne().setText("刷屏...");
+ text("发送").findOne().clicK();
+}
+
上面这段代码也可以写成:
+while(true){
+ className("EditText").setText("刷屏...");
+ text("发送").clicK();
+}
+
如果不加findOne()而直接进行操作,则选择器会找出所有符合条件的控件并操作。
+另外一个比较常用的操作的滑动。滑动操作的第一步是找到需要滑动的控件,例如要滑动QQ消息列表则在悬浮窗布局层次分析中找到AbsListView,这个控件就是消息列表控件,如下图:
+长按可查看控件信息,注意到其scrollable属性为true,并找出其id为"recent_chat_list",从而下滑QQ消息列表的代码为:
+id("recent_chat_list").className("AbsListView").findOne().scrollForward();
+
scrollForward()为向前滑,包括下滑和右滑。
+选择器的入门教程暂且要这里,更多信息可以查看下面的文档和选择器进阶。
+selector()#
-- resId <string> 控件的id,以"包名:id/"开头,例如"com.tencent.mm:id/send_btn"。也可以不指定包名,这时会以当前正在运行的应用的包名来补全id。例如id("send_btn"),在QQ界面想当于id("com.tencent.mobileqq:id/send_btn")。
+- 返回 <UiSelector>
-附加id严格匹配筛选条件。
-控件的id属性通常是可以用来确定控件的唯一标识,如果一个控件有id,那么使用id来找到他是最好的方法。要查看屏幕上的控件的id,可以开启悬浮窗并使用界面工具,点击相应控件即可查看。若查看到的控件id为null, 表示该控件没有id。另外,在列表中会出现多个控件的id相同的情况。例如微信的联系人列表,每个头像的id都是一样的。此时不能用id来唯一确定控件。
-在QQ界面经常会出现多个id为"name"的控件,在微信上则每个版本的id都会变化。对于这些软件而言比较难用id定位控件。
-idContains(str)#
+创建一个新的选择器。但一般情况不需要使用该函数,因为可以直接用相应条件的语句创建选择器。
+由于历史遗留原因,本不应该这样设计(不应该让id(), text()等作为全局函数,而是应该用By.id(), By.text()),但为了后向兼容性只能保留这个设计。
+这样的API设计会污染全局变量,后续可能会支持"去掉这些全局函数而使用By.*"的选项。
+UiSelector.text(str)#
附加控件id包含字符串str的筛选条件。
-idStartsWith(prefix)#
+为当前选择器附加控件"text等于字符串str"的筛选条件。
+控件的text(文本)属性是文本控件上的显示的文字,例如微信左上角的"微信"文本。
+UiSelector.textContains(str)#
附加id需要以prefix开头的筛选条件。
-idEndsWith(suffix)#
+为当前选择器附加控件"text需要包含字符串str"的筛选条件。
+这是一个比较有用的条件,例如QQ动态页和微博发现页上方的"大家都在搜...."的控件可以用textContains("大家都在搜").findOne()来获取。
+UiSelector.textStartsWith(prefix)#
附加id需要以suffix结束的筛选条件。
-idMatches(String)#
-
-- String <string> id要满足的正则表达式
-
-附加id需要满足正则表达式。有关正则表达式,可以查看菜鸟教程。
-这里的正则表达式是Java的正则表达式,不能直接使用JavaScript的正则表达式。
-
idMatches("[a-zA-Z]+")
-
text(str)#
-
-- str <string> 控件文本
-
-附加控件文本等于字符串str的筛选条件。
-控件的text(文本)属性是控件上的显示的文字,例如微信左上角的"微信"文本。对于图片或者其他控件通常text属性为null。
-textContains(str)#
-
-- str <string> 要包含的字符串
-
-附加控件文本需要以prefix开头的筛选条件。
-textStartsWith(prefix)#
-
-- prefix <string> 前缀
-
-附加控件文本需要以prefix开头的筛选条件。
-textEndsWith(suffix)#
+为当前选择器附加控件"text需要以prefix开头"的筛选条件。
+这也是一个比较有用的条件,例如要找出Auto.js脚本列表中名称以"QQ"开头的脚本的代码为textStartsWith("QQ").find()。
+UiSelector.textEndsWith(suffix)#
- suffix <string> 后缀
-附加控件文本需要以suffix结束的筛选条件。
-textMatches(str)#
+为当前选择器附加控件"text需要以suffix结束"的筛选条件。
+UiSelector.textMatches(reg)#
附加控件文本需要满足正则表达式的条件。
-desc(str)#
+为当前选择器附加控件"text需要满足正则表达式reg"的条件。
+有关正则表达式,可以查看正则表达式 - 菜鸟教程。
+需要注意的是,如果正则表达式是字符串,则需要使用\\来表达\(也即Java正则表达式的形式),例如textMatches("\\d+")匹配多位数字;但如果使用JavaScript语法的正则表达式则不需要,例如textMatches(/\d+/)。但如果使用字符串的正则表达式则该字符串不能以"/"同时以"/"结束,也即不能写诸如textMatches("/\\d+/")的表达式,否则会被开头的"/"和结尾的"/"会被忽略。
+UiSelector.desc(str)#
附加控件描述等于字符串str的筛选条件。
+为当前选择器附加控件"desc等于字符串str"的筛选条件。
控件的desc(描述,全称为Content-Description)属性是对一个控件的描述,例如网易云音乐右上角的放大镜图标的描述为搜索。要查看一个控件的描述,同样地可以借助悬浮窗查看。
desc属性同样是定位控件的利器。
-descContains(str)#
+UiSelector.descContains(str)#
附加控件描述需要以prefix开头的筛选条件。
-descStartsWith(prefix)#
+为当前选择器附加控件"desc需要包含字符串str"的筛选条件。
+UiSelector.descStartsWith(prefix)#
附加控件描述需要以prefix开头的筛选条件。
-descEndsWith(suffix)#
+为当前选择器附加控件"desc需要以prefix开头"的筛选条件。
+UiSelector.descEndsWith(suffix)#
附加控件描述需要以suffix结束的筛选条件。
-descMatches(str)#
+为当前选择器附加控件"desc需要以suffix结束"的筛选条件。
+UiSelector.descMatches(reg)#
附加控件描述需要满足正则表达式的条件。
-className(str)#
+为当前选择器附加控件"desc需要满足正则表达式reg"的条件。
+有关正则表达式,可以查看正则表达式 - 菜鸟教程。
+需要注意的是,如果正则表达式是字符串,则需要使用\\来表达\(也即Java正则表达式的形式),例如textMatches("\\d+")匹配多位数字;但如果使用JavaScript语法的正则表达式则不需要,例如textMatches(/\d+/)。但如果使用字符串的正则表达式则该字符串不能以"/"同时以"/"结束,也即不能写诸如textMatches("/\\d+/")的表达式,否则会被开头的"/"和结尾的"/"会被忽略。
+UiSelector.id(resId)#
-附加控件类名等于字符串str的筛选条件。
-控件的className属性是一个控件的具体类型,例如图片控件通常为ImageView,文本控件通常为TextView, 输入框通常为EditText。(若一个控件是在android.widget包里的,那么android.widget可以省略。但除此之外的其他控件必须是类的全名,例如"com.stardust.theme.ThemeColorImageView")。
-classNameContains(str)#
+为当前选择器附加"id等于resId"的筛选条件。
+控件的id属性通常是可以用来确定控件的唯一标识,如果一个控件有id,那么使用id来找到他是最好的方法。要查看屏幕上的控件的id,可以开启悬浮窗并使用界面工具,点击相应控件即可查看。若查看到的控件id为null, 表示该控件没有id。另外,在列表中会出现多个控件的id相同的情况。例如微信的联系人列表,每个头像的id都是一样的。此时不能用id来唯一确定控件。
+在QQ界面经常会出现多个id为"name"的控件,在微信上则每个版本的id都会变化。对于这些软件而言比较难用id定位控件。
+UiSelector.idContains(str)#
附加控件类名需要以prefix开头的筛选条件。
-classNameStartsWith(prefix)#
+为当前选择器附加控件"id包含字符串str"的筛选条件。比较少用。
+UiSelector.idStartsWith(prefix)#
附加控件类名需要以prefix开头的筛选条件。
-classNameEndsWith(suffix)#
+为当前选择器附加"id需要以prefix开头"的筛选条件。比较少用。
+UiSelector.idEndsWith(suffix)#
附加控件类名需要以suffix结束的筛选条件。
-classNameMatches(str)#
+为当前选择器附加"id需要以suffix结束"的筛选条件。比较少用。
+UiSelector.idMatches(reg)#
附加控件类名需要满足正则表达式的条件。
-packageName(str)#
+附加id需要满足正则表达式。
+需要注意的是,如果正则表达式是字符串,则需要使用\\来表达\(也即Java正则表达式的形式),例如textMatches("\\d+")匹配多位数字;但如果使用JavaScript语法的正则表达式则不需要,例如textMatches(/\d+/)。但如果使用字符串的正则表达式则该字符串不能以"/"同时以"/"结束,也即不能写诸如textMatches("/\\d+/")的表达式,否则会被开头的"/"和结尾的"/"会被忽略。
+idMatches("[a-zA-Z]+")
+
UiSelector.className(str)#
附加包名等于字符串str的筛选条件。
-packageName属性也即控件所属的应用的包名(参见《shell命令:应用包名》),通常用来保证当前运行的应用是想要的应用。
-packageNameContains(str)#
+为当前选择器附加控件"className等于字符串str"的筛选条件。
+控件的className(类名)表示一个控件的类别,例如文本控件的类名为android.widget.TextView。
+如果一个控件的类名以"android.widget."开头,则可以省略这部分,例如文本控件可以直接用className("TextView")的选择器。
+常见控件的类名如下:
+
+android.widget.TextView 文本控件
+android.widget.ImageView 图片控件
+android.widget.Button 按钮控件
+android.widget.EditText 输入框控件
+android.widget.AbsListView 列表控件
+android.widget.LinearLayout 线性布局
+android.widget.FrameLayout 帧布局
+android.widget.RelativeLayout 相对布局
+android.widget.RelativeLayout 相对布局
+android.support.v7.widget.RecyclerView 通常也是列表控件
+
+UiSelector.classNameContains(str)#
附加包名需要以prefix开头的筛选条件。
-packageNameStartsWith(prefix)#
+为当前选择器附加控件"className需要包含字符串str"的筛选条件。
+UiSelector.classNameStartsWith(prefix)#
附加包名需要以prefix开头的筛选条件。
-packageNameEndsWith(suffix)#
+为当前选择器附加控件"className需要以prefix开头"的筛选条件。
+UiSelector.classNameEndsWith(suffix)#
附加包名需要以suffix结束的筛选条件。
-packageNameMatches(str)#
+为当前选择器附加控件"className需要以suffix结束"的筛选条件。
+UiSelector.classNameMatches(reg)#
附加包名需要满足正则表达式的条件。
-bounds(l, t, r, b)#
+为当前选择器附加控件"className需要满足正则表达式reg"的条件。
+有关正则表达式,可以查看正则表达式 - 菜鸟教程。
+需要注意的是,如果正则表达式是字符串,则需要使用\\来表达\(也即Java正则表达式的形式),例如textMatches("\\d+")匹配多位数字;但如果使用JavaScript语法的正则表达式则不需要,例如textMatches(/\d+/)。但如果使用字符串的正则表达式则该字符串不能以"/"同时以"/"结束,也即不能写诸如textMatches("/\\d+/")的表达式,否则会被开头的"/"和结尾的"/"会被忽略。
+UiSelector.packageName(str)#
-- l, t, r, b 用来定位控件在屏幕上的范围的四个整数
+str <string> 控件文本
+- 返回 <UiSelector> 返回选择器自身以便链式调用
-boundsInside(l, t, r, b)#
-boundsContains(l, t, r, b)#
-drawingOrder(order)#
+为当前选择器附加控件"packageName等于字符串str"的筛选条件。
+控件的packageName表示控件所属界面的应用包名。例如微信的包名为"com.tencent.mm", 那么微信界面的控件的packageName为"com.tencent.mm"。
+要查看一个应用的包名,可以用函数app.getPackageName()获取,例如toast(app.getPackageName("微信"))。
+UiSelector.packageNameContains(str)#
checkable([b = true])#
+为当前选择器附加控件"packageName需要包含字符串str"的筛选条件。
+UiSelector.packageNameStartsWith(prefix)#
附加控件是否可勾选的条件。可勾选指的是,例如QQ和微信发送图片时图片的勾选。
-selected([b = true])#
+为当前选择器附加控件"packageName需要以prefix开头"的筛选条件。
+UiSelector.packageNameEndsWith(suffix)#
附加控件是否被选中的条件。被选中指的是,例如QQ聊天界面点击下方的表情按钮时,会出现自己收藏的表情,这时表情按钮便处于选中状态。
-clickable([b = true])#
+为当前选择器附加控件"packageName需要以suffix结束"的筛选条件。
+UiSelector.packageNameMatches(reg)#
附加控件是否可点击的条件。但并非所有clickable为false的控件都真的不能点击,这取决于控件的实现。因而要确定一个控件的clickable属性,可以开启悬浮窗工具。
-longClickable([b = true])#
+为当前选择器附加控件"packageName需要满足正则表达式reg"的条件。
+有关正则表达式,可以查看正则表达式 - 菜鸟教程。
+UiSelector.bounds(left, top, right, buttom)#
-附加控件是否可长按的条件。
-enabled([b = true])#
+一个控件的bounds属性为这个控件在屏幕上显示的范围。我们可以用这个范围来定位这个控件。尽管用这个方法定位控件对于静态页面十分准确,却无法兼容不同分辨率的设备;同时对于列表页面等动态页面无法达到效果,因此使用不推荐该选择器。
+注意参数的这四个数字不能随意填写,必须精确的填写控件的四个边界才能找到该控件。例如,要点击QQ主界面的右上角加号,我们用布局分析查看该控件的属性,如下图:
+可以看到bounds属性为(951, 67, 1080, 196),此时使用代码bounds(951, 67, 1080, 196).clickable().click()即可点击该控件。
+UiSelector.boundsInside(left, top, right, buttom)#
-附加控件是否已启用的条件。大多数控件都是启用的状态,处于“禁用”状态通常是灰色并且不可点击。
-scrollable([b = true])#
+为当前选择器附加控件"bounds需要在left, top, right, buttom构成的范围里面"的条件。
+这个条件用于限制选择器在某一个区域选择控件。例如要在屏幕上半部分寻找文本控件TextView,代码为:
+var w = className("TextView").boundsInside(0, 0, device.width, device.height / 2).findOne();
+log(w.text());
+
其中我们使用了device.width来获取屏幕宽度,device.height来获取屏幕高度。
+UiSelector.boundsContains(left, top, right, buttom)#
-附加控件是否可滑动的条件。
-editable([b = true])#
+为当前选择器附加控件"bounds需要包含left, top, right, buttom构成的范围"的条件。
+这个条件用于限制控件的范围必须包含所给定的范围。例如给定一个点(500, 300), 寻找在这个点上的可点击控件的代码为:
+var w = boundsContains(500, 300, device.width - 500, device.height - 300).clickable().findOne();
+w.click();
+
UiSelector.drawingOrder(order)#
附加控件是否可编辑的条件。一般来说可编辑的控件为输入框(EditText)。
-contentInvalid([b = true])#
+为当前选择器附加控件"drawingOrder等于order"的条件。
+drawingOrder为一个控件在父控件中的绘制顺序,通常可以用于区分同一层次的控件。
+但该属性在Android 7.0以上才能使用。
+UiSelector.clickable([b = true])#
我也不知道是什么,下次再补充吧。
-contextClickable([b = true])#
+为当前选择器附加控件是否可点击的条件。但并非所有clickable为false的控件都真的不能点击,这取决于控件的实现。对于自定义控件(例如显示类名为android.view.View的控件)很多的clickable属性都为false都却能点击。
+需要注意的是,可以省略参数b而表示选择那些可以点击的控件,例如className("ImageView").clickable()表示可以点击的图片控件的条件,className("ImageView").clickable(false)表示不可点击的图片控件的条件。
+UiSelector.longClickable([b = true])#
我也不知道是什么,下次再补充吧。
-multiLine([b = true])#
+为当前选择器附加控件是否可长按的条件。
+UiSelector.checkable([b = true])#
附加控件是否文本或输入框控件是否是多行显示的条件。
-findOne()#
-根据当前的选择器所确定的筛选条件,对屏幕上的控件进行搜索,直到屏幕上出现满足条件的一个控件为止,并返回该控件。如果找不到控件,当屏幕内容发生变化时会重新寻找,直至找到。参见控件。
-find()#
-根据当前的选择器所确定的筛选条件,对屏幕上的控件进行搜索,找到所有满足条件的控件集合并返回。这个搜索只进行一次,并不保证一直会找到,因而会出现返回的控件集合为空的情况。参见控件集合。
-可以通过empty()或nonEmpty()函数判断找到的是否为空。例如:
+为当前选择器附加控件是否可勾选的条件。勾选通常是对于勾选框而言的,例如图片多选时左上角通常有一个勾选框。
+UiSelector.selected([b = true])#
+
+b <Boolean> 表示控件是否被选
+
+为当前选择器附加控件是否已选中的条件。被选中指的是,例如QQ聊天界面点击下方的"表情按钮"时,会出现自己收藏的表情,这时"表情按钮"便处于选中状态,其selected属性为true。
+UiSelector.enabled([b = true])#
+
+b <Boolean> 表示控件是否已启用
+
+为当前选择器附加控件是否已启用的条件。大多数控件都是启用的状态(enabled为true),处于“禁用”状态通常是灰色并且不可点击。
+UiSelector.scrollable([b = true])#
+
+b <Boolean> 表示控件是否可滑动
+
+为当前选择器附加控件是否可滑动的条件。滑动包括上下滑动和左右滑动。
+可以用这个条件来寻找可滑动控件来滑动界面。例如滑动Auto.js的脚本列表的代码为:
+className("android.support.v7.widget.RecyclerView").scrollable().findOne().scrollForward();
+//或者classNameEndsWith("RecyclerView").scrollable().findOne().scrollForward();
+
UiSelector.editable([b = true])#
+
+b <Boolean> 表示控件是否可编辑
+
+为当前选择器附加控件是否可编辑的条件。一般来说可编辑的控件为输入框(EditText),但不是所有的输入框(EditText)都可编辑。
+UiSelector.multiLine([b = true])#
+
+- b <Boolean> 表示文本或输入框控件是否是多行显示的
+
+为当前选择器附加控件是否文本或输入框控件是否是多行显示的条件。
+UiSelector.findOne()#
+
+- 返回 UiObject
+
+根据当前的选择器所确定的筛选条件,对屏幕上的控件进行搜索,直到屏幕上出现满足条件的一个控件为止,并返回该控件。如果找不到控件,当屏幕内容发生变化时会重新寻找,直至找到。
+需要注意的是,如果屏幕上一直没有出现所描述的控件,则该函数会阻塞,直至所描述的控件出现为止。因此此函数不会返回null。
+该函数本来应该命名为untilFindOne(),但由于历史遗留原因已经无法修改。如果想要只在屏幕上搜索一次而不是一直搜索,请使用findOnce()。
+另外,如果屏幕上有多个满足条件的控件,findOne()采用深度优先搜索(DFS),会返回该搜索算法找到的第一个控件。注意控件找到的顺序有时会起到作用。
+UiSelector.findOne(timeout)#
+根据当前的选择器所确定的筛选条件,对屏幕上的控件进行搜索,直到屏幕上出现满足条件的一个控件为止,并返回该控件;如果在timeout毫秒的时间内没有找到符合条件的控件,则终止搜索并返回null。
+该函数类似于不加参数的findOne(),只不过加上了时间限制。
+示例:
+//启动Auto.js
+launchApp("Auto.js");
+//在6秒内找出日志图标的控件
+var w = id("action_log").findOne(6000);
+//如果找到控件则点击
+if(w != null){
+ w.click();
+}else{
+ //否则提示没有找到
+ toast("没有找到日志图标");
+}
+
UiSelector.findOnce()#
+
+- 返回 UiObject
+
+根据当前的选择器所确定的筛选条件,对屏幕上的控件进行搜索,如果找到符合条件的控件则返回该控件;否则返回null。
+UiSelector.findOnce(i)#
+
+i <number> 索引
+
+根据当前的选择器所确定的筛选条件,对屏幕上的控件进行搜索,并返回第 i + 1 个符合条件的控件;如果没有找到符合条件的控件,或者符合条件的控件个数 < i, 则返回null。
+注意这里的控件次序,是搜索算法深度优先搜索(DSF)决定的。
+UiSelector.find()#
+
+- 返回 UiCollection
+
+根据当前的选择器所确定的筛选条件,对屏幕上的控件进行搜索,找到所有满足条件的控件集合并返回。这个搜索只进行一次,并不保证一定会找到,因而会出现返回的控件集合为空的情况。
+不同于findOne()或者findOnce()只找到一个控件并返回一个控件,find()函数会找出所有满足条件的控件并返回一个控件集合。之后可以对控件集合进行操作。
+可以通过empty()函数判断找到的是否为空。例如:
var c = className("AbsListView").find();
if(c.empty()){
toast("找到啦");
}else{
toast("没找到╭(╯^╰)╮");
}
-
untilFind()#
-根据当前的选择器所确定的筛选条件,对屏幕上的控件进行搜索,直到找到至少一个满足条件的控件为止,并返回所有满足条件的控件集合。参见控件集合。
-exists()#
-判断屏幕上是否存在控件符合选择器所确定的条件。例如要判断某个文本出现就执行某个动作,可以用:
-if(text("嘿嘿嘿").exists()){
- //嘿嘿嘿
+
UiSelector.untilFind()#
+
+- 返回 UiCollection
+
+根据当前的选择器所确定的筛选条件,对屏幕上的控件进行搜索,直到找到至少一个满足条件的控件为止,并返回所有满足条件的控件集合。
+该函数与find()函数的区别在于,该函数永远不会返回空集合;但是,如果屏幕上一直没有出现满足条件的控件,则该函数会保持阻塞。
+UiSelector.exists()#
+
+- 返回 <Boolean>
+
+判断屏幕上是否存在控件符合选择器所确定的条件。例如要判断某个文本出现就执行某个动作,可以用:
+if(text("某个文本").exists()){
+ //要支持的动作
}
-
waitFor()#
-等待屏幕上出现符合条件的控件。
-text("嘿嘿嘿").waitFor();
-
click()#
-找到所有符合条件的控件并点击。相当于untilFind().click()。参见click)。
-longClick()#
-找到所有符合条件的控件并长按。相当于untilFind().longClick()。参见longClick)。
-copy()#
-找到所有符合条件的控件并复制其内容,只对文本框或输入框控件有文字选中时有效。相当于untilFind().copy()。参见copy)。
-paste()#
-找到所有符合条件的控件并粘贴,只对输入框控件有效。相当于untilFind().paste()。参见paste)。
-select()#
-找到所有符合条件的控件并选中。相当于untilFind().select()。参见select)。
-cut()#
-找到所有符合条件的控件并剪切其内容,只对文本框或输入框控件有文字选中时有效。相当于untilFind().cut()。参见cut)。
-collapse()#
-找到所有符合条件的控件并折叠。相当于untilFind().collapse()。参见collapse)。
-expand()#
-找到所有符合条件的控件并展开。相当于untilFind().expand()。参见expand)。
-show()#
-找到所有符合条件的控件并使其出现在屏幕上。相当于untilFind().show()。参见show)。
-scrollForward()#
-找到所有符合条件的控件并向前滑。相当于untilFind().scrollForward()。参见scrollForward)。
向前滑指的是,对于左右滑动的控件向右滑,上下滑动的控件向下滑。
-scrollBackward()#
-找到所有符合条件的控件并向后滑。相当于untilFind().scrollBackward()。参见scrollBackward)。
向后滑指的是,对于左右滑动的控件向左滑,上下滑动的控件向上滑。
-scrollUp()#
-找到所有符合条件的控件并向上滑。相当于untilFind().scrollUp()。参见scrollUp)。
-scrollDown()#
-找到所有符合条件的控件并向下滑。相当于untilFind().scrollDown()。参见scrollDown)。
-scrollLeft()#
-找到所有符合条件的控件并向左滑。相当于untilFind().scrollLeft()。参见scrollLeft)。
-scrollRight()#
-找到所有符合条件的控件并向右滑。相当于untilFind().scrollRight()。参见scrollRight)。
-contextClick()#
-文档缺失
-setSelection(start, end)#
+等待屏幕上出现符合条件的控件;在满足该条件的控件出现之前,该函数会一直保持阻塞。
+例如要等待包含"哈哈哈"的文本控件出现的代码为:
+textContains("哈哈哈").waitFor();
+f <Function> 过滤函数,参数为UiObject,返回值为boolean找到所有符合条件的控件并设置文字选中区域,只对文本控件和输入框有效。相当于untilFind().setSelection()。参见setSelection。
-UiCollection, 控件集合, 通过选择器的find(), untilFind()方法返回的对象。可以对其进行操作或者获取其信息。
-返回集合中的控件数。
-返回集合中第i+1个控件(UiObject)。
-遍历集合。例如:
-var c = clickable();
-c.each(function(o){
- log(o.text());
+为当前选择器附加自定义的过滤条件。
+例如,要找出屏幕上所有文本长度为10的文本控件的代码为:
+var uc = className("TextView").filter(function(w){
+ return w.text().length == 10;
});
-
empty()#
-返回控件集合是否为空。
-nonEmpty()#
-返回控件集合是否非空。
-UiCollection.filter(filter)#
+UiObject表示一个控件,可以通过这个对象获取到控件的属性,也可以对控件进行点击、长按等操作。
+获取一个UiObject通常通过选择器的findOne(), findOnce()等函数,也可以通过UiCollection来获取,或者通过UiObject.child(), UiObject.parent()等函数来获取一个控件的子控件或父控件。
过滤出控件集合中符合条件的子控件。例如要过滤出所有子控件数目为1的控件为:
-var newCollection = collection.filter(function(obj){
- return obj.childCount() == 1;
-});
-点击该控件,并返回是否点击成功。
+如果该函数返回false,可能是该控件不可点击(clickable为false),当前界面无法响应该点击等。
+根据selector所确定的条件在该控件集合的控件和子控件找到所有符合条件的控件并返回控件集合。
-注意这会递归地遍历控件集合里所有的控件以及他们的子控件。和filter函数不同。
-例如:
-var names = id("name");
-var clickableNames = names.find(clickable());
-长按该控件,并返回是否点击成功。
+如果该函数返回false,可能是该控件不可点击(longClickable为false),当前界面无法响应该点击等。
+根据selector所确定的条件在该控件集合中找到一个符合条件的控件并返回控件。若找不到则返回null。
-点击集合中所有控件,并返回是否全部点击成功。
-长按集合中所有控件,并返回是否全部操作成功。
-对集合中所有控件执行复制操作,并返回是否全部操作成功。
-对集合中所有控件执行粘贴操作,并返回是否全部操作成功。
-对集合中所有控件执行选中操作,并返回是否全部操作成功。
-对集合中所有控件执行剪切操作,并返回是否全部操作成功。
-对集合中所有控件执行折叠操作,并返回是否全部操作成功。
-对集合中所有控件执行展开操作,并返回是否全部操作成功。
-设置输入框控件的文本内容,并返回是否设置成功。
+该函数只对可编辑的输入框(editable为true)有效。
+对输入框文本的选中内容进行复制,并返回是否操作成功。
+该函数只能用于输入框控件,并且当前输入框控件有选中的文本。可以通过setSelection()函数来设置输入框选中的内容。
var et = className("EditText").findOne();
+//选中前两个字
+et.setSelection(0, 2);
+//对选中内容进行复制
+if(et.copy()){
+ toast("复制成功");
+}else{
+ toast("复制失败");
+}
+对输入框文本的选中内容进行剪切,并返回是否操作成功。
+该函数只能用于输入框控件,并且当前输入框控件有选中的文本。可以通过setSelection()函数来设置输入框选中的内容。
对输入框控件进行粘贴操作,把剪贴板内容粘贴到输入框中,并返回是否操作成功。
+//设置剪贴板内容为“你好”
+setClip("你好");
+var et = className("EditText").findOne();
+et.paste();
+对输入框控件设置选中的文字内容,并返回是否操作成功。
+索引是从0开始计算的;并且,选中内容不包含end位置的字符。例如,如果一个输入框内容为"123456789",要选中"4567"的文字的代码为et.setSelection(3, 7)。
该函数也可以用来设置光标位置,只要参数的end等于start,即可把输入框光标设置在start的位置。例如et.setSelection(1, 1)会把光标设置在第一个字符的后面。
对控件执行向前滑动的操作,并返回是否操作成功。
+向前滑动包括了向右和向下滑动。如果一个控件既可以向右滑动和向下滑动,那么执行scrollForward()的行为是未知的(这是因为Android文档没有指出这一点,同时也没有充分的测试可供参考)。
对控件执行向后滑动的操作,并返回是否操作成功。
+向后滑动包括了向右和向下滑动。如果一个控件既可以向右滑动和向下滑动,那么执行scrollForward()的行为是未知的(这是因为Android文档没有指出这一点,同时也没有充分的测试可供参考)。
对控件执行"选中"操作,并返回是否操作成功。"选中"和isSelected()的属性相关,但该操作十分少用。
对控件执行折叠操作,并返回是否操作成功。
+对控件执行操作,并返回是否操作成功。
+对集合中所有控件执行显示操作,并返回是否全部操作成功。
-对集合中所有控件执行向前滑的操作,并返回是否全部操作成功。
-对集合中所有控件执行向后滑的操作,并返回是否全部操作成功。
-对集合中所有控件执行向上滑的操作,并返回是否全部操作成功。
-对集合中所有控件执行向下滑的操作,并返回是否全部操作成功。
-对集合中所有控件执行向左滑的操作,并返回是否全部操作成功。
-对集合中所有控件执行向右滑的操作,并返回是否全部操作成功。
-对集合中所有控件设置文字选中区域,并返回是否全部操作成功。
-返回该控件的所有子控件组成的控件集合。可以用于遍历一个控件的子控件,例如:
+className("AbsListView").findOne().children()
+ .forEach(function(child){
+ log(child.className());
+ });
+控件, 选择器的findOne方法返回的对象。和UiCollection有相似的方法,不再赘述。除此之外还有以下方法。
+返回子控件数目。
返回第i+1个子控件(UiObject)。
-返回父控件(UiObject)。
-返回该控件的所有子控件组成的控件集合。
-返回子控件数目。
+返回第i+1个子控件。如果i>=控件数目或者小于0,则抛出异常。
+需要注意的是,由于布局捕捉的问题,该函数可能返回null,也就是可能获取不到某个子控件。
遍历子控件的示例:
+var list = className("AbsListView").findOne();
+for(var i = 0; i < list.childCount(); i++){
+ var child = list.child(i);
+ log(child.className());
+}
+返回该控件的父控件。如果该控件没有父控件,返回null。
返回控件在屏幕上的范围,其值是一个[Rect]对象。
-返回控件在父控件中的范围,其值是一个[Rect]对象。
+返回控件在屏幕上的范围,其值是一个Rect对象。
+示例:
+var b = text("Auto.js").findOne().bounds();
+toast("控件在屏幕上的范围为" + b);
+如果一个控件本身无法通过click()点击,那么我们可以利用bounds()函数获取其坐标,再利用坐标点击。例如:
var b = desc("打开侧拉菜单").findOne().bounds();
+click(b.centerX(), b.centerY());
+//如果使用root权限,则用 Tap(b.centerX(), b.centerY());
+返回控件在父控件中的范围,其值是一个Rect对象。
返回控件的绘制次序。
+返回控件在父控件中的绘制次序。该函数在安卓7.0及以上才有效,7.0以下版本调用会返回0。
返回控件的id,可能为null。
+获取控件的id,如果一个控件没有id,则返回null。
返回控件的文本,如果控件没有文本,返回""。
-根据文本text在子控件中递归地寻找并返回文本或描述(desc)包含这段文本text的控件,返回它们组成的集合。。
-获取控件的文本,如果控件没有文本,返回""。
str <string> 文本根据选择器selector在子控件中递归地寻找符合条件的控件,返回它们组成的集合。
-根据文本text在子控件中递归地寻找并返回文本或描述(desc)包含这段文本str的控件,返回它们组成的集合。
+该函数会在当前控件的子控件,孙控件,曾孙控件...中搜索text或desc包含str的控件,并返回它们组合的集合。
+selector UiSelector根据选择器selector在子控件中递归地寻找一个符合条件的控件。找不到则返回null。
+根据选择器selector在该控件的子控件、孙控件...中搜索符合该选择器条件的控件,并返回找到的第一个控件;如果没有找到符合条件的控件则返回null。
例如,对于酷安动态列表,我们可以遍历他的子控件(每个动态列表项),并在每个子控件中依次寻找点赞数量和图标,对于点赞数量小于10的点赞:
+//找出动态列表
+var list = id("recycler_view").findOne();
+//遍历动态
+list.children().forEach(function(child){
+ //找出点赞图标
+ var like = child.findOne(id("feed_action_view_like"));
+ //找出点赞数量
+ var likeCount = child.findOne(id("text_view"));
+ //如果这两个控件没有找到就不继续了
+ if(like == null || likeCount == null){
+ return;
+ }
+ //判断点赞数量是否小于10
+ if(parseInt(likeCount.text()) < 10){
+ //点赞
+ like.click();
+ }
+});
+selector UiSelector根据选择器selector在该控件的子控件、孙控件...中搜索符合该选择器条件的控件,并返回它们组合的集合。
+UiCollection, 控件集合, 通过选择器的find(), untilFind()方法返回的对象。
UiCollection"继承"于数组,实际上是一个UiObject的数组,因此可以使用数组的函数和属性,例如使用length属性获取UiCollection的大小,使用forEach函数来遍历UiCollection。
+例如,采用forEach遍历屏幕上所有的文本控件并打印出文本内容的代码为:
+console.show();
+className("TextView").find().forEach(function(tv){
+ if(tv.text() != ""){
+ log(tv.text());
+ }
+});
+也可以使用传统的数组遍历方式:
+console.show();
+var uc = className("TextView").find();
+for(var i = 0; i < uc.length; i++){
+ var tv = uc[i];
+ if(tv.text() != ""){
+ log(tv.text());
+ }
+}
+UiCollection的每一个元素都是UiObject,我们可以取出他的元素进行操作,例如取出第一个UiObject并点击的代码为ui[0].click()。如果想要对该集合的所有元素进行操作,可以直接在集合上调用相应的函数,例如uc.click(),该代码会对集合上所有UiObject执行点击操作并返回是否全部点击成功。
因此,UiCollection具有所有UiObject对控件操作的函数,包括click(), longClick(), scrollForward()等等,不再赘述。
返回集合中的控件数。
+历史遗留函数,相当于属性length。
+返回集合中第i+1个控件(UiObject)。
+历史遗留函数,建议直接使用数组下标的方式访问元素。
+func <Function> 遍历函数,参数为UiObject。遍历集合。
+历史遗留函数,相当于forEach。参考forEach。
返回控件集合是否为空。
+返回控件集合是否非空。
+selector UiSelector根据selector所确定的条件在该控件集合的控件、子控件、孙控件...中找到所有符合条件的控件并返回找到的控件集合。
+注意这会递归地遍历控件集合里所有的控件以及他们的子控件。和数组的filter函数不同。
例如:
+var names = id("name").find();
+//在集合
+var clickableNames = names.find(clickable());
+selector UiSelector根据选择器selector在该控件集合的控件的子控件、孙控件...中搜索符合该选择器条件的控件,并返回找到的第一个控件;如果没有找到符合条件的控件则返回null。
UiObject.bounds(), UiObject.boundsInParent()返回的对象。表示一个长方形。
+UiObject.bounds(), UiObject.boundsInParent()返回的对象。表示一个长方形(范围)。
长方形左边界的x坐标、
+长方形左边界的x坐标、
长方形左边界的x坐标、
+长方形右边界的x坐标、
长方形上边界的y坐标、
+长方形上边界的y坐标、
长方形下边界的y坐标、
+长方形下边界的y坐标、
长方形中点x坐标。
+长方形中点x坐标。
长方形中点y坐标。
+长方形中点y坐标。
长方形宽度。通常可以作为控件宽度。
+长方形宽度。通常可以作为控件宽度。
长方形高度。通常可以作为控件高度。
+长方形高度。通常可以作为控件高度。
返回是否包含另一个长方形r。
+返回是否包含另一个长方形r。包含指的是,长方形r在该长方形的里面(包含边界重叠的情况)。
返回是否和另一个长方形相交。
+未完待续。