Android 12 保姆级适配指南

目标

在手机屏幕上显示指定的区域

两种方法

  1. 在已存在的图片上, 绘制矩形, 查看图片
  2. 在全屏透明悬浮窗上直接画矩形

已有图片 绘制矩形

请添加图片描述

  1. 读取图片
let imgFilepath = files.path("./chess.png");
let img = images.read(imgFilepath); 
  1. 设置绘制区域
let rect = {
  left: 52,
  top: 20,
  right: 138,
  bottom: 96,
}; 
  1. 设置画笔属性: 绿色, 空心
let paint = new Paint();
paint.setStrokeWidth(9);
paint.setColor(colors.parseColor("#00ff00"));
paint.setStyle(Paint.Style.STROKE); 
  1. 在图片上画矩形
var canvas = new Canvas(img);
canvas.drawRect(left, top, right, bottom, paint); 
  1. 把canvas的数据转成图片
var image = canvas.toImage();
let filePath = "/sdcard/脚本/showRect.png";
files.createWithDirs(filePath);
images.save(image, filePath); 
  1. 回收资源
image.recycle();
img.recycle(); 
  1. 查看图片
app.viewFile(filePath); 

在全屏透明悬浮窗上直接画矩形, 圆形, 文字

使用示例

let Board = require("./board");
let board = new Board();
setTimeout(() => {
  board.drawText({
    x: 100,
    y: 200,
    text: "Hello World",
  });
  sleep(1000);
  board.setPaintColor("#00ff00");
  board.drawCircle({
    x: 200,
    y: 400,
    radius: 100,
  });
  sleep(1000);
  board.setPaintColor("#0000ff");
  board.drawRect({
    left: 400,
    top: 300,
    right: 600,
    bottom: 500,
  });
}, 1000); 

把绘制方法封装成了一个模块Board

请添加图片描述

  1. 检查悬浮窗权限
function ensureFloatyPermission() {
  if (floaty.checkPermission()) {
    return true;
  }
  toastLog("请授予悬浮窗权限");
  app.startActivity({
    action: "android.settings.action.MANAGE_OVERLAY_PERMISSION",
    data: "package:" + context.packageName,
  });
  throw new Error("请授予悬浮窗权限");
} 
  1. 创建悬浮窗
function createFloatyWindow() {
  let floatyWindow = floaty.rawWindow(
    <frame bg="#88ff0000">
      <canvas id="board" w="*" h="*" />
    </frame>
  );
  ui.run(function () {
    floatyWindow.setSize(-1, -1);
    floatyWindow.setPosition(0, 0);
    let touchable = false;
    floatyWindow.setTouchable(touchable);
  });
  return floatyWindow;
} 
  1. 创建画笔
function createPaint() {
  paint = new Paint();
  paint.setStyle(Paint.Style.FILL);
  paint.setTextSize(100);
  return paint;
} 
  1. 设置画板draw事件
board.on("draw", (canvas) => {
  canvas.drawColor(android.graphics.Color.TRANSPARENT, android.graphics.PorterDuff.Mode.CLEAR);
  canvas.drawBitmap(fullScreenBitmap, 0, 0, paint);
}); 
  1. 绘制矩形
Board.prototype.drawRect = function (rect) {
  ensureFullScreenCanvas(fullScreenCanvas);
  ensureRectType(rect);
  fullScreenCanvas.drawRect(rect.left, rect.top, rect.right, rect.bottom, paint);
}; 

所有代码能拆的都拆了, 每个功能函数的行数都很少,

见名知意, 满分10分, 我打9分

备注

全屏使用悬浮窗的 setSize(-1, -1);

部分手机可能覆盖不了状态栏或者底部三大金刚

测试环境

手机: Mi 11 Pro
Android版本: 12
Autojs版本: 9.1.14

分享读者

作者2013年java转到Android开发,在小厂待过,也去过华为,OPPO等大厂待过,18年四月份进了阿里一直到现在。

被人面试过,也面试过很多人。深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长,不成体系的学习效果低效漫长,而且极易碰到天花板技术停滞不前!

我们整理了一份阿里P7级别的Android架构师全套学习资料,特别适合有3-5年以上经验的小伙伴深入学习提升。

主要包括腾讯,以及字节跳动,阿里,华为,小米,等一线互联网公司主流架构技术。如果你有需要,尽管拿走好了。

如果你觉得自己学习效率低,缺乏正确的指导,可以扫描下方二维码,加入资源丰富,学习氛围浓厚的技术圈一起学习交流吧!

群内有许多来自一线的技术大牛,也有在小厂或外包公司奋斗的码农,我们致力打造一个平等,高质量的Android交流圈子,不一定能短期就让每个人的技术突飞猛进,但从长远来说,眼光,格局,长远发展的方向才是最重要的。

35岁中年危机大多是因为被短期的利益牵着走,过早压榨掉了价值,如果能一开始就树立一个正确的长远的职业规划。35岁后的你只会比周围的人更值钱。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值