autojs放大镜

牙叔教程 简单易懂

效果展示

在这里插入图片描述

缘起

群里有人问, 放大镜怎么写

环境

Autojs版本: 9.0.5

Android版本: 8.0.0

软件可能还有些许bug, 介意就别看了, 百度找别的教程去

思路

在这里插入图片描述

你将学到以下知识点

  • 文件分层, 比如将绘制图片文字等绘制类文件放同一个文件夹
  • 配置集中, 比如把布局大小, 放大镜间距, 截图延时配置集中放一起
  • 自定义view, 比如放大镜的圆环阴影
  • 控件在屏幕中的绝对坐标
  • 画圆环, 画十字架, 画字
  • 使用缓存值, 因为ui限制16ms刷新, 能少计算, 就少计算
  • 裁剪画布
  • 保存以及还原画布状态
  • 绘制居中的文字
  • 转换任意单位为px
  • 底部三大金刚高度
  • 把变量放进ui作用域
  • 判断颜色明度, 比如浅色背景黑色文字, 深色背景白色文字
  • 控件设置渐变背景
  • 控件设置透明度
  • 设置动画监听, 比如控件透明动画结束之后, 再截图
  • 停止其他脚本
  • 悬浮窗和截图权限的申请
  • 脚本广播通信
  • 悬浮窗一闪而过的规避方法

难点

  • 悬浮窗移动到边边角角后, 显示图片的计算.
    思路: 悬浮窗计算悬浮窗, 图片计算图片的, 各管个的, 只要每个都是正确的, 那么结果就是正确的

代码讲解

1. 主逻辑
let init = require("./init");
let showFloatingWindows = require("./showFloatingWindows");

// 判断悬浮窗和截图权限, 没有就退出
init();

showFloatingWindows();

let intervalId = setInterval(() => {}, 1000);

events.broadcast.on("退出悬浮窗", function (value) {
  if (value) {
    clearInterval(intervalId);
    setTimeout(function () {}, 1000);
  }
});
2. 权限判断
module.exports = function () {
  engines.all().map((ScriptEngine) => {
    if (engines.myEngine().toString() !== ScriptEngine.toString()) {
      ScriptEngine.forceStop();
    }
  });

  if (!$floaty.checkPermission()) {
    // 没有悬浮窗权限,提示用户并跳转请求
    toastLog("本脚本需要悬浮窗权限来显示悬浮窗,请在随后的界面中允许并重新运行本脚本。");
    $floaty.requestPermission();
    exit();
  } else {
    console.log("已有悬浮窗权限");
  }

  // 请求截图
  if (!requestScreenCapture()) {
    toastLog("请求截图失败");
    exit();
  } else {
    console.log("已有截图权限");
  }
};
3. 悬浮窗布局
let window = $floaty.rawWindow(
  <frame id="parentF" alpha="0.0">
    <custom-view
      ...
    ></custom-view>
    <horizontal gravity="bottom">
      <card cardCornerRadius="{{buttonViewRadiusWithUnit}}" cardElevation="0px">
        <img
		  ...
        ></img>
      </card>

      <View w="{{blankViewSizeWithUnit}}"></View>
      <card cardCornerRadius="{{buttonViewRadiusWithUnit}}" cardElevation="0px">
        <img
          ...
        ></img>
      </card>
    </horizontal>
  </frame>
);
4. 悬浮窗点击事件
window.record.click(function () {
  let data = window.customView.updateData();
  toastLog("颜色已经记录\n" + data);
  setClip(data);
});
window.quit.click(function () {
  toastLog("退出拾色器");
  window.close();
  events.broadcast.emit("退出悬浮窗", true);
});
5. 显示悬浮窗
ui.post(function () {
  let windowWidth = window.getWidth();
  let windowHeight = window.getHeight();
  let x = dw / 2 - windowWidth / 2;
  let y = dh / 2 - windowHeight / 2;
  window.setPosition(x, y);
  setTimeout(function () {
    window.parentF.setAlpha(1);
    window.customView.updateRingColor("#ff0000");
    window.customView.refresh();
    setOnTouchListener(window, dw, dh, windowWidth, windowHeight);
  }, 300);
});
6. 放大镜onDraw
onDraw: function (canvas) {
  this.ringColor = getColor(this);
  paintOfTheOuterCircle.setShader(radialGradientOfTheOuterCircle);
  drawCircle(canvas, this);
  if (this.img) {
    drawImg(canvas, this);
    drawInfo(canvas, this);
  }
  drawCross(canvas, this);
},
7. 绘制十字架
canvas.drawRect(strokeRectFLeft, strokePaint);
canvas.drawRect(fillRectFLeft, fillPaint);

