注册 登录
发贴工具
查看: 11|回复: 0
打印 上一主题 下一主题

[24小时收录超级好的网站] 无障碍方式双指向中间滑动放大缩小完整示例

[复制链接]

2607

主题

2655

帖子

1万

积分

积分
15820
跳转到指定楼层
楼主
无障碍方式双指向中间滑动放大缩小完整示例
无障碍方式双指向中间滑动放大缩小完整示例 群发软件发帖工具
  1. /**
  2. * ============================================================
  3. * AIWROK - 双指向中间滑动(捏合手势)完整示例【无碍模式】
  4. * ============================================================
  5. * 核心功能:
  6. *   1. auto.dispatchGesture([path1, path2])  —— 同时执行多条路径,实现多点触控
  7. *   2. new path() + setDurTime() + addPoint() —— 构建单根手指的滑动轨迹
  8. *
  9. * 手势说明:
  10. *   - 捏合(缩小):左指向右滑 + 右指向左滑,两指同时向中间靠拢
  11. *   - 放大(张开):左指向左滑 + 右指向右滑,两指同时向外分开(附带示例)
  12. *
  13. * 无碍模式特性:
  14. *   1. 环境自检:运行前自动检查 path / auto.dispatchGesture 是否可用
  15. *   2. 安全封装:创建路径、执行手势全部走 try-catch,任何一步失败都不崩溃
  16. *   3. 参数校验:百分比参数越界自动纠正到合法范围
  17. *   4. 单个手势失败不影响后续手势继续执行
  18. *   5. 失败降级:返回 false 并给出排查建议,方便上层逻辑做备选方案
  19. *
  20. * 【重要】本文件仅适配"无碍模式"(无障碍服务)运行:
  21. *   - 手势一律使用 auto.dispatchGesture([path1, path2]) + new path()
  22. *   - 运行前请确认已开启 AIWROK 无障碍服务权限
  23. * ============================================================
  24. */

  25. // =====================================================
  26. //  0. 环境自检(脚本运行时会自动执行一次)
  27. // =====================================================
  28. var _GESTURE_OK = true;

  29. (function _gestureSelfCheck() {
  30.     var msg = "【自检】捏合手势运行环境:\n";
  31.     try {
  32.         if (typeof path === 'undefined') {
  33.             msg += "  × path 对象不可用(无法创建手势路径)\n";
  34.             _GESTURE_OK = false;
  35.         } else {
  36.             msg += "  ✓ path 对象可用\n";
  37.         }

  38.         if (typeof auto === 'undefined' || typeof auto.dispatchGesture !== 'function') {
  39.             msg += "  × auto.dispatchGesture 不可用(无法执行手势)\n";
  40.             _GESTURE_OK = false;
  41.         } else {
  42.             msg += "  ✓ auto.dispatchGesture 可用\n";
  43.         }

  44.         // 屏幕尺寸检测(可选,失败可用默认值)
  45.         try {
  46.             if (typeof screen !== 'undefined'
  47.                 && typeof screen.getScreenWidth === 'function'
  48.                 && typeof screen.getScreenHeight === 'function') {
  49.                 msg += "  ✓ screen 尺寸可用: " + screen.getScreenWidth() + " x " + screen.getScreenHeight() + "\n";
  50.             } else if (typeof device !== 'undefined' && typeof device.width === 'number') {
  51.                 msg += "  ✓ device 尺寸可用: " + device.width + " x " + device.height + "\n";
  52.             } else {
  53.                 msg += "  ⚠ 尺寸获取不可用,将回退 1080 x 1920\n";
  54.             }
  55.         } catch (e) {
  56.             msg += "  ⚠ 尺寸读取异常: " + e + ",将回退 1080 x 1920\n";
  57.         }

  58.         if (_GESTURE_OK) {
  59.             msg += "  ✓ 自检通过,可以正常执行捏合手势";
  60.         } else {
  61.             msg += "  ✗ 自检未通过!请检查是否已开启 AIWROK 无障碍服务权限";
  62.         }
  63.     } catch (e) {
  64.         msg += "  ✗ 自检过程异常: " + e + "\n";
  65.         _GESTURE_OK = false;
  66.     }
  67.     _log(msg);
  68. })();

  69. // =====================================================
  70. //  1. 安全工具函数
  71. // =====================================================

  72. /**
  73. * 安全获取屏幕尺寸(任何异常都回退默认值)
  74. */
  75. function _gestureGetScreen() {
  76.     var w = 1080, h = 1920;
  77.     try {
  78.         if (typeof screen !== 'undefined') {
  79.             if (typeof screen.getScreenWidth === 'function')  w = screen.getScreenWidth();
  80.             if (typeof screen.getScreenHeight === 'function') h = screen.getScreenHeight();
  81.         } else if (typeof device !== 'undefined') {
  82.             if (typeof device.width === 'number')  w = device.width;
  83.             if (typeof device.height === 'number') h = device.height;
  84.         }
  85.         // 防脏数据:尺寸为 0 或非数字时回退默认
  86.         w = (typeof w === 'number' && w > 0) ? w : 1080;
  87.         h = (typeof h === 'number' && h > 0) ? h : 1920;
  88.     } catch (e) {
  89.         _log("⚠ 获取屏幕尺寸异常,使用默认值: " + e);
  90.     }
  91.     return { w: w, h: h };
  92. }

  93. /**
  94. * 参数校验:把百分比约束到 0~1 之间(防止越界导致手势报错)
  95. */
  96. function _clampPercent(v, fallback) {
  97.     try {
  98.         v = parseFloat(v);
  99.         if (isNaN(v)) return fallback;
  100.         if (v < 0) return 0;
  101.         if (v > 1) return 1;
  102.         return v;
  103.     } catch (e) {
  104.         return fallback;
  105.     }
  106. }

  107. /**
  108. * 安全创建单指路径
  109. * @param points 坐标点数组,如 [[x1,y1],[x2,y2]]
  110. * @param duration 时长(毫秒)
  111. * @return path 对象;创建失败返回 null
  112. */
  113. function _safeCreatePath(points, duration) {
  114.     try {
  115.         if (typeof path === 'undefined') {
  116.             _log("✗ path 对象不可用,无法创建路径");
  117.             return null;
  118.         }
  119.         if (!points || points.length < 2) {
  120.             _log("✗ 路径点不足(至少需要 2 个点)");
  121.             return null;
  122.         }
  123.         var p = new path();
  124.         p.setDurTime(duration > 0 ? duration : 600);
  125.         for (var i = 0; i < points.length; i++) {
  126.             var pt = points[i];
  127.             if (!pt || typeof pt[0] !== 'number' || typeof pt[1] !== 'number') {
  128.                 _log("✗ 路径点[" + i + "]非法,跳过该点: " + JSON.stringify(pt));
  129.                 continue;
  130.             }
  131.             p.addPoint(pt[0], pt[1]);
  132.         }
  133.         return p;
  134.     } catch (e) {
  135.         _log("✗ 创建路径异常: " + e);
  136.         return null;
  137.     }
  138. }

  139. /**
  140. * 安全执行手势(无碍核心:任何情况都不抛出异常)
  141. * @param paths path 对象数组
  142. * @return true/false
  143. */
  144. function _safeDispatchGesture(paths) {
  145.     try {
  146.         if (!_GESTURE_OK) {
  147.             _log("✗ 环境自检未通过(path/dispatchGesture 不可用),跳过手势");
  148.             return false;
  149.         }
  150.         if (!paths || paths.length === 0) {
  151.             _log("✗ 手势路径数组为空,不执行");
  152.             return false;
  153.         }
  154.         if (typeof auto === 'undefined' || typeof auto.dispatchGesture !== 'function') {
  155.             _log("✗ auto.dispatchGesture 不可用,无法执行手势");
  156.             return false;
  157.         }
  158.         // 过滤掉创建失败(null)的路径,至少要有一条有效路径
  159.         var valid = [];
  160.         for (var i = 0; i < paths.length; i++) {
  161.             if (paths[i]) valid.push(paths[i]);
  162.         }
  163.         if (valid.length === 0) {
  164.             _log("✗ 没有有效的路径对象,不执行手势");
  165.             return false;
  166.         }
  167.         var result = auto.dispatchGesture(valid);
  168.         if (result === true || result === 1) {
  169.             return true;
  170.         }
  171.         _log("✗ dispatchGesture 返回失败(可能是权限不足或当前界面不支持手势)");
  172.         return false;
  173.     } catch (e) {
  174.         _log("✗ 执行手势异常: " + e);
  175.         return false;
  176.     }
  177. }

  178. /**
  179. * 手势失败时的排查提示(无碍模式:失败不静默,给线索)
  180. */
  181. function _gestureFailHint() {
  182.     _log("  └─ 排查建议:");
  183.     _log("      1. 确认已开启 AIWROK 的【无障碍服务】权限");
  184.     _log("      2. 确认当前处于支持双指捏合的界面(如看图/地图,桌面可能没反应)");
  185.     _log("      3. 确认无障碍服务没有与其他应用冲突");
  186. }

  187. /**
  188. * 日志工具:兼容 print.log / console.log
  189. */
  190. function _log(msg) {
  191.     try {
  192.         if (typeof print !== 'undefined' && typeof print.log === 'function') {
  193.             print.log(msg);
  194.         } else if (typeof console !== 'undefined' && typeof console.log === 'function') {
  195.             console.log(msg);
  196.         }
  197.     } catch (e) {
  198.         // 日志失败直接忽略,不影响主体功能
  199.     }
  200. }

  201. // =====================================================
  202. //  2. 无碍模式捏合工具函数(可直接复用)
  203. // =====================================================

  204. /**
  205. * 水平捏合(左指向右 + 右指向左 → 向中间滑动)
  206. * @param leftStartXPercent  左指起点 X 百分比 0~1
  207. * @param rightStartXPercent 右指起点 X 百分比 0~1
  208. * @param yPercent           捏合中心线 Y 百分比 0~1
  209. * @param convergePercent    向中间收敛位置(0.5 = 正中心)
  210. * @param duration           时长(毫秒)
  211. */
  212. function pinchHorizontal(leftStartXPercent, rightStartXPercent, yPercent, convergePercent, duration) {
  213.     try {
  214.         leftStartXPercent  = _clampPercent(leftStartXPercent, 0.25);
  215.         rightStartXPercent = _clampPercent(rightStartXPercent, 0.75);
  216.         yPercent           = _clampPercent(yPercent, 0.5);
  217.         convergePercent    = _clampPercent(convergePercent, 0.5);
  218.         duration           = (typeof duration === 'number' && duration > 0) ? duration : 600;

  219.         var s = _gestureGetScreen();
  220.         var y  = s.h * yPercent;
  221.         var cx = s.w * convergePercent;
  222.         var gap = s.w * 0.05;

  223.         // 左指:起点 → 中心左侧(留间距不撞车)
  224.         var pL = _safeCreatePath([
  225.             [s.w * leftStartXPercent, y],
  226.             [cx - gap, y]
  227.         ], duration);
  228.         // 右指:起点 → 中心右侧
  229.         var pR = _safeCreatePath([
  230.             [s.w * rightStartXPercent, y],
  231.             [cx + gap, y]
  232.         ], duration);

  233.         _log("水平捏合: 左 " + (leftStartXPercent * 100).toFixed(0) + "% → 中心左"
  234.              + ",右 " + (rightStartXPercent * 100).toFixed(0) + "% → 中心右"
  235.              + ",Y=" + (yPercent * 100).toFixed(0) + "%,时长 " + duration + "ms");

  236.         var ok = _safeDispatchGesture([pL, pR]);
  237.         _log(ok ? "✓ 水平捏合执行成功" : "✗ 水平捏合执行失败");
  238.         if (!ok) _gestureFailHint();
  239.         return ok;
  240.     } catch (e) {
  241.         _log("✗ 水平捏合函数异常: " + e);
  242.         return false;
  243.     }
  244. }

  245. /**
  246. * 垂直捏合(上指下滑 + 下指上滑 → 向中间)
  247. * @param topStartYPercent    上指起点 Y 百分比 0~1
  248. * @param bottomStartYPercent 下指起点 Y 百分比 0~1
  249. * @param xPercent            捏合中心线 X 百分比 0~1
  250. * @param convergePercent     向中间收敛位置(0.5 = 正中心)
  251. * @param duration            时长(毫秒)
  252. */
  253. function pinchVertical(topStartYPercent, bottomStartYPercent, xPercent, convergePercent, duration) {
  254.     try {
  255.         topStartYPercent    = _clampPercent(topStartYPercent, 0.25);
  256.         bottomStartYPercent = _clampPercent(bottomStartYPercent, 0.75);
  257.         xPercent            = _clampPercent(xPercent, 0.5);
  258.         convergePercent     = _clampPercent(convergePercent, 0.5);
  259.         duration            = (typeof duration === 'number' && duration > 0) ? duration : 600;

  260.         var s = _gestureGetScreen();
  261.         var x  = s.w * xPercent;
  262.         var cy = s.h * convergePercent;
  263.         var gap = s.h * 0.05;

  264.         // 上指:顶部 → 中心上方
  265.         var pT = _safeCreatePath([
  266.             [x, s.h * topStartYPercent],
  267.             [x, cy - gap]
  268.         ], duration);
  269.         // 下指:底部 → 中心下方
  270.         var pB = _safeCreatePath([
  271.             [x, s.h * bottomStartYPercent],
  272.             [x, cy + gap]
  273.         ], duration);

  274.         _log("垂直捏合: 上 " + (topStartYPercent * 100).toFixed(0) + "% + 下 "
  275.              + (bottomStartYPercent * 100).toFixed(0) + "% → 中心,X="
  276.              + (xPercent * 100).toFixed(0) + "%,时长 " + duration + "ms");

  277.         var ok = _safeDispatchGesture([pT, pB]);
  278.         _log(ok ? "✓ 垂直捏合执行成功" : "✗ 垂直捏合执行失败");
  279.         if (!ok) _gestureFailHint();
  280.         return ok;
  281.     } catch (e) {
  282.         _log("✗ 垂直捏合函数异常: " + e);
  283.         return false;
  284.     }
  285. }

  286. /**
  287. * 对角线捏合(左上 + 右下 → 中心,看图缩小最常用)
  288. * @param duration 时长(毫秒)
  289. */
  290. function pinchDiagonal(duration) {
  291.     try {
  292.         duration = (typeof duration === 'number' && duration > 0) ? duration : 700;
  293.         var s = _gestureGetScreen();
  294.         var cx = s.w * 0.5, cy = s.h * 0.5;
  295.         var gx = s.w * 0.05, gy = s.h * 0.05;

  296.         var p1 = _safeCreatePath([
  297.             [s.w * 0.15, s.h * 0.20],
  298.             [cx - gx, cy - gy]
  299.         ], duration);
  300.         var p2 = _safeCreatePath([
  301.             [s.w * 0.85, s.h * 0.80],
  302.             [cx + gx, cy + gy]
  303.         ], duration);

  304.         _log("对角线捏合: 左上(15%,20%) + 右下(85%,80%) → 中心,时长 " + duration + "ms");

  305.         var ok = _safeDispatchGesture([p1, p2]);
  306.         _log(ok ? "✓ 对角线捏合执行成功" : "✗ 对角线捏合执行失败");
  307.         if (!ok) _gestureFailHint();
  308.         return ok;
  309.     } catch (e) {
  310.         _log("✗ 对角线捏合函数异常: " + e);
  311.         return false;
  312.     }
  313. }

  314. /**
  315. * 通用双指捏合(任意起点 + 指定收敛中心)
  316. * @param start1   起点1 {x:0~1, y:0~1}
  317. * @param start2   起点2 {x:0~1, y:0~1}
  318. * @param center   收敛中心 {x:0~1, y:0~1}
  319. * @param duration 时长(毫秒)
  320. */
  321. function pinchGeneric(start1, start2, center, duration) {
  322.     try {
  323.         if (!start1 || !start2 || typeof start1.x !== 'number' || typeof start2.x !== 'number') {
  324.             _log("✗ pinchGeneric 参数错误:start1/start2 必填且必须含 x/y 百分比");
  325.             return false;
  326.         }
  327.         var s = _gestureGetScreen();
  328.         center   = center   || { x: 0.5, y: 0.5 };
  329.         duration = (typeof duration === 'number' && duration > 0) ? duration : 700;
  330.         var ratio = 0.85; // 向中心靠近比例(留间距避免两指重合被识别成单指)

  331.         var cx = s.w * _clampPercent(center.x, 0.5);
  332.         var cy = s.h * _clampPercent(center.y, 0.5);

  333.         var p1 = _safeCreatePath([
  334.             [s.w * _clampPercent(start1.x, 0.25), s.h * _clampPercent(start1.y, 0.25)],
  335.             [s.w * _clampPercent(start1.x, 0.25) + (cx - s.w * _clampPercent(start1.x, 0.25)) * ratio,
  336.              s.h * _clampPercent(start1.y, 0.25) + (cy - s.h * _clampPercent(start1.y, 0.25)) * ratio]
  337.         ], duration);

  338.         var p2 = _safeCreatePath([
  339.             [s.w * _clampPercent(start2.x, 0.75), s.h * _clampPercent(start2.y, 0.75)],
  340.             [s.w * _clampPercent(start2.x, 0.75) + (cx - s.w * _clampPercent(start2.x, 0.75)) * ratio,
  341.              s.h * _clampPercent(start2.y, 0.75) + (cy - s.h * _clampPercent(start2.y, 0.75)) * ratio]
  342.         ], duration);

  343.         _log("通用捏合: (" + start1.x + "," + start1.y + ") + (" + start2.x + "," + start2.y
  344.              + ") → 中心(" + center.x + "," + center.y + "),时长 " + duration + "ms");

  345.         var ok = _safeDispatchGesture([p1, p2]);
  346.         _log(ok ? "✓ 通用捏合执行成功" : "✗ 通用捏合执行失败");
  347.         if (!ok) _gestureFailHint();
  348.         return ok;
  349.     } catch (e) {
  350.         _log("✗ 通用捏合函数异常: " + e);
  351.         return false;
  352.     }
  353. }

  354. /**
  355. * 水平放大(与捏合相反,双指向外分开)
  356. * @param duration 时长(毫秒)
  357. */
  358. function zoomHorizontal(duration) {
  359.     try {
  360.         duration = (typeof duration === 'number' && duration > 0) ? duration : 600;
  361.         var s = _gestureGetScreen();
  362.         var y   = s.h * 0.5;
  363.         var gap = s.w * 0.05;

  364.         var pL = _safeCreatePath([
  365.             [s.w * 0.5 - gap, y],
  366.             [s.w * 0.20, y]
  367.         ], duration);
  368.         var pR = _safeCreatePath([
  369.             [s.w * 0.5 + gap, y],
  370.             [s.w * 0.80, y]
  371.         ], duration);

  372.         _log("水平放大: 中间 → 左右张开,时长 " + duration + "ms");

  373.         var ok = _safeDispatchGesture([pL, pR]);
  374.         _log(ok ? "✓ 水平放大执行成功" : "✗ 水平放大执行失败");
  375.         if (!ok) _gestureFailHint();
  376.         return ok;
  377.     } catch (e) {
  378.         _log("✗ 水平放大函数异常: " + e);
  379.         return false;
  380.     }
  381. }

  382. // =====================================================
  383. //  3. 主流程(无碍模式:每个示例独立 try-catch,互不影响)
  384. // =====================================================
  385. function main() {
  386.     _log("========== 双指向中间滑动(捏合手势)示例【无碍模式】 ==========");

  387.     if (!_GESTURE_OK) {
  388.         _log("✗ 环境自检未通过,跳过所有手势执行(请先开启无障碍服务权限)");
  389.         return;
  390.     }

  391.     var s = _gestureGetScreen();
  392.     var screenW = s.w, screenH = s.h;
  393.     _log("屏幕尺寸: " + screenW + " x " + screenH);

  394.     // ---------- 示例 1:水平方向双指捏合(向中间滑动,缩小图片用) ----------
  395.     _log("\n--- 示例1: 水平捏合(向中间滑动,缩小)---");
  396.     try {
  397.         var pathLeft1 = new path();
  398.         pathLeft1.setDurTime(600);
  399.         pathLeft1.addPoint(screenW * 0.25, screenH * 0.5);
  400.         pathLeft1.addPoint(screenW * 0.45, screenH * 0.5);

  401.         var pathRight1 = new path();
  402.         pathRight1.setDurTime(600);
  403.         pathRight1.addPoint(screenW * 0.75, screenH * 0.5);
  404.         pathRight1.addPoint(screenW * 0.55, screenH * 0.5);

  405.         var ok1 = _safeDispatchGesture([pathLeft1, pathRight1]);
  406.         _log(ok1 ? "✓ 水平捏合执行成功" : "✗ 水平捏合执行失败");
  407.         if (!ok1) _gestureFailHint();
  408.     } catch (e) {
  409.         _log("✗ 示例1 异常: " + e);
  410.     }
  411.     try { sleep.second(1); } catch (e) {}

  412.     // ---------- 示例 2:垂直方向双指捏合(上指下滑 + 下指上滑 → 向中间) ----------
  413.     _log("\n--- 示例2: 垂直捏合(向中间滑动)---");
  414.     try {
  415.         var pathTop = new path();
  416.         pathTop.setDurTime(600);
  417.         pathTop.addPoint(screenW * 0.5, screenH * 0.25);
  418.         pathTop.addPoint(screenW * 0.5, screenH * 0.45);

  419.         var pathBottom = new path();
  420.         pathBottom.setDurTime(600);
  421.         pathBottom.addPoint(screenW * 0.5, screenH * 0.75);
  422.         pathBottom.addPoint(screenW * 0.5, screenH * 0.55);

  423.         var ok2 = _safeDispatchGesture([pathTop, pathBottom]);
  424.         _log(ok2 ? "✓ 垂直捏合执行成功" : "✗ 垂直捏合执行失败");
  425.         if (!ok2) _gestureFailHint();
  426.     } catch (e) {
  427.         _log("✗ 示例2 异常: " + e);
  428.     }
  429.     try { sleep.second(1); } catch (e) {}

  430.     // ---------- 示例 3:对角线捏合(左上+右下同时向中心靠拢) ----------
  431.     _log("\n--- 示例3: 对角线捏合(左上+右下 → 中心)---");
  432.     try {
  433.         var pathLT = new path();
  434.         pathLT.setDurTime(700);
  435.         pathLT.addPoint(screenW * 0.15, screenH * 0.2);
  436.         pathLT.addPoint(screenW * 0.42, screenH * 0.46);

  437.         var pathRB = new path();
  438.         pathRB.setDurTime(700);
  439.         pathRB.addPoint(screenW * 0.85, screenH * 0.8);
  440.         pathRB.addPoint(screenW * 0.58, screenH * 0.54);

  441.         var ok3 = _safeDispatchGesture([pathLT, pathRB]);
  442.         _log(ok3 ? "✓ 对角线捏合执行成功" : "✗ 对角线捏合执行失败");
  443.         if (!ok3) _gestureFailHint();
  444.     } catch (e) {
  445.         _log("✗ 示例3 异常: " + e);
  446.     }
  447.     try { sleep.second(1); } catch (e) {}

  448.     // ---------- 示例 4:放大手势(与捏合相反,双指向外分开) ----------
  449.     _log("\n--- 示例4: 水平放大(双指向外分开)---");
  450.     try {
  451.         var pathLeft4 = new path();
  452.         pathLeft4.setDurTime(600);
  453.         pathLeft4.addPoint(screenW * 0.45, screenH * 0.5);
  454.         pathLeft4.addPoint(screenW * 0.20, screenH * 0.5);

  455.         var pathRight4 = new path();
  456.         pathRight4.setDurTime(600);
  457.         pathRight4.addPoint(screenW * 0.55, screenH * 0.5);
  458.         pathRight4.addPoint(screenW * 0.80, screenH * 0.5);

  459.         var ok4 = _safeDispatchGesture([pathLeft4, pathRight4]);
  460.         _log(ok4 ? "✓ 水平放大执行成功" : "✗ 水平放大执行失败");
  461.         if (!ok4) _gestureFailHint();
  462.     } catch (e) {
  463.         _log("✗ 示例4 异常: " + e);
  464.     }
  465.     try { sleep.second(1); } catch (e) {}

  466.     // ---------- 示例 5:调用封装函数 ----------
  467.     _log("\n--- 示例5: 调用封装函数 pinchHorizontal() ---");
  468.     try {
  469.         var ok5 = pinchHorizontal(0.2, 0.8, 0.5, 0.5, 800);
  470.         _log(ok5 ? "✓ 封装函数调用成功" : "✗ 封装函数调用失败(不影响脚本继续)");
  471.     } catch (e) {
  472.         _log("✗ 示例5 异常: " + e);
  473.     }
  474.     try { sleep.second(1); } catch (e) {}

  475.     // ---------- 示例 6:封装函数集合演示(垂直/对角线/放大/通用) ----------
  476.     _log("\n--- 示例6: 封装函数集合演示 ---");
  477.     try {
  478.         pinchVertical(0.2, 0.8, 0.5, 0.5, 700);
  479.         try { sleep.second(1); } catch (e) {}
  480.         pinchDiagonal(800);
  481.         try { sleep.second(1); } catch (e) {}
  482.         zoomHorizontal(700);
  483.         try { sleep.second(1); } catch (e) {}
  484.         pinchGeneric({x: 0.1, y: 0.1}, {x: 0.9, y: 0.9}, {x: 0.5, y: 0.5}, 800);
  485.     } catch (e) {
  486.         _log("✗ 示例6 异常: " + e);
  487.     }

  488.     _log("\n========== 示例全部执行完成(无碍模式) ==========");
  489. }

  490. // 执行主函数
  491. main();
复制代码



untoAIWROK双指向中间滑动捏合手势完整示例nextnocontent
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

相关导读了
    采集亚马逊正版群发工具有没有?
    Apr.20旅行X心语今天来说说YYPOST新功能的一个灵活用法,采集亚马逊商品信息,并且获得排名的软件,亚马逊现在越来越多客户做,淘宝的水是越来越清了,以前做电商的客户,现在都转战到外国,最赚钱的要数一些客户往亚马逊里堆了吧,拿我这个YYPOST的客户,最多的是采集,分析排名,刷价格,刷数量,改价,刷访问量等等技术

    企业发展B2B网站有什么东东软件可以发呢
    标题企业发展网B2B软件,现在虽然B2B网站收录不错,可愁的是心急的人们,他们太想一口吃撑胖子了,发帖宣传虽然不能像佛系那样淡定,但也不能像跑火车那般急躁对待,自己内容不收录,完全是自己操作内容问题,可以参考一下别人的内容是怎么弄的,然后自己要试着转变,而且收录这个内容,常常会变化的,不是一种规则就吃到老

    搜房天下房聊软件哪一个好呢
    本帖最后由 发帖软件 于 2019-5-22 16:15 编辑 2搜房天下群发房聊信息软件,开始本来打算做58同城的,但发一个就要一次点触验证码,这就让人没有感觉到存在的价值了吧,都是卖二手房和新房的搜房天下倒是可以发即时聊天信息,也没有发现他这个网站有啥子限制,登陆一个搜房天下账号,然后采集回来分类列表的网址,然后就一

    大家坛有没有好用的群发工具下载呢
    当你的笑容给我礼貌的招呼,大家坛全自动发帖软件,宣传推广是一场持久战,总是有一些人把软件用了一天,或是几个小时,就觉得自己付出太多了,那加进来的粉丝,或是流量,应该是和宣传多少成正比的,其实没有这么便宜的事,就像很多阅读量超过一百万的视频,或是电影,真正会在屏幕打赏的人不会超过三千,真正大额打赏给主

    群发正版软件中国塑料网
    中国塑料网群发软件YYPOST脚本下载地址,这个网站会有一个很奇怪的问题就是你在首页登陆无半个验证码,但在登陆网址登陆就会有一个验证码,所以我们灵活一些,在首页登陆就不用输入验证码了哈。网站秒收录比较高,但发的都是五金和建筑行业,先前有很多人都是发土建工程的大公司操作的,现在这个网站专为那个行业诞生的吧。

    OpenStreetMap网站正版2019年发帖工具下载
    本帖最后由 发帖软件 于 2019-5-21 11:13 编辑 OpenStreetMap网站全自动群发,OpenStreetMapOpenStreetMap(简称OSM,中文是公开地图)是一个网上地图协作计划,目标是创造一个内容自由且能让所有人编辑的世界地图。有的人编辑地图然后等收录,有的人发日志等收录,我们这里也是利用地图日志做为宣传的目标,简单的脚本理

    搜房天下全自动收短信全自动识别验证码注册账号软件
    房天下自动注册机,这个脚本是前几天发房聊的脚本廷伸品种,这个脚本能做到自动注册账号,自动保存账号,自动发房聊的效果,不过今天我们主要说一说怎么注册账号写脚本吧,这个搜房天天下的账号,可以发提问,可以发房聊,发论坛,发博客,还有发个人中心页都是有秒收的效果的,这样就省去了去买号,去乱花钱的效果了吧,而

    企业邮箱安卓端有什么APP软件可以发的呢
    请输入标题企业邮箱安卓发发送邮箱脚本,这个脚本是利用企业邮箱进行群发的,全程是一种模拟手工操作的过程,所以封号是很少的,而且企业邮箱群发到普通QQ邮箱不容易进垃圾箱中的,所以这个脚本也是这样的原理,不过最好是利用一些多开器,登陆多点的QQ邮箱账号会比较流畅一些,然后用软件一个一个的切换APP进行群发邮件会

    头条留评论软件有没有好用的呢?
    今天整一个今日头条留言软件,对于留言YYPOST是优势是比较大的存在,因为他往往专注一些下拉定位的优点,像今日头条这样,还是需要一些特殊下拉定位的,因为他新闻有长有短,有图有视频的,所以综合起来定位是比较难的,如果用POST也不是很轻松可以破解他的加密参数。这个脚本也是有一个不好的地方就是换号会比较麻烦,您电

    单网页生成神器
    最近新技术,网页生成机占领了整个网络的半壁江山,效果很疯狂,虽然不知道能持续多久,作为开发软件的领头者,一直在找收录的方法,一直在努力创新着,一直被人模仿,却从没有被超越过,这个网页生成机,已经出来有一段时间了,一直没有拿出来分享,醉过醉过,它是利用的一些小小收录漏洞整的,您最好用一些老站域名,进行

关闭
快速回复 返回列表 返回顶部
本站自动发贴软件,是现在最流行的做脚本软件,这种发贴工具,不但发贴收录快,而且抢占好的先机,完全自由编辑,实现针对性群发模拟操作,软件可以顶贴,也可以发贴,可以兼容支持Discuz、PHPWind、Dvbbs三大主流论坛,有手机验证码收件,邮件收发的功能,支持验证码识别,注册问题识别,多线程任务,自动上传头像,自动激活注册邮件,兼容防注册插件,本站软件原创正版,更新效率最快的原创软件。 『网络推广软件』『自动发帖软件』『 自动发帖