From 8c50bfdcaf4600de30332108699d3934e9b1a836 Mon Sep 17 00:00:00 2001 From: hyb1996 <946994919@qq.com> Date: Sun, 13 Aug 2017 13:11:19 +0800 Subject: [PATCH] add: module RootAutomator docs: RootAutomator --- .../需要Root权限的触摸与多点触摸.md | 64 +++++++++++++++++++ .../src/main/assets/javascript_engine_init.js | 4 +- .../main/assets/modules/__RootAutomator__.js | 13 ++++ .../InputEventToRootAutomatorRecorder.java | 61 +++++------------- .../autojs/runtime/api/RootAutomator.java | 2 +- 5 files changed, 95 insertions(+), 49 deletions(-) create mode 100644 app/src/main/assets/help/documentation/需要Root权限的触摸与多点触摸.md create mode 100644 autojs/src/main/assets/modules/__RootAutomator__.js diff --git a/app/src/main/assets/help/documentation/需要Root权限的触摸与多点触摸.md b/app/src/main/assets/help/documentation/需要Root权限的触摸与多点触摸.md new file mode 100644 index 00000000..212e03de --- /dev/null +++ b/app/src/main/assets/help/documentation/需要Root权限的触摸与多点触摸.md @@ -0,0 +1,64 @@ +# RootAutomator + +RootAutomator是一个使用Root权限来模拟触摸的对象,用它可以完成触摸与多点触摸,并且这些动作的执行没有延迟。 + +构造RootAutomator需要一个context参数。 +``` +var ra = RootAutomator(context); +``` + +### RootAutomator.tap(x, y\[, id\]) +* x \ 横坐标 +* y \ 纵坐标 +* id \ 多点触摸id。默认值为1,可以通过setDefaultId指定。 + +点击位置(x, y)。其中id是一个整数值,用于区分多点触摸,不同的id表示不同的"手指",例如: +``` +var ra = RootAutomator(context); +//让"手指1"点击位置(100, 100) +ra.tap(100, 100, 1); +//让"手指2"点击位置(200, 200); +ra.tap(200, 200, 2); +ra.exit(); +``` +如果不需要多点触摸,则不需要id这个参数。 +多点触摸通常用于手势或游戏操作,例如模拟双指捏合、双指上滑等。 +### RootAutomator.swipe(x1, x2, y1, y2\[, duration, id\]) +* x1 \ 滑动起点横坐标 +* y1 \ 滑动起点纵坐标 +* x2 \ 滑动终点横坐标 +* y2 \ 滑动终点纵坐标 +* duration \ 滑动时长,单位毫秒,默认值为300 +* id \ 多点触摸id + +模拟一次从(x1, y1)到(x2, y2)的时间为duration毫秒的滑动。 + +### RootAutomator.press(x, y, duration[\, id\]) +* x \ 横坐标 +* y \ 纵坐标 +* duration \ 按下时长 +* id \ 多点触摸id + +模拟按下位置(x, y),时长为duration毫秒。 + +以上为简单模拟触摸操作的函数。如果要模拟一些复杂的手势,需要更底层的函数。 + +### RootAutomator.touchDown(x, y[\, id\]) +* x \ 横坐标 +* y \ 纵坐标 +* id \ 多点触摸id + +模拟手指按下位置(x, y)。 + +### RootAutomator.touchMove(x, y[\, id\]) +* x \ 横坐标 +* y \ 纵坐标 +* id \ 多点触摸id + +模拟移动手指到位置(x, y)。 + +### RootAutomator.touchUp([\id\]) +* id \ 多点触摸id + +模拟手指弹起。 + diff --git a/autojs/src/main/assets/javascript_engine_init.js b/autojs/src/main/assets/javascript_engine_init.js index d73d5b02..9fbab575 100644 --- a/autojs/src/main/assets/javascript_engine_init.js +++ b/autojs/src/main/assets/javascript_engine_init.js @@ -37,7 +37,8 @@ require("__general__")(__runtime__, this); (function(scope){ - var modules = ['app', 'automator', 'console', 'dialogs', 'io', 'selector', 'shell', 'web', 'ui', "images", "timers", "events", "engines"]; + var modules = ['app', 'automator', 'console', 'dialogs', 'io', 'selector', 'shell', 'web', 'ui', + "images", "timers", "events", "engines", "RootAutomator"]; var len = modules.length; for(var i = 0; i < len; i++) { var m = modules[i]; @@ -47,4 +48,3 @@ require("__general__")(__runtime__, this); __importClass__(android.view.KeyEvent); __importClass__(com.stardust.autojs.runtime.api.Shell); -__importClass__(com.stardust.autojs.runtime.api.RootAutomator); diff --git a/autojs/src/main/assets/modules/__RootAutomator__.js b/autojs/src/main/assets/modules/__RootAutomator__.js new file mode 100644 index 00000000..31669b09 --- /dev/null +++ b/autojs/src/main/assets/modules/__RootAutomator__.js @@ -0,0 +1,13 @@ +module.exports = function(__runtime__, scope){ + function RootAutomator(){ + this.__ra__ = Object.create(new com.stardust.autojs.runtime.api.RootAutomator(scope.context)); + var methods = ["sendEvent", "touch", "setScreenMetrics", "touchX", "touchY", "sendSync", "sendMtSync", "tap", + "swipe","touchDown", "touchUp", "touchMove", "getDefaultId", "setDefaultId", "exit"]; + for(var i = 0; i < methods.length; i++){ + var method = methods[i]; + this[method] = this.__ra__[method].bind(this.__ra__); + } + } + var p = RootAutomator.prototype; + return RootAutomator; +} \ No newline at end of file diff --git a/autojs/src/main/java/com/stardust/autojs/core/record/inputevent/InputEventToRootAutomatorRecorder.java b/autojs/src/main/java/com/stardust/autojs/core/record/inputevent/InputEventToRootAutomatorRecorder.java index 0a03d650..b8908b7f 100644 --- a/autojs/src/main/java/com/stardust/autojs/core/record/inputevent/InputEventToRootAutomatorRecorder.java +++ b/autojs/src/main/java/com/stardust/autojs/core/record/inputevent/InputEventToRootAutomatorRecorder.java @@ -1,8 +1,12 @@ package com.stardust.autojs.core.record.inputevent; import android.support.annotation.NonNull; +import android.util.Log; +import com.stardust.autojs.core.inputevent.InputEventCodes; import com.stardust.autojs.core.inputevent.InputEventObserver; +import com.stardust.autojs.engine.RootAutomatorEngine; +import com.stardust.autojs.runtime.api.RootAutomator; import static com.stardust.util.ScreenMetrics.getDeviceScreenHeight; import static com.stardust.util.ScreenMetrics.getDeviceScreenWidth; @@ -17,16 +21,13 @@ public class InputEventToRootAutomatorRecorder extends InputEventRecorder { private double mLastEventTime; private StringBuilder mCode = new StringBuilder(); private int mTouchDevice = -1; - private int mLastTouchX = -1; - private int mLastTouchY = -1; public InputEventToRootAutomatorRecorder() { - mCode.append("var ra = new RootAutomator(context);\n") + mCode.append("var ra = new RootAutomator();\n") .append("ra.setScreenMetrics(").append(getDeviceScreenWidth()).append(", ") .append(getDeviceScreenHeight()).append(");\n"); } - @Override public void recordInputEvent(@NonNull InputEventObserver.InputEvent event) { if (mLastEventTime == 0) { @@ -39,21 +40,18 @@ public class InputEventToRootAutomatorRecorder extends InputEventRecorder { int type = (int) Long.parseLong(event.type, 16); int code = (int) Long.parseLong(event.code, 16); int value = (int) Long.parseLong(event.value, 16); - if (type == 3) { - if (code == 53) { - onTouchX(device, value); - return; - } - if (code == 54) { - onTouchY(device, value); + if (type == InputEventCodes.EV_ABS) { + if (code == InputEventCodes.ABS_MT_POSITION_X || code == InputEventCodes.ABS_MT_POSITION_Y) { + mTouchDevice = device; + RootAutomatorEngine.setTouchDevice(device); + onTouch(code, value); return; } } - checkLastTouch(); if (device != mTouchDevice) { return; } - if (type == 0 && code == 0 && value == 0) { + if (type == InputEventCodes.EV_SYN && code == InputEventCodes.SYN_REPORT && value == 0) { mCode.append("ra.sendSync();\n"); return; } @@ -63,43 +61,14 @@ public class InputEventToRootAutomatorRecorder extends InputEventRecorder { .append(value).append(");\n"); } - private void checkLastTouch() { - if (mLastTouchX >= 0) { - mCode.append("ra.touchX(").append(mLastTouchX).append(");\n"); - mLastTouchX = -1; - } - if (mLastTouchY >= 0) { - mCode.append("ra.touchY(").append(mLastTouchY).append(");\n"); - mLastTouchY = -1; - } - } - - private void onTouchX(int device, int value) { - if (mTouchDevice == -1) { - setTouchDevice(device); - } - mLastTouchX = value; - } - - private void onTouchY(int device, int value) { - if (mTouchDevice == -1) { - setTouchDevice(device); - } - if (mLastTouchX >= 0) { - mCode.append("ra.touch(") - .append(mLastTouchX).append(", ") - .append(value).append(");\n"); - mLastTouchX = -1; + private void onTouch(int code, int value) { + if (code == InputEventCodes.ABS_MT_POSITION_X) { + mCode.append("ra.touchX(").append(value).append(");\n"); } else { - mLastTouchY = value; + mCode.append("ra.touchY(").append(value).append(");\n"); } } - private void setTouchDevice(int i) { - //mCode.append("ra.setInputDevice(").append(i).append(");\n"); - mTouchDevice = i; - } - public String getCode() { return mCode.toString(); } diff --git a/autojs/src/main/java/com/stardust/autojs/runtime/api/RootAutomator.java b/autojs/src/main/java/com/stardust/autojs/runtime/api/RootAutomator.java index ce871564..8a9ab261 100644 --- a/autojs/src/main/java/com/stardust/autojs/runtime/api/RootAutomator.java +++ b/autojs/src/main/java/com/stardust/autojs/runtime/api/RootAutomator.java @@ -37,7 +37,7 @@ public class RootAutomator { @Nullable private ScreenMetrics mScreenMetrics; private AbstractShell mShell; - private int mDefaultId = -1; + private int mDefaultId = 1; public RootAutomator(Context context) { mShell = new ProcessShell(true);