【AutoJs】纯无障碍模拟多指过滑动验证的解决方案

【AutoJs】纯无障碍模拟多指过滑动验证的解决方案

当我们需要通过无障碍服务模拟多指滑动手势时,必备函数

环境

  • AutojsPro9.3.11
  • 小米10Pro
  • 安卓13

以上是我在写脚本时的环境,写过Autojs脚本的人都知道基本是通用的!

场景

  1. 滑动验证
  2. 游戏
  3. 多指手势切换

这个函数通常使用在滑动验证、游戏脚本时,需要多指进行操作,就可以通过这个函数进行操作了。

功能

使用该函数全程不会断触,并且可以实现多指错开时间进行操作,真实模拟了人工的操作!

代码

/**
 * 执行多指滑动手势
 * @param {Array} fingers 手指路线数组,每项为:
 *   { path: [[x,y],[x,y],...], duration: 5000, startTime: 0 }
 * @param {Object} [options] 可选:designWidth, designHeight, silent
 * @returns {boolean} 是否成功分发手势
 *
 * @example
 * dispatchMultiFingerGesture([
 *   { path: [[200,600],[500,900],[200,1200]], duration: 5000, startTime: 0 },
 *   { path: [[400,600],[700,900],[400,1200]], duration: 5000, startTime: 1000 }
 * ]);
 */
function dispatchMultiFingerGesture(fingers, options) {
  var opts = Object.assign({}, DEFAULT_OPTIONS, options || {});
  setScreenMetrics(opts.designWidth || device.width, opts.designHeight || device.height);

  if (!Array.isArray(fingers) || fingers.length === 0) {
    if (!opts.silent) toastLog("fingers 必须为非空数组");
    return false;
  }

  var Path = android.graphics.Path;
  var StrokeDescription =
    android.accessibilityservice.GestureDescription.StrokeDescription;
  var Builder = android.accessibilityservice.GestureDescription.Builder;

  var builder = new Builder();
  for (var i = 0; i < fingers.length; i++) {
    var finger = fingers[i];
    var pts = finger.path;
    var duration = finger.duration != null ? finger.duration : 5000;
    var startTime = finger.startTime != null ? finger.startTime : 0;

    if (!Array.isArray(pts) || pts.length < 2) {
      if (!opts.silent) toastLog("第" + (i + 1) + "指 path 至少需要 2 个点");
      return false;
    }

    var path = new Path();
    path.moveTo(pts[0][0], pts[0][1]);
    for (var j = 1; j < pts.length; j++) {
      path.lineTo(pts[j][0], pts[j][1]);
    }

    var stroke = new StrokeDescription(path, startTime, duration);
    builder.addStroke(stroke);
  }

  var gesture = builder.build();
  var service = auto.service;
  if (!service) {
    if (!opts.silent) toastLog("无障碍服务未就绪,请先开启无障碍");
    return false;
  }

  try {
    var ok = service.dispatchGesture(gesture, null, null);
    if (!opts.silent) {
      toastLog(ok ? "多指手势完成" : "手势分发被拒绝");
    }
    return ok;
  } catch (err) {
    if (!opts.silent) toastLog("dispatchGesture 失败: " + err);
    return false;
  }
}

测试

dispatchMultiFingerGesture([
    { path: [[200, 600], [500, 900], [200, 1200], [200, 600]], duration: 5000, startTime: 0 },
    { path: [[400, 600], [700, 900], [400, 1200]], duration: 5000, startTime: 800 },
    { path: [[900, 600], [700, 900], [900, 1200]], duration: 6000, startTime: 1300 }
  ]);

觉得好用就收藏吧!

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容