canvas.drawRect(strokeRectFRight, strokePaint);
canvas.drawRect(fillRectFRight, fillPaint);

canvas.drawRect(strokeRectFTop, strokePaint);
canvas.drawRect(fillRectFTop, fillPaint);

canvas.drawRect(strokeRectFBottom, strokePaint);
canvas.drawRect(fillRectFBottom, fillPaint);
8. 绘制圆环
canvas.drawCircle(view.centerX, view.centerY, view.radiusOfTheOuterCircle, view.paintOfTheOuterCircle);
9. 绘制图片
canvas.drawARGB(255, 0, 0, 255);
canvas.drawBitmap(bitmap, srcRect, destRect, paintOfImg);
10. 及时释放图片资源
updateImg: function (img) {
  let oldImg = this.img;
  let oldBitmap = this.bitmap;
  ui.post(function () {
    oldBitmap && oldBitmap.recycle();
    oldImg && oldImg.recycle();
  }, 100);
  this.img = img.clone();
  this.bitmap = this.img.getBitmap();
},

名人名言

思路是最重要的, 其他的百度, bing, stackoverflow, 安卓文档, autojs文档, 最后才是群里问问
— 牙叔教程

声明

部分内容来自网络
本教程仅用于学习, 禁止用于其他用途

bilibili

牙叔教程

微信公众号 牙叔教程

在这里插入图片描述

QQ群

747748653
在这里插入图片描述

完整源码

### 关于 AutoJs 的使用指南 AutoJs 是一款针对 Android 平台设计的 JavaScript 自动化工具,能够帮助开发者轻松完成设备上的各种自动化操作。以下是关于其下载、安装以及使用的相关内容。 #### 1. **AutoJs6 下载与安装** AutoJs6 是 Auto.js 的二次开发版本,提供了更强大的功能和更好的用户体验。可以通过以下方式获取并安装: - 访问官方项目地址:[https://gitcode.com/gh_mirrors/au/AutoJs6](https://gitcode.com/gh_mirrors/au/AutoJs6)[^1]。 - 在该页面找到最新发布的 APK 文件链接,点击下载适合您设备架构的版本(如 ARM 或 x86)。 - 将下载好的 APK 文件传输到您的 Android 设备上,并通过文件管理器打开进行安装。 > 注意事项:部分设备可能存在安全限制,默认情况下不允许安装未知来源的应用程序,请手动调整系统设置允许此权限后再继续安装过程[^1]。 --- #### 2. **AutoJs 基础使用方法** 一旦成功安装好应用之后就可以开始编写自己的第一个脚本来体验它的强大之处了! ##### 创建新脚本 进入主界面后可以看到底部导航栏中有几个选项卡,“首页”,“我的”等等;选择其中一个空白区域右键单击或者长按屏幕弹出菜单项里边会有新建按钮用来创建一个新的 js 脚本文档[^1]。 ##### 编写简单示例代码 这里给出一段非常基础的例子来展示如何控制手机发送一条短信给指定联系人: ```javascript // 设置接收方号码和消息内容 var phoneNumber = "1234567890"; var messageText = "Hello from AutoJs!"; // 执行发信动作 sms.send(phoneNumber, messageText); toast("Message sent!"); ``` 以上这段短小精悍却又实用性强的小程序片段展示了利用 SmsService 对象向目标手机号码传递自定义文本信息的功能。 --- #### 3. **高级特性——WebControl 和 SDK 支持** 对于希望进一步扩展能力范围至远程管理和批量操控场景下的用户来说,则可以考虑采用由 NodeJS 提供技术支持的服务端解决方案即 `AutoJs Web Control` 来达成目的[^2]。它允许管理员无需 ROOT 权限即可实现多部安卓终端的同时在线监管维护作业。 另外还有专门面向软件质量保障工程师推出的测试框架类产品叫做 `AutoJS SDK` ,同样也是建立在此开源引擎之上构建而成的产品线成员之一[^3]。它们各自拥有独立完整的生态系统包括但不限于详细的教程文档资料库可供查阅学习参考价值极高值得深入探索研究一番哦~ --- #### 4. **常见问题解答** Q: 如果遇到无法正常启动的情况怎么办? A: 可能是因为当前操作系统版本过低不兼容最新的特性集所致建议升级至至少 Android 5.0 Lollipop 版本及以上再试一次看看效果是否有改善[^1]。 Q: 如何调试运行中的错误呢? A: 推荐开启 VConsole 工具辅助定位具体位置以便及时修正语法等问题[^4]. ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

牙叔教程

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值