首页 > 其他分享 >Android App运行核心,Handler,Looper,Message

Android App运行核心,Handler,Looper,Message

时间:2023-06-22 11:05:55浏览次数:40  
标签:canvas 悬浮 App paint Handler let Looper rect board


目标

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

两种方法

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

已有图片 绘制矩形

Android App运行核心,Handler,Looper,Message_悬浮窗

  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);

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


Android App运行核心,Handler,Looper,Message_android_02


使用示例

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

Android App运行核心,Handler,Looper,Message_android_03

  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

名人名言

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

声明

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

标签:canvas,悬浮,App,paint,Handler,let,Looper,rect,board
From: https://blog.51cto.com/u_16163453/6534413

相关文章

  • Flutter 学习 之 权限管理 permission_handler 9.2.0
    官方文档地址permission_handler控制台打印提示信息的时候可能会有两种(我遇到的)Noandroidspecificpermissionsneededfor:9可能表示你当前申请的权限你的系统不支持就是备注里nothing的Noandroidspecificpermissionsneededfor:[]9可能表示你没在AndroidM......
  • Android Handler消息机制详解
    在Android中,只有主线程才能更新UI,但是主线程不能进行耗时操作,否则会产生ANR异常,所以常常把耗时操作放到其他子线程进行。如果在子线程中需要更新UI,一般都是通过Handler发送消息,主线接收消息后进行相应的UI逻辑处理。一.什么是HandlerHandler是一个消息分发对象。Handler是Andr......
  • Android面试题:Handler、Binder、AMS、WMS面试必问题(带答案,万字总结,精心打磨,快收藏)
    前言业内一直有一个说法:技术好的未必底层够硬,但底层扎实的学起来进步如飞。这也是为什么如今的大厂都非常注重对底层原理的考察:除了可以看出面试者的即战力,底层原理更能看出一个开发者的发展潜力。大家对此应该也深有感受,在面试的过程中,底层原理是无论如何都躲不过去的一关。最典型......
  • win7 下安装 Microsoft Web Application Stress Tool
    MicrosoftWebApplicationStressToolMicrosoftWebApplicationStressTool能有效测试一个网站的负载性能,这个软件可以通过脚本模拟100个强并发用户的访问,并模拟实际用户的一些点击操作,WAS还可以连接上远程Windows网站服务器的性能计数器(PerformanceCounter),通过对服务器性能(C......
  • Vue / uniapp cart.js购物车
     constcart={namespaced:true,state:{//{"store_id":"","goods_id":"","goods_name":"","goods_price":"","goods_count":"","......
  • 广州app开发公司哪家比较好呢?
    广州作为中国乃至全球的科技创新中心,拥有众多优秀的科技企业和技术人才。在这个蓬勃发展的创业环境中,有许多优秀的app开发公司涌现出来。那么,在众多选择中,广州的app开发公司哪家比较好呢?以下是一些在选择时可以考虑的因素:1.专业经验和技术实力:一家优秀的APP开发公司应该具备丰富的......
  • ApplicationContext applicationContext 上下文 ApplicationListener
    ApplicationContextAware实现类在应用启动的时候就会初始化  对于ApplicationReadyEvent,官网的解释是:事件尽可能晚发布,以指示应用程序已准备好为请求提供服务。该事件的来源是SpringApplication本身,但要注意修改其内部状态,因为届时所有初始化步骤都将完成。顾名思义就是SpringA......
  • Xcode 14.3.1 (14E300c) 下载 - Apple 平台 IDE
    Xcode14.3.1(14E300c)下载-Apple平台IDECommandLineToolsforXcode14,tvOS16&watchOS9SimulatorRuntime请访问原文链接:https://sysin.org/blog/apple-xcode-14/,查看最新版。原创作品,转载请保留出处。作者主页:sysin.orgXcode14包含了在所有Apple平台上......
  • 直播开发app,css 自定义滚动条样式
    直播开发app,css自定义滚动条样式<divclass="content-wrap">  <div>    内容XXXX  </div> </div>  <style> //content-wrap样式.content-wrap{  flex:1;  overflow-y:scroll;  box-sizing:border-box;  padding:010px;  ......
  • app直播源代码,Android中点击图片放大的简单方法
    app直播源代码,Android中点击图片放大的简单方法Java代码: publicvoidonThumbnailClick(Viewv){//finalAlertDialogdialog=newAlertDialog.Builder(this).create();//ImageViewimgView=getView();//dialog.setView(imgView);//dialog.show();  //全屏显示的......