# floating-window-in-screen
**Repository Path**: yashujs/floating-window-in-screen
## Basic Information
- **Project Name**: floating-window-in-screen
- **Description**: No description available
- **Primary Language**: Unknown
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 1
- **Forks**: 0
- **Created**: 2021-02-18
- **Last Updated**: 2021-07-05
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
[toc]
---
# autojs之悬浮窗, 给我待在屏幕里面
## 使用场景:
令悬浮窗始终在屏幕之内
## 原理
在 `setOnTouchListener` 中, 监听悬浮窗坐标,
如果超出屏幕, 就把悬浮窗坐标设置为屏幕边缘
## 代码讲解
1. 悬浮窗布局
```js
var window = floaty.rawWindow(
);
```
2. 保持悬浮窗不被关闭
```js
setInterval(() => {}, 1000);
```
3. 布局完成以后, 获取悬浮窗宽高
```js
ui.post(function () {
windowWidth = window.getWidth();
windowHeight = window.getHeight();
}, 1000);
```
4. 触摸监听
```js
window.action.setOnTouchListener
```
触摸监听有三种情况:
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 > 设备宽度
3. 悬浮窗在y轴上与x轴情况类似
4. 所以我们一共有 3 * 3 = 9 种情况
## 超出屏幕的悬浮窗
## 几个坐标的意义

## 关键理解: 预测未来
1. 我们判断悬浮窗超出屏幕之外, 是去计算当前的悬浮窗, 如果移动了某段距离,
那么, 未来这个悬浮窗的某个部分, 就可能超出屏幕之外, 我们就看不见一个完整的悬浮窗了
2. 我们要计算的是, (当前悬浮窗坐标 + 未来移动的距离) 是否 超出屏幕边缘
3. 如果未来悬浮窗的坐标超出屏幕边缘, 我们就将悬浮窗置于屏幕边缘
## 关键代码
```js
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);
}
}
```
---
## 微信公众号 AutoJsPro教程

### QQ群
747748653