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横屏截图的正确姿势
牙叔教程 简单易懂
2775 0
|
Android开发
autojs修改悬浮窗按钮点击事件
牙叔教程 简单易懂
1278 0
|
Android开发
Android笔记--自定义控件仿遥控器的圆形上下左右OK圆盘按钮
原文:Android笔记--自定义控件仿遥控器的圆形上下左右OK圆盘按钮 上面就是几张预览图!代码在最底下 主要就两个步骤,画图、监听点击 1、整个控件基本上是一步步画出来的,重写onDraw方法开始for循环画扇形出来,画扇形的时候同时画扇形内的图标,扇形画完了之后画中心圆按钮,中心画了圆之后吧OK按钮画上。
2928 0
|
2月前
|
监控 JavaScript 前端开发
autojs,监控屏幕以及获取所有应用
autojs,监控屏幕以及获取所有应用
|
iOS开发
iOS 常用的 上下左右 拉刷新控件
iOS 常用的 上下左右 拉刷新控件
105 0
|
监控 Android开发 iOS开发
Android6.0 源码修改之 仿IOS添加全屏可拖拽浮窗返回按钮
Android6.0 源码修改之 仿IOS添加全屏可拖拽浮窗返回按钮
147 0
|
iOS开发
iOS开发- 分屏动画
iOS开发- 分屏动画
138 0
iOS开发- 分屏动画
|
iOS开发
IOS手势操作:点击+滑动
IOS手势操作:点击+滑动
186 0
|
Android开发
autojs状态栏歌词
牙叔教程 简单易懂
277 0
|
缓存 Android开发
autojs放大镜
autojs放大镜
293 0