autojs之悬浮窗, 给我待在屏幕里面

简介: 使用场景:令悬浮窗始终在屏幕之内

使用场景:


令悬浮窗始终在屏幕之内


原理


setOnTouchListener 中, 监听悬浮窗坐标,


如果超出屏幕, 就把悬浮窗坐标设置为屏幕边缘


代码讲解


  1. 悬浮窗布局
var window = floaty.rawWindow(
  <frame gravity="center" bg="#ff00ff">
    <button id="action" w="300dp" h="300dp">
      按钮
    </button>
  </frame>
);


  1. 保持悬浮窗不被关闭
ui.post(function () {
  windowWidth = window.getWidth();
  windowHeight = window.getHeight();
}, 1000);


  1. 触摸监听
window.action.setOnTouchListener


  1. 触摸监听有三种情况:
  1. ACTION_DOWN
  2. ACTION_MOVE
  3. ACTION_UP


我们主要处理 ACTION_MOVE


ACTION_MOVE


  1. 坐标系有两个轴: x, y
  2. 悬浮窗在x轴上有以下情形
  1. 悬浮窗x < 0
  2. 0 < 悬浮窗x < 设备宽度
  3. 悬浮窗x > 设备宽度
  1. 悬浮窗在y轴上与x轴情况类似
  2. 所以我们一共有 3 * 3 = 9 种情况


超出屏幕的悬浮窗

微信图片_20220624130601.jpg


几个坐标的意义

微信图片_20220624130601.jpg


关键理解: 预测未来


  1. 我们判断悬浮窗超出屏幕之外, 是去计算当前的悬浮窗, 如果移动了某段距离,
    那么, 未来这个悬浮窗的某个部分, 就可能超出屏幕之外, 我们就看不见一个完整的悬浮窗了
  2. 我们要计算的是, (当前悬浮窗坐标 + 未来移动的距离)  是否 超出屏幕边缘
  3. 如果未来悬浮窗的坐标超出屏幕边缘, 我们就将悬浮窗置于屏幕边缘


关键代码

let xAxisMovingDistance = event.getRawX() - x;
let yAxisMovingDistance = event.getRawY() - y;
if (windowX + xAxisMovingDistance < 0) {
  if (windowY + yAxisMovingDistance < 0) {
    window.setPosition(0, 0);
  } else if (windowY + windowHeight + yAxisMovingDistance > device.height) {
    window.setPosition(0, device.height - windowHeight);
  } else {
    window.setPosition(0, windowY + yAxisMovingDistance);
  }
} else if (windowX + xAxisMovingDistance > device.width - windowWidth) {
  if (windowY + yAxisMovingDistance < 0) {
    window.setPosition(device.width - windowWidth, 0);
  } else if (windowY + windowHeight + yAxisMovingDistance > device.height) {
    window.setPosition(device.width - windowWidth, device.height - windowHeight);
  } else {
    window.setPosition(device.width - windowWidth, windowY + yAxisMovingDistance);
  }
} else {
  if (windowY + yAxisMovingDistance < 0) {
    window.setPosition(windowX + xAxisMovingDistance, 0);
  } else if (windowY + windowHeight + yAxisMovingDistance > device.height) {
    window.setPosition(windowX + xAxisMovingDistance, device.height - windowHeight);
  } else {
    window.setPosition(windowX + xAxisMovingDistance, windowY + yAxisMovingDistance);
  }
}


相关文章
|
Android开发
autojs修改悬浮窗按钮点击事件
牙叔教程 简单易懂
1813 0
|
人工智能 前端开发 Java
autojs非常见函数1
牙叔教程 简单易懂
2613 0
|
XML Android开发 数据格式
android点击FrameLayout、LinearLayout等父布局没响应的原因以及解决方案
android点击FrameLayout、LinearLayout等父布局没响应的原因以及解决方案
433 2
|
Android开发
Autox.js 脚本开发环境搭建,从案例到打包apk(详细流程)
Autox.js 脚本开发环境搭建,从案例到打包apk(详细流程)
4448 0
autojs之停用音量上停止脚本
autojs 8.7.1自带示例中提供了某些开关
2456 0
|
Android开发
autojs无Root访问data目录实现
牙叔教程 简单易懂
3517 0
|
Android开发
autojs之保活
autojs打包的app经常在后台被杀,请做到以下几点来保活: autojs版本号
2733 0
autojs之保活
|
Android开发
autojs用ConnectivityManager实现网络监听
autojs用ConnectivityManager实现网络监听
1536 0
|
7月前
|
安全 数据安全/隐私保护
屏幕自动点击器, 手机自动点击器, 自动连点器屏幕【autojs】
完整UI界面:包含悬浮窗控制面板,支持拖动位置调整 核心功能:单点/连续点击、位置记录、任务执行与停止
|
8月前
|
存储
小红书关注收藏点赞脚本,全自动稳定框架插件,autojs完整源码分享
其实这个源码你如果运行的他,他可以跟你跑几天几夜不休息的,因为我自己试过了,他真的是能稳定的进行运