- 读取图片
let imgFilepath = files.path("./chess.png");
let img = images.read(imgFilepath);
- 设置绘制区域
let rect = {
left: 52,
top: 20,
right: 138,
bottom: 96,
};
- 设置画笔属性: 绿色, 空心
let paint = new Paint();
paint.setStrokeWidth(9);
paint.setColor(colors.parseColor("#00ff00"));
paint.setStyle(Paint.Style.STROKE);
- 在图片上画矩形
var canvas = new Canvas(img);
canvas.drawRect(left, top, right, bottom, paint);
- 把canvas的数据转成图片
var image = canvas.toImage();
let filePath = "/sdcard/脚本/showRect.png";
files.createWithDirs(filePath);
images.save(image, filePath);
- 回收资源
image.recycle();
img.recycle();
- 查看图片
app.viewFile(filePath);
在全屏透明悬浮窗上直接画矩形, 圆形, 文字
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4IplbkEj-1653470466691)(https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/97542b35b48c4f8bae83178b5e2a29ce~tplv-k3u1fbpfcp-zoom-in-crop-mark:1956:0:0:0.image)]
使用示例
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
- 检查悬浮窗权限
function ensureFloatyPermission() {
if (floaty.checkPermission()) {
return true;
}
toastLog("请授予悬浮窗权限");
app.startActivity({
action: "android.settings.action.MANAGE_OVERLAY_PERMISSION",
data: "package:" + context.packageName,
});
throw new Error("请授予悬浮窗权限");
}
- 创建悬浮窗
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;
}
- 创建画笔
function createPaint() {
paint = new Paint();
paint.setStyle(Paint.Style.FILL);
paint.setTextSize(100);
return paint;
}
- 设置画板draw事件
board.on("draw", (canvas) => {
canvas.drawColor(android.graphics.Color.TRANSPARENT, android.graphics.PorterDuff.Mode.CLEAR);
## 最后
其实Android开发的知识点就那么多,面试问来问去还是那么点东西。所以面试没有其他的诀窍,只看你对这些知识点准备的充分程度。so,出去面试时先看看自己复习到了哪个阶段就好。
当然我也为你们整理好了百度、阿里、腾讯、字节跳动等等互联网超级大厂的历年面试真题集锦。这也是我这些年来养成的习惯,一定要学会把好的东西,归纳整理,然后系统的消化吸收,这样才能极大的提高学习效率和成长进阶。碎片、零散化的东西,我觉得最没有价值的。就好比你给我一张扑克牌,我只会觉得它是一张废纸,但如果你给我一副扑克牌,它便有了它的价值。这和我们收集资料就要收集那些系统化的,是一个道理。
![](https://img-blog.csdnimg.cn/img_convert/7552034f7490095d581b418d1ae9f286.webp?x-oss-process=image/format,png)
网上学习 Android的资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。希望这份系统化的技术体系对大家有一个方向参考。
**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**
**[需要这份系统化学习资料的朋友,可以戳这里获取](https://bbs.csdn.net/topics/618156601)**
**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**
问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**
**[需要这份系统化学习资料的朋友,可以戳这里获取](https://bbs.csdn.net/topics/618156601)**
**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**