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横屏截图的正确姿势
牙叔教程 简单易懂
2306 0
|
Android开发
Android笔记--自定义控件仿遥控器的圆形上下左右OK圆盘按钮
原文:Android笔记--自定义控件仿遥控器的圆形上下左右OK圆盘按钮 上面就是几张预览图!代码在最底下 主要就两个步骤,画图、监听点击 1、整个控件基本上是一步步画出来的,重写onDraw方法开始for循环画扇形出来,画扇形的时候同时画扇形内的图标,扇形画完了之后画中心圆按钮,中心画了圆之后吧OK按钮画上。
2788 0
|
8月前
|
Swift iOS开发
iOS PhotoBrowser 横竖屏图片浏览器
iOS PhotoBrowser 横竖屏图片浏览器
103 0
|
9月前
|
XML 前端开发 Java
Android实现一个可拖拽带有坐标尺的进度条
Canvas绘制这样的一个可拖拽坐标尺,基本上可以拆分出四部分,第一部分就是背景和默认的离散间隔,第二部分是移动的背景和离散间隔,第三部分是移动的图片也就是thumb,最后一部分是底部的文字坐标。
|
监控 Android开发 iOS开发
Android6.0 源码修改之 仿IOS添加全屏可拖拽浮窗返回按钮
Android6.0 源码修改之 仿IOS添加全屏可拖拽浮窗返回按钮
104 0
|
iOS开发
iOS开发- 分屏动画
iOS开发- 分屏动画
103 0
iOS开发- 分屏动画
|
iOS开发
IOS手势操作:点击+滑动
IOS手势操作:点击+滑动
149 0
|
Android开发
解决Android WebVIew中视频播放前出现的灰色三角形播放图标
最近在开发中,发现WebView中播放视频时,会出现灰色的播放图标,如图:
413 0
|
Android开发
autojs状态栏歌词
牙叔教程 简单易懂
222 0
|
缓存 Android开发
autojs放大镜
autojs放大镜
241 0