简洁高效:我的Autojs通用函数封装经验分享

当我们编写代码时,重复的代码是一个很常见的问题。为了提高代码的可维护性和可重用性,我们可以将这些重复的代码提取出来,并封装成函数。

环境

  • Autojs pro 9.3.11

下面是一些我封装的通用函数代码示例:

1.重新封装选择器调用,方便通过网络更新节点

/**
 * 根据提供的选择器方法和参数选择元素。
 * 构造并返回一个选择器对象,根据传入的选择器数据依次调用对应的选择器方法。
 * @param {Object} query - 包含选择器方法名和参数的对象。
 * @returns {Object} - 选择结果的对象。
 */
function select(query) {
  // 将选择器方法名和方法参数解构出来,然后通过 reduce 方法逐个调用该对象的方法。
  return Object.entries(query).reduce(
    (s, [method, args]) => s[method](args),
    selector()
  );
}
// 使用方法:传入选择器节点对象 
select({ textMatches: /微信号.*/ }).findOnce()

2.通过上面的封装,再来点击节点函数,这里我添加范围随机点击,能符合人的操作

[content_hide]

/**
 * 点击符合给定条件的可见节点。
 *
 * @param {Object} query - 包含选择器方法和参数的对象。
 * @param {Object} [options] - 可选参数对象。
 * @param {boolean} [options.isRandom=false] - 是否随机点击节点。
 * @param {string} [options.mark] - 操作标记,用于在日志中标识该操作。
 * @param {Function} [options.log] - 用于输出日志的自定义函数。
 * @param {Function} [options.error] - 用于输出错误信息的自定义函数。
 * @returns {boolean} - 如果成功点击节点则返回 true,否则返回 false。
 */
function clickNode(query, options) {
  options = options || {};
  options.isRandom = options.isRandom || false;
  // 使用封装的 select 函数查找符合条件的节点。
  let node = select(query).findOnce();
  let ret = false;
  if (node) {
    let rect = node.bounds();
    if (options.isRandom) {
      // 范围随机点击, 按压时长随机值
      let x = random(rect.left + 1, rect.right - 1);
      let y = random(rect.top + 1, rect.bottom - 1);
      let duration = random(50, 300);
      press(x, y, duration);
      ret = true;
    } else {
      // 如果控件可以点击
      if (node.clickable()) {
        if (node.click()) {
          ret = true;
        } else {
          node.clickCenter();
          ret = true;
        }
      } else {
        // 点击中心点
        if (rect.centerX() > 0 && rect.centerY() > 0) {
          node.clickCenter();
          ret = true;
        }
      }
    }
  }
  let mark = options.mark ? options.mark : query.toString();
  if (ret) {
    let message = "点击:" + mark;
    // 如果传递了 error 方法,则使用该方法输出错误信息,否则使用 console.error 方法。
    options.log ? options.log(message) : console.log(message);
    return ret;
  } else {
    let message = "[点击失败]-没有找到:" + mark;
    options.error ? options.error(message) : console.error(message);
    return ret;
  }
}
// 使用方法:传入选择器节点对象
let wechat = {
  addressBook: { textMatches: /通讯录/ },
  new: { textMatches: /新的朋友/ },
};
clickNode(wechat.addressBook, { mark: "通讯录", isRandom: true });
sleep(1000);
clickNode(wechat.new, { mark: "通讯录", isRandom: true });

一有时间,就逐步添加。

[/content_hide]

这些是一些简单的示例函数,你可以根据自己的需求进行修改和扩展。通过封装这些通用函数,我们可以减少重复代码的数量,提高代码的可读性和可维护性,并且可以在不同的场景中多次使用这些函数,提高代码的复用性。

© 版权声明
THE END
喜欢就支持一下吧
点赞1 分享
评论 共17条

请登录后发表评论