Compare commits
2 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
80a240cbd4 | ||
|
|
af8e62fc36 |
6
BUILD.md
6
BUILD.md
@@ -254,10 +254,10 @@ You can then [run](README.md#run) _scrcpy_.
|
||||
|
||||
## Prebuilt server
|
||||
|
||||
- [`scrcpy-server-v1.16`][direct-scrcpy-server]
|
||||
_(SHA-256: 94a79e05b4498d0460ab7bd9d12cbf05156e3a47bf0c5d1420cee1d4493b3832)_
|
||||
- [`scrcpy-server-v1.15.1`][direct-scrcpy-server]
|
||||
_(SHA-256: fe06bd6a30da8c89860bf5e16eecce2b5054d4644c84289670ce00ca5d1637c3)_
|
||||
|
||||
[direct-scrcpy-server]: https://github.com/Genymobile/scrcpy/releases/download/v1.16/scrcpy-server-v1.16
|
||||
[direct-scrcpy-server]: https://github.com/Genymobile/scrcpy/releases/download/v1.15.1/scrcpy-server-v1.15.1
|
||||
|
||||
Download the prebuilt server somewhere, and specify its path during the Meson
|
||||
configuration:
|
||||
|
||||
2
FAQ.md
2
FAQ.md
@@ -37,8 +37,6 @@ Check [stackoverflow][device-unauthorized].
|
||||
|
||||
### Device not detected
|
||||
|
||||
> adb: error: failed to get feature set: no devices/emulators found
|
||||
|
||||
If your device is not detected, you may need some [drivers] (on Windows).
|
||||
|
||||
[drivers]: https://developer.android.com/studio/run/oem-usb.html
|
||||
|
||||
41
README.md
41
README.md
@@ -1,6 +1,4 @@
|
||||
# scrcpy (v1.16)
|
||||
|
||||
[Read in another language](#translations)
|
||||
# scrcpy (v1.15.1)
|
||||
|
||||
This application provides display and control of Android devices connected on
|
||||
USB (or [over TCP/IP][article-tcpip]). It does not require any _root_ access.
|
||||
@@ -77,10 +75,10 @@ hard).
|
||||
For Windows, for simplicity, a prebuilt archive with all the dependencies
|
||||
(including `adb`) is available:
|
||||
|
||||
- [`scrcpy-win64-v1.16.zip`][direct-win64]
|
||||
_(SHA-256: 3f30dc5db1a2f95c2b40a0f5de91ec1642d9f53799250a8c529bc882bc0918f0)_
|
||||
- [`scrcpy-win64-v1.15.1.zip`][direct-win64]
|
||||
_(SHA-256: 78fba4caad6328016ea93219254b5df391f24224c519a2c8e3f070695b8b38ff)_
|
||||
|
||||
[direct-win64]: https://github.com/Genymobile/scrcpy/releases/download/v1.16/scrcpy-win64-v1.16.zip
|
||||
[direct-win64]: https://github.com/Genymobile/scrcpy/releases/download/v1.15.1/scrcpy-win64-v1.15.1.zip
|
||||
|
||||
It is also available in [Chocolatey]:
|
||||
|
||||
@@ -382,9 +380,9 @@ The rotation can also be changed dynamically with <kbd>MOD</kbd>+<kbd>←</kbd>
|
||||
_(left)_ and <kbd>MOD</kbd>+<kbd>→</kbd> _(right)_.
|
||||
|
||||
Note that _scrcpy_ manages 3 different rotations:
|
||||
- <kbd>MOD</kbd>+<kbd>r</kbd> requests the device to switch between portrait
|
||||
and landscape (the current running app may refuse, if it does support the
|
||||
requested orientation).
|
||||
- <kbd>MOD</kbd>+<kbd>r</kbd> requests the device to switch between portrait and
|
||||
landscape (the current running app may refuse, if it does support the
|
||||
requested orientation).
|
||||
- `--lock-video-orientation` changes the mirroring orientation (the orientation
|
||||
of the video sent from the device to the computer). This affects the
|
||||
recording.
|
||||
@@ -548,19 +546,6 @@ into the device clipboard. As a consequence, any Android application could read
|
||||
its content. You should avoid to paste sensitive content (like passwords) that
|
||||
way.
|
||||
|
||||
|
||||
#### Pinch-to-zoom
|
||||
|
||||
To simulate "pinch-to-zoom": <kbd>Ctrl</kbd>+_click-and-move_.
|
||||
|
||||
More precisely, hold <kbd>Ctrl</kbd> while pressing the left-click button. Until
|
||||
the left-click button is released, all mouse movements scale and rotate the
|
||||
content (if supported by the app) relative to the center of the screen.
|
||||
|
||||
Concretely, scrcpy generates additional touch events from a "virtual finger" at
|
||||
a location inverted through the center of the screen.
|
||||
|
||||
|
||||
#### Text injection preference
|
||||
|
||||
There are two kinds of [events][textevents] generated when typing text:
|
||||
@@ -674,7 +659,6 @@ _<kbd>[Super]</kbd> is typically the <kbd>Windows</kbd> or <kbd>Cmd</kbd> key._
|
||||
| Synchronize clipboards and paste³ | <kbd>MOD</kbd>+<kbd>v</kbd>
|
||||
| Inject computer clipboard text | <kbd>MOD</kbd>+<kbd>Shift</kbd>+<kbd>v</kbd>
|
||||
| Enable/disable FPS counter (on stdout) | <kbd>MOD</kbd>+<kbd>i</kbd>
|
||||
| Pinch-to-zoom | <kbd>Ctrl</kbd>+_click-and-move_
|
||||
|
||||
_¹Double-click on black borders to remove them._
|
||||
_²Right-click turns the screen on if it was off, presses BACK otherwise._
|
||||
@@ -750,14 +734,3 @@ Read the [developers page].
|
||||
|
||||
[article-intro]: https://blog.rom1v.com/2018/03/introducing-scrcpy/
|
||||
[article-tcpip]: https://www.genymotion.com/blog/open-source-project-scrcpy-now-works-wirelessly/
|
||||
|
||||
## Translations
|
||||
|
||||
This README is available in other languages:
|
||||
|
||||
- [한국어 (Korean, `ko`) - v1.11](README.ko.md)
|
||||
- [português brasileiro (Brazilian Portuguese, `pt-BR`) - v1.12.1](README.pt-br.md)
|
||||
- [简体中文 (Simplified Chinese, `zh-Hans`) - v1.16](README.zh-Hans.md)
|
||||
- [繁體中文 (Traditional Chinese, `zh-Hant`) - v1.15](README.zh-Hant.md)
|
||||
|
||||
Only this README file is guaranteed to be up-to-date.
|
||||
|
||||
@@ -1,726 +0,0 @@
|
||||
_Only the original [README](README.md) is guaranteed to be up-to-date._
|
||||
|
||||
只有原版的[README](README.md)会保持最新。
|
||||
|
||||
本文根据[479d10d]进行翻译。
|
||||
|
||||
[479d10d]: https://github.com/Genymobile/scrcpy/commit/479d10dc22b70272187e0963c6ad24d754a669a2#diff-04c6e90faac2675aa89e2176d2eec7d8
|
||||
|
||||
|
||||
|
||||
# scrcpy (v1.16)
|
||||
|
||||
本应用程序可以通过USB(或 [TCP/IP][article-tcpip] )连接用于显示或控制安卓设备。这不需要获取 _root_ 权限。
|
||||
|
||||
该应用程序可以在 _GNU/Linux_, _Windows_ 和 _macOS_ 环境下运行。
|
||||
|
||||
[article-tcpip]:https://www.genymotion.com/blog/open-source-project-scrcpy-now-works-wirelessly/
|
||||
|
||||

|
||||
|
||||
它专注于:
|
||||
|
||||
- **轻量** (原生,仅显示设备屏幕)
|
||||
- **性能** (30~60fps)
|
||||
- **质量** (分辨率可达1920x1080或更高)
|
||||
- **低延迟** (35-70ms)
|
||||
- **快速启动** (数秒内即能开始显示)
|
||||
- **无侵入性** (不需要在安卓设备上安装任何程序)
|
||||
|
||||
|
||||
## 使用要求
|
||||
|
||||
安卓设备系统版本需要在Android 5.0(API 21)或以上。
|
||||
|
||||
确保您在设备上开启了[adb调试]。
|
||||
|
||||
[adb调试]: https://developer.android.com/studio/command-line/adb.html#Enabling
|
||||
|
||||
在某些设备上,你还需要开启[额外的选项]以用鼠标和键盘进行控制。
|
||||
|
||||
[额外的选项]: https://github.com/Genymobile/scrcpy/issues/70#issuecomment-373286323
|
||||
|
||||
|
||||
## 获取scrcpy
|
||||
|
||||
<a href="https://repology.org/project/scrcpy/versions"><img src="https://repology.org/badge/vertical-allrepos/scrcpy.svg" alt="Packaging status" align="right"></a>
|
||||
|
||||
### Linux
|
||||
|
||||
在Debian(目前仅测试版和不稳定版,即 _testing_ 和 _sid_ 版本)和Ubuntu (20.04)上:
|
||||
|
||||
```
|
||||
apt install scrcpy
|
||||
```
|
||||
|
||||
[Snap]包也是可用的: [`scrcpy`][snap-link].
|
||||
|
||||
[snap-link]: https://snapstats.org/snaps/scrcpy
|
||||
|
||||
[snap]: https://en.wikipedia.org/wiki/Snappy_(package_manager)
|
||||
|
||||
对于Fedora用户,我们提供[COPR]包: [`scrcpy`][copr-link].
|
||||
|
||||
[COPR]: https://fedoraproject.org/wiki/Category:Copr
|
||||
[copr-link]: https://copr.fedorainfracloud.org/coprs/zeno/scrcpy/
|
||||
|
||||
对于Arch Linux用户,我们提供[AUR]包: [`scrcpy`][aur-link].
|
||||
|
||||
[AUR]: https://wiki.archlinux.org/index.php/Arch_User_Repository
|
||||
[aur-link]: https://aur.archlinux.org/packages/scrcpy/
|
||||
|
||||
对于Gentoo用户,我们提供[Ebuild]包:[`scrcpy/`][ebuild-link].
|
||||
|
||||
[Ebuild]: https://wiki.gentoo.org/wiki/Ebuild
|
||||
[ebuild-link]: https://github.com/maggu2810/maggu2810-overlay/tree/master/app-mobilephone/scrcpy
|
||||
|
||||
您也可以[自行编译][编译](不必担心,这并不困难)。
|
||||
|
||||
|
||||
|
||||
### Windows
|
||||
|
||||
在Windows上,简便起见,我们准备了包含所有依赖项(包括adb)的程序包。
|
||||
|
||||
- [`scrcpy-win64-v1.16.zip`][direct-win64]
|
||||
_(SHA-256: 3f30dc5db1a2f95c2b40a0f5de91ec1642d9f53799250a8c529bc882bc0918f0)_
|
||||
|
||||
[direct-win64]: https://github.com/Genymobile/scrcpy/releases/download/v1.16/scrcpy-win64-v1.16.zip
|
||||
|
||||
您也可以在[Chocolatey]下载:
|
||||
|
||||
[Chocolatey]: https://chocolatey.org/
|
||||
|
||||
```bash
|
||||
choco install scrcpy
|
||||
choco install adb # 如果你没有adb
|
||||
```
|
||||
|
||||
也可以使用 [Scoop]:
|
||||
|
||||
```bash
|
||||
scoop install scrcpy
|
||||
scoop install adb # 如果你没有adb
|
||||
```
|
||||
|
||||
[Scoop]: https://scoop.sh
|
||||
|
||||
您也可以[自行编译][编译]。
|
||||
|
||||
|
||||
### macOS
|
||||
|
||||
您可以使用[Homebrew]下载scrcpy。直接安装就可以了:
|
||||
|
||||
[Homebrew]: https://brew.sh/
|
||||
|
||||
```bash
|
||||
brew install scrcpy
|
||||
```
|
||||
|
||||
您需要 `adb`以使用scrcpy,并且它需要可以通过 `PATH`被访问。如果您没有:
|
||||
|
||||
```bash
|
||||
brew cask install android-platform-tools
|
||||
```
|
||||
|
||||
您也可以[自行编译][编译]。
|
||||
|
||||
|
||||
## 运行scrcpy
|
||||
|
||||
用USB链接电脑和安卓设备,并执行:
|
||||
|
||||
```bash
|
||||
scrcpy
|
||||
```
|
||||
|
||||
支持带命令行参数执行,查看参数列表:
|
||||
|
||||
```bash
|
||||
scrcpy --help
|
||||
```
|
||||
|
||||
## 功能介绍
|
||||
|
||||
### 画面设置
|
||||
|
||||
#### 缩小分辨率
|
||||
|
||||
有时候,将设备屏幕镜像分辨率降低可以有效地提升性能。
|
||||
|
||||
我们可以将高度和宽度都限制在一定大小内(如 1024):
|
||||
|
||||
```bash
|
||||
scrcpy --max-size 1024
|
||||
scrcpy -m 1024 # short version
|
||||
```
|
||||
|
||||
较短的一边会被按比例缩小以保持设备的显示比例。
|
||||
这样,1920x1080 的设备会以 1024x576 的分辨率显示。
|
||||
|
||||
|
||||
#### 修改画面比特率
|
||||
|
||||
默认的比特率是8Mbps。如果要改变画面的比特率 (比如说改成2Mbps):
|
||||
|
||||
```bash
|
||||
scrcpy --bit-rate 2M
|
||||
scrcpy -b 2M # short version
|
||||
```
|
||||
|
||||
#### 限制画面帧率
|
||||
|
||||
画面的帧率可以通过下面的命令被限制:
|
||||
|
||||
```bash
|
||||
scrcpy --max-fps 15
|
||||
```
|
||||
|
||||
这个功能仅在Android 10和以后的版本被Android官方支持,但也有可能在更早的版本可用。
|
||||
|
||||
#### 画面裁剪
|
||||
|
||||
设备画面可在裁切后进行镜像,以显示部分屏幕。
|
||||
|
||||
这项功能可以用于,例如,只显示Oculus Go的一只眼睛。
|
||||
|
||||
```bash
|
||||
scrcpy --crop 1224:1440:0:0 # 1224x1440 at offset (0,0)
|
||||
```
|
||||
|
||||
如果`--max-size`在同时被指定,分辨率的改变将在画面裁切后进行。
|
||||
|
||||
|
||||
#### 锁定屏幕朝向
|
||||
|
||||
|
||||
可以使用如下命令锁定屏幕朝向:
|
||||
|
||||
```bash
|
||||
scrcpy --lock-video-orientation 0 # 自然朝向
|
||||
scrcpy --lock-video-orientation 1 # 90° 逆时针旋转
|
||||
scrcpy --lock-video-orientation 2 # 180°
|
||||
scrcpy --lock-video-orientation 3 # 90° 顺时针旋转
|
||||
```
|
||||
|
||||
该设定影响录制。
|
||||
|
||||
|
||||
### 屏幕录制
|
||||
|
||||
可以在屏幕镜像的同时录制视频:
|
||||
|
||||
```bash
|
||||
scrcpy --record file.mp4
|
||||
scrcpy -r file.mkv
|
||||
```
|
||||
|
||||
在不开启屏幕镜像的同时录制:
|
||||
|
||||
```bash
|
||||
scrcpy --no-display --record file.mp4
|
||||
scrcpy -Nr file.mkv
|
||||
# 按Ctrl+C以停止录制
|
||||
```
|
||||
|
||||
在显示中“被跳过的帧”会被录制,虽然它们由于性能原因没有实时显示。
|
||||
在传输中每一帧都有 _时间戳_ ,所以 [包时延变化] 并不影响录制的文件。
|
||||
|
||||
[包时延变化]: https://en.wikipedia.org/wiki/Packet_delay_variation
|
||||
|
||||
|
||||
### 连接方式
|
||||
|
||||
#### 无线
|
||||
|
||||
_Scrcpy_ 使用`adb`来与安卓设备连接。同时,`adb`能够通过TCP/IP[连接]到安卓设备:
|
||||
|
||||
1. 将您的安卓设备和电脑连接至同一Wi-Fi。
|
||||
2. 获取安卓设备的IP地址(在设置-关于手机-状态信息)。
|
||||
3. 打开安卓设备的网络adb功能`adb tcpip 5555`。
|
||||
4. 将您的设备与电脑断开连接。
|
||||
5. 连接到您的设备:`adb connect DEVICE_IP:5555` _(用设备IP替换 `DEVICE_IP`)_.
|
||||
6. 运行`scrcpy`。
|
||||
|
||||
降低比特率和分辨率可能有助于性能:
|
||||
|
||||
```bash
|
||||
scrcpy --bit-rate 2M --max-size 800
|
||||
scrcpy -b2M -m800 # short version
|
||||
```
|
||||
|
||||
[连接]: https://developer.android.com/studio/command-line/adb.html#wireless
|
||||
|
||||
|
||||
#### 多设备
|
||||
|
||||
如果多个设备在执行`adb devices`后被列出,您必须指定设备的 _序列号_ :
|
||||
|
||||
```bash
|
||||
scrcpy --serial 0123456789abcdef
|
||||
scrcpy -s 0123456789abcdef # short version
|
||||
```
|
||||
|
||||
如果设备是通过TCP/IP方式连接到电脑的:
|
||||
|
||||
```bash
|
||||
scrcpy --serial 192.168.0.1:5555
|
||||
scrcpy -s 192.168.0.1:5555 # short version
|
||||
```
|
||||
|
||||
您可以同时启动多个 _scrcpy_ 实例以同时显示多个设备的画面。
|
||||
|
||||
#### 在设备连接时自动启动
|
||||
|
||||
您可以使用 [AutoAdb]:
|
||||
|
||||
```bash
|
||||
autoadb scrcpy -s '{}'
|
||||
```
|
||||
|
||||
[AutoAdb]: https://github.com/rom1v/autoadb
|
||||
|
||||
#### SSH 连接
|
||||
|
||||
本地的 adb 可以远程连接到另一个 adb 服务器(假设两者的adb版本相同),来远程连接到设备:
|
||||
|
||||
```bash
|
||||
adb kill-server # 关闭本地5037端口上的adb服务器
|
||||
ssh -CN -L5037:localhost:5037 -R27183:localhost:27183 your_remote_computer
|
||||
# 保持该窗口开启
|
||||
```
|
||||
|
||||
从另一个终端:
|
||||
|
||||
```bash
|
||||
scrcpy
|
||||
```
|
||||
|
||||
为了避免启动远程端口转发,你可以强制启动一个转发连接(注意`-L`和`-R`的区别:
|
||||
|
||||
```bash
|
||||
adb kill-server # kill the local adb server on 5037
|
||||
ssh -CN -L5037:localhost:5037 -L27183:localhost:27183 your_remote_computer
|
||||
# 保持该窗口开启
|
||||
```
|
||||
|
||||
从另一个终端:
|
||||
|
||||
```bash
|
||||
scrcpy --force-adb-forward
|
||||
```
|
||||
|
||||
|
||||
和无线网络连接类似,下列设置可能对改善性能有帮助:
|
||||
|
||||
```
|
||||
scrcpy -b2M -m800 --max-fps 15
|
||||
```
|
||||
|
||||
### 窗口设置
|
||||
|
||||
#### 标题
|
||||
|
||||
窗口的标题默认为设备型号。您可以通过如下命令修改它:
|
||||
|
||||
```bash
|
||||
scrcpy --window-title 'My device'
|
||||
```
|
||||
|
||||
#### 位置和大小
|
||||
|
||||
您可以指定初始的窗口位置和大小:
|
||||
|
||||
```bash
|
||||
scrcpy --window-x 100 --window-y 100 --window-width 800 --window-height 600
|
||||
```
|
||||
|
||||
#### 无边框
|
||||
|
||||
关闭边框:
|
||||
|
||||
```bash
|
||||
scrcpy --window-borderless
|
||||
```
|
||||
|
||||
#### 保持窗口在最前
|
||||
|
||||
您可以通过如下命令保持窗口在最前面:
|
||||
|
||||
```bash
|
||||
scrcpy --always-on-top
|
||||
```
|
||||
|
||||
#### 全屏
|
||||
|
||||
您可以通过如下命令直接全屏启动scrcpy:
|
||||
|
||||
```bash
|
||||
scrcpy --fullscreen
|
||||
scrcpy -f # short version
|
||||
```
|
||||
|
||||
全屏状态可以通过<kbd>MOD</kbd>+<kbd>f</kbd>实时改变。
|
||||
|
||||
#### 旋转
|
||||
|
||||
通过如下命令,窗口可以旋转:
|
||||
|
||||
```bash
|
||||
scrcpy --rotation 1
|
||||
```
|
||||
|
||||
可选的值有:
|
||||
- `0`: 无旋转
|
||||
- `1`: 逆时针旋转90°
|
||||
- `2`: 旋转180°
|
||||
- `3`: 顺时针旋转90°
|
||||
|
||||
这同样可以使用<kbd>MOD</kbd>+<kbd>←</kbd>
|
||||
_(左)_ 和 <kbd>MOD</kbd>+<kbd>→</kbd> _(右)_ 的快捷键实时更改。
|
||||
|
||||
需要注意的是, _scrcpy_ 控制三个不同的朝向:
|
||||
- <kbd>MOD</kbd>+<kbd>r</kbd> 请求设备在竖屏和横屏之间切换(如果前台应用程序不支持所请求的朝向,可能会拒绝该请求)。
|
||||
|
||||
- `--lock-video-orientation` 改变镜像的朝向(设备镜像到电脑的画面朝向)。这会影响录制。
|
||||
|
||||
- `--rotation` (或<kbd>MOD</kbd>+<kbd>←</kbd>/<kbd>MOD</kbd>+<kbd>→</kbd>)
|
||||
只旋转窗口的画面。这只影响显示,不影响录制。
|
||||
|
||||
|
||||
### 其他镜像设置
|
||||
|
||||
#### 只读
|
||||
|
||||
关闭电脑对设备的控制(如键盘输入、鼠标移动和文件传输):
|
||||
|
||||
```bash
|
||||
scrcpy --no-control
|
||||
scrcpy -n
|
||||
```
|
||||
|
||||
#### 显示屏
|
||||
|
||||
如果有多个显示屏可用,您可以选择特定显示屏进行镜像:
|
||||
|
||||
```bash
|
||||
scrcpy --display 1
|
||||
```
|
||||
|
||||
您可以通过如下命令找到显示屏的id:
|
||||
|
||||
```
|
||||
adb shell dumpsys display # 在回显中搜索“mDisplayId=”
|
||||
```
|
||||
|
||||
第二显示屏可能只能在设备运行Android 10或以上的情况下被控制(它可能会在电脑上显示,但无法通过电脑操作)。
|
||||
|
||||
|
||||
#### 保持常亮
|
||||
|
||||
防止设备在已连接的状态下休眠:
|
||||
|
||||
```bash
|
||||
scrcpy --stay-awake
|
||||
scrcpy -w
|
||||
```
|
||||
|
||||
程序关闭后,设备设置会恢复原样。
|
||||
|
||||
|
||||
#### 关闭设备屏幕
|
||||
|
||||
在启动屏幕镜像时,可以通过如下命令关闭设备的屏幕:
|
||||
|
||||
```bash
|
||||
scrcpy --turn-screen-off
|
||||
scrcpy -S
|
||||
```
|
||||
|
||||
或者在需要的时候按<kbd>MOD</kbd>+<kbd>o</kbd>。
|
||||
|
||||
要重新打开屏幕的话,需要按<kbd>MOD</kbd>+<kbd>Shift</kbd>+<kbd>o</kbd>.
|
||||
|
||||
在Android上,`电源`按钮始终能把屏幕打开。
|
||||
|
||||
为了方便,如果按下`电源`按钮的事件是通过 _scrcpy_ 发出的(通过点按鼠标右键或<kbd>MOD</kbd>+<kbd>p</kbd>),它会在短暂的延迟后将屏幕关闭。
|
||||
|
||||
物理的`电源`按钮仍然能打开设备屏幕。
|
||||
|
||||
同时,这项功能还能被用于防止设备休眠:
|
||||
|
||||
```bash
|
||||
scrcpy --turn-screen-off --stay-awake
|
||||
scrcpy -Sw
|
||||
```
|
||||
|
||||
|
||||
#### 渲染超时帧
|
||||
|
||||
为了降低延迟, _scrcpy_ 默认渲染解码成功的最近一帧,并跳过前面任意帧。
|
||||
|
||||
强制渲染所有帧(可能导致延迟变高):
|
||||
|
||||
```bash
|
||||
scrcpy --render-expired-frames
|
||||
```
|
||||
|
||||
#### 显示触摸
|
||||
|
||||
在展示时,有些时候可能会用到显示触摸点这项功能(在设备上显示)。
|
||||
|
||||
Android在 _开发者设置_ 中提供了这项功能。
|
||||
|
||||
_Scrcpy_ 提供一个选项可以在启动时开启这项功能并在退出时恢复初始设置:
|
||||
|
||||
```bash
|
||||
scrcpy --show-touches
|
||||
scrcpy -t
|
||||
```
|
||||
|
||||
请注意这项功能只能显示 _物理_ 触摸(要用手在屏幕上触摸)。
|
||||
|
||||
|
||||
#### 关闭屏保
|
||||
|
||||
_Scrcpy_ 不会默认关闭屏幕保护。
|
||||
|
||||
关闭屏幕保护:
|
||||
|
||||
```bash
|
||||
scrcpy --disable-screensaver
|
||||
```
|
||||
|
||||
|
||||
### 输入控制
|
||||
|
||||
#### 旋转设备屏幕
|
||||
|
||||
使用<kbd>MOD</kbd>+<kbd>r</kbd>以在竖屏和横屏模式之间切换。
|
||||
|
||||
需要注意的是,只有在前台应用程序支持所要求的模式时,才会进行切换。
|
||||
|
||||
#### 复制黏贴
|
||||
|
||||
每次Android的剪贴板变化的时候,它都会被自动同步到电脑的剪贴板上。
|
||||
|
||||
所有的 <kbd>Ctrl</kbd> 快捷键都会被转发至设备。其中:
|
||||
- <kbd>Ctrl</kbd>+<kbd>c</kbd> 复制
|
||||
- <kbd>Ctrl</kbd>+<kbd>x</kbd> 剪切
|
||||
- <kbd>Ctrl</kbd>+<kbd>v</kbd> 黏贴 (在电脑到设备的剪贴板同步完成之后)
|
||||
|
||||
这通常如您所期望的那样运作。
|
||||
|
||||
但实际的行为取决于设备上的前台程序。
|
||||
例如 _Termux_ 在<kbd>Ctrl</kbd>+<kbd>c</kbd>被按下时发送 SIGINT,
|
||||
又如 _K-9 Mail_ 会新建一封新邮件。
|
||||
|
||||
在这种情况下剪切复制黏贴(仅在Android >= 7时可用):
|
||||
- <kbd>MOD</kbd>+<kbd>c</kbd> 注入 `COPY`(复制)
|
||||
- <kbd>MOD</kbd>+<kbd>x</kbd> 注入 `CUT`(剪切)
|
||||
- <kbd>MOD</kbd>+<kbd>v</kbd> 注入 `PASTE`(黏贴)(在电脑到设备的剪贴板同步完成之后)
|
||||
|
||||
另外,<kbd>MOD</kbd>+<kbd>Shift</kbd>+<kbd>v</kbd>可以将电脑的剪贴板内容转换为一串按键事件输入到设备。
|
||||
在应用程序不接受黏贴时(比如 _Termux_ ),这项功能可以排上一定的用场。
|
||||
需要注意的是,这项功能可能会导致非ASCII编码的内容出现错误。
|
||||
|
||||
**警告:** 将电脑剪贴板的内容黏贴至设备(无论是通过<kbd>Ctrl</kbd>+<kbd>v</kbd>还是<kbd>MOD</kbd>+<kbd>v</kbd>)
|
||||
都需要将内容保存至设备的剪贴板。如此,任何一个应用程序都可以读取它。
|
||||
您应当避免将敏感内容通过这种方式传输(如密码)。
|
||||
|
||||
|
||||
#### 捏拉缩放
|
||||
|
||||
模拟 “捏拉缩放”:<kbd>Ctrl</kbd>+_按住并移动鼠标_。
|
||||
|
||||
更准确的说,您需要在按住<kbd>Ctrl</kbd>的同时按住并移动鼠标。
|
||||
在鼠标左键松开之后,光标的任何操作都会相对于屏幕的中央进行。
|
||||
|
||||
具体来说, _scrcpy_ 使用“虚拟手指”以在相对于屏幕中央相反的位置产生触摸事件。
|
||||
|
||||
|
||||
#### 文字注入偏好
|
||||
|
||||
打字的时候,系统会产生两种[事件][textevents]:
|
||||
- _按键事件_ ,代表一个按键被按下/松开。
|
||||
- _文本事件_ ,代表一个文本被输入。
|
||||
|
||||
程序默认使用按键事件来输入字母。只有这样,键盘才会在游戏中正常运作(尤其WASD键)。
|
||||
|
||||
但这也有可能[造成问题][prefertext]。如果您遇到了这样的问题,您可以通过下列操作避免它:
|
||||
|
||||
```bash
|
||||
scrcpy --prefer-text
|
||||
```
|
||||
|
||||
(这会导致键盘在游戏中工作不正常)
|
||||
|
||||
[textevents]: https://blog.rom1v.com/2018/03/introducing-scrcpy/#handle-text-input
|
||||
[prefertext]: https://github.com/Genymobile/scrcpy/issues/650#issuecomment-512945343
|
||||
|
||||
|
||||
#### 按键重复
|
||||
|
||||
当你一直按着一个按键不放时,程序默认产生多个按键事件。
|
||||
在某些游戏中这可能会导致性能问题。
|
||||
|
||||
避免转发重复按键事件:
|
||||
|
||||
```bash
|
||||
scrcpy --no-key-repeat
|
||||
```
|
||||
|
||||
|
||||
### 文件传输
|
||||
|
||||
#### 安装APK
|
||||
|
||||
如果您要要安装APK,请拖放APK文件(文件名以`.apk`结尾)到 _scrcpy_ 窗口。
|
||||
|
||||
该操作在屏幕上不会出现任何变化,而会在控制台输出一条日志。
|
||||
|
||||
|
||||
#### 将文件推送至设备
|
||||
|
||||
如果您要推送文件到设备的 `/sdcard/`,请拖放文件至(不能是APK文件)_scrcpy_ 窗口。
|
||||
|
||||
该操作没有可见的响应,只会在控制台输出日志。
|
||||
|
||||
在启动时可以修改目标目录:
|
||||
|
||||
```bash
|
||||
scrcpy --push-target /sdcard/foo/bar/
|
||||
```
|
||||
|
||||
|
||||
### 音频转发
|
||||
|
||||
_scrcpy_ 不支持音频。请使用 [sndcpy].
|
||||
|
||||
另外请阅读 [issue #14]。
|
||||
|
||||
[sndcpy]: https://github.com/rom1v/sndcpy
|
||||
[issue #14]: https://github.com/Genymobile/scrcpy/issues/14
|
||||
|
||||
|
||||
## 热键
|
||||
|
||||
在下列表格中, <kbd>MOD</kbd> 是热键的修饰键。
|
||||
默认是(左)<kbd>Alt</kbd>或者(左)<kbd>Super</kbd>。
|
||||
|
||||
您可以使用 `--shortcut-mod`后缀来修改它。可选的按键有`lctrl`、`rctrl`、
|
||||
`lalt`、`ralt`、`lsuper`和`rsuper`。如下例:
|
||||
|
||||
```bash
|
||||
# 使用右侧的Ctrl键
|
||||
scrcpy --shortcut-mod=rctrl
|
||||
|
||||
# 使用左侧的Ctrl键、Alt键或Super键
|
||||
scrcpy --shortcut-mod=lctrl+lalt,lsuper
|
||||
```
|
||||
|
||||
_一般来说,<kbd>[Super]</kbd>就是<kbd>Windows</kbd>或者<kbd>Cmd</kbd>。_
|
||||
|
||||
[Super]: https://en.wikipedia.org/wiki/Super_key_(keyboard_button)
|
||||
|
||||
| 操作 | 快捷键
|
||||
| ------------------------------------------- |:-----------------------------
|
||||
| 全屏 | <kbd>MOD</kbd>+<kbd>f</kbd>
|
||||
| 向左旋转屏幕 | <kbd>MOD</kbd>+<kbd>←</kbd> _(左)_
|
||||
| 向右旋转屏幕 | <kbd>MOD</kbd>+<kbd>→</kbd> _(右)_
|
||||
| 将窗口大小重置为1:1 (像素优先) | <kbd>MOD</kbd>+<kbd>g</kbd>
|
||||
| 将窗口大小重置为消除黑边 | <kbd>MOD</kbd>+<kbd>w</kbd> \| _双击¹_
|
||||
| 点按 `主屏幕` | <kbd>MOD</kbd>+<kbd>h</kbd> \| _点击鼠标中键_
|
||||
| 点按 `返回` | <kbd>MOD</kbd>+<kbd>b</kbd> \| _点击鼠标右键²_
|
||||
| 点按 `切换应用` | <kbd>MOD</kbd>+<kbd>s</kbd>
|
||||
| 点按 `菜单` (解锁屏幕) | <kbd>MOD</kbd>+<kbd>m</kbd>
|
||||
| 点按 `音量+` | <kbd>MOD</kbd>+<kbd>↑</kbd> _(up)_
|
||||
| 点按 `音量-` | <kbd>MOD</kbd>+<kbd>↓</kbd> _(down)_
|
||||
| 点按 `电源` | <kbd>MOD</kbd>+<kbd>p</kbd>
|
||||
| 打开屏幕 | _点击鼠标右键²_
|
||||
| 关闭设备屏幕(但继续在电脑上显示) | <kbd>MOD</kbd>+<kbd>o</kbd>
|
||||
| 打开设备屏幕 | <kbd>MOD</kbd>+<kbd>Shift</kbd>+<kbd>o</kbd>
|
||||
| 旋转设备屏幕 | <kbd>MOD</kbd>+<kbd>r</kbd>
|
||||
| 展开通知面板 | <kbd>MOD</kbd>+<kbd>n</kbd>
|
||||
| 展开快捷操作 | <kbd>MOD</kbd>+<kbd>Shift</kbd>+<kbd>n</kbd>
|
||||
| 复制到剪贴板³ | <kbd>MOD</kbd>+<kbd>c</kbd>
|
||||
| 剪切到剪贴板³ | <kbd>MOD</kbd>+<kbd>x</kbd>
|
||||
| 同步剪贴板并黏贴³ | <kbd>MOD</kbd>+<kbd>v</kbd>
|
||||
| 导入电脑剪贴板文本 | <kbd>MOD</kbd>+<kbd>Shift</kbd>+<kbd>v</kbd>
|
||||
| 打开/关闭FPS显示(在 stdout) | <kbd>MOD</kbd>+<kbd>i</kbd>
|
||||
| 捏拉缩放 | <kbd>Ctrl</kbd>+_点按并移动鼠标_
|
||||
|
||||
_¹双击黑色边界以关闭黑色边界_
|
||||
_²点击鼠标右键将在屏幕熄灭时点亮屏幕,其余情况则视为按下 返回键 。_
|
||||
_³需要安卓版本 Android >= 7。_
|
||||
|
||||
所有的 <kbd>Ctrl</kbd>+_按键_ 的热键都是被转发到设备进行处理的,所以实际上会由当前应用程序对其做出响应。
|
||||
|
||||
|
||||
## 自定义路径
|
||||
|
||||
为了使用您想使用的 _adb_ ,您可以在环境变量
|
||||
`ADB`中设置它的路径:
|
||||
|
||||
ADB=/path/to/adb scrcpy
|
||||
|
||||
如果需要覆盖`scrcpy-server`的路径,您可以在
|
||||
`SCRCPY_SERVER_PATH`中设置它。
|
||||
|
||||
[useful]: https://github.com/Genymobile/scrcpy/issues/278#issuecomment-429330345
|
||||
|
||||
|
||||
## 为什么叫 _scrcpy_ ?
|
||||
|
||||
一个同事让我找出一个和[gnirehtet]一样难以发音的名字。
|
||||
|
||||
[`strcpy`] 可以复制**str**ing; `scrcpy` 可以复制**scr**een。
|
||||
|
||||
[gnirehtet]: https://github.com/Genymobile/gnirehtet
|
||||
[`strcpy`]: http://man7.org/linux/man-pages/man3/strcpy.3.html
|
||||
|
||||
|
||||
## 如何编译?
|
||||
|
||||
请查看[编译]。
|
||||
|
||||
[编译]: BUILD.md
|
||||
|
||||
|
||||
## 常见问题
|
||||
|
||||
请查看[FAQ](FAQ.md).
|
||||
|
||||
|
||||
## 开发者
|
||||
|
||||
请查看[开发者页面]。
|
||||
|
||||
[开发者页面]: DEVELOP.md
|
||||
|
||||
|
||||
## 许可协议
|
||||
|
||||
Copyright (C) 2018 Genymobile
|
||||
Copyright (C) 2018-2020 Romain Vimont
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
|
||||
## 相关文章
|
||||
|
||||
- [Introducing scrcpy][article-intro]
|
||||
- [Scrcpy now works wirelessly][article-tcpip]
|
||||
|
||||
[article-intro]: https://blog.rom1v.com/2018/03/introducing-scrcpy/
|
||||
[article-tcpip]: https://www.genymotion.com/blog/open-source-project-scrcpy-now-works-wirelessly/
|
||||
@@ -1,705 +0,0 @@
|
||||
_Only the original [README](README.md) is guaranteed to be up-to-date._
|
||||
|
||||
_只有原版的 [README](README.md)是保證最新的。_
|
||||
|
||||
|
||||
本文件翻譯時點: [521f2fe](https://github.com/Genymobile/scrcpy/commit/521f2fe994019065e938aa1a54b56b4f10a4ac4a#diff-04c6e90faac2675aa89e2176d2eec7d8)
|
||||
|
||||
|
||||
# scrcpy (v1.15)
|
||||
|
||||
Scrcpy 可以透過 USB、或是 [TCP/IP][article-tcpip] 來顯示或控制 Android 裝置。且 scrcpy 不需要 _root_ 權限。
|
||||
|
||||
Scrcpy 目前支援 _GNU/Linux_、_Windows_ 和 _macOS_。
|
||||
|
||||

|
||||
|
||||
特色:
|
||||
|
||||
- **輕量** (只顯示裝置螢幕)
|
||||
- **效能** (30~60fps)
|
||||
- **品質** (1920×1080 或更高)
|
||||
- **低延遲** ([35~70ms][lowlatency])
|
||||
- **快速啟動** (~1 秒就可以顯示第一個畫面)
|
||||
- **非侵入性** (不安裝、留下任何東西在裝置上)
|
||||
|
||||
[lowlatency]: https://github.com/Genymobile/scrcpy/pull/646
|
||||
|
||||
|
||||
## 需求
|
||||
|
||||
Android 裝置必須是 API 21+ (Android 5.0+)。
|
||||
|
||||
請確認裝置上的 [adb 偵錯 (通常位於開發者模式內)][enable-adb] 已啟用。
|
||||
|
||||
[enable-adb]: https://developer.android.com/studio/command-line/adb.html#Enabling
|
||||
|
||||
|
||||
在部分的裝置上,你也必須啟用[特定的額外選項][control]才能使用鍵盤和滑鼠控制。
|
||||
|
||||
[control]: https://github.com/Genymobile/scrcpy/issues/70#issuecomment-373286323
|
||||
|
||||
|
||||
## 下載/獲取軟體
|
||||
|
||||
|
||||
### Linux
|
||||
|
||||
Debian (目前支援 _testing_ 和 _sid_) 和 Ubuntu (20.04):
|
||||
|
||||
```
|
||||
apt install scrcpy
|
||||
```
|
||||
|
||||
[Snap] 上也可以下載: [`scrcpy`][snap-link].
|
||||
|
||||
[snap-link]: https://snapstats.org/snaps/scrcpy
|
||||
|
||||
[snap]: https://en.wikipedia.org/wiki/Snappy_(package_manager)
|
||||
|
||||
在 Fedora 上也可以使用 [COPR] 下載: [`scrcpy`][copr-link].
|
||||
|
||||
[COPR]: https://fedoraproject.org/wiki/Category:Copr
|
||||
[copr-link]: https://copr.fedorainfracloud.org/coprs/zeno/scrcpy/
|
||||
|
||||
在 Arch Linux 上也可以使用 [AUR] 下載: [`scrcpy`][aur-link].
|
||||
|
||||
[AUR]: https://wiki.archlinux.org/index.php/Arch_User_Repository
|
||||
[aur-link]: https://aur.archlinux.org/packages/scrcpy/
|
||||
|
||||
在 Gentoo 上也可以使用 [Ebuild] 下載: [`scrcpy/`][ebuild-link].
|
||||
|
||||
[Ebuild]: https://wiki.gentoo.org/wiki/Ebuild
|
||||
[ebuild-link]: https://github.com/maggu2810/maggu2810-overlay/tree/master/app-mobilephone/scrcpy
|
||||
|
||||
你也可以自己[編譯 _Scrcpy_][BUILD]。別擔心,並沒有想像中的難。
|
||||
|
||||
|
||||
|
||||
### Windows
|
||||
|
||||
為了保持簡單,Windows 用戶可以下載一個包含所有必需軟體 (包含 `adb`) 的壓縮包:
|
||||
|
||||
- [`scrcpy-win64-v1.15.zip`][direct-win64]
|
||||
_(SHA-256: dd514bb591e63ef4cd52a53c30f1153a28f59722d64690eb07bd017849edcba2)_
|
||||
|
||||
[direct-win64]: https://github.com/Genymobile/scrcpy/releases/download/v1.15/scrcpy-win64-v1.15.zip
|
||||
|
||||
[Chocolatey] 上也可以下載:
|
||||
|
||||
[Chocolatey]: https://chocolatey.org/
|
||||
|
||||
```bash
|
||||
choco install scrcpy
|
||||
choco install adb # 如果你還沒有安裝的話
|
||||
```
|
||||
|
||||
[Scoop] 上也可以下載:
|
||||
|
||||
```bash
|
||||
scoop install scrcpy
|
||||
scoop install adb # 如果你還沒有安裝的話
|
||||
```
|
||||
|
||||
[Scoop]: https://scoop.sh
|
||||
|
||||
你也可以自己[編譯 _Scrcpy_][BUILD]。
|
||||
|
||||
|
||||
### macOS
|
||||
|
||||
_Scrcpy_ 可以在 [Homebrew] 上直接安裝:
|
||||
|
||||
[Homebrew]: https://brew.sh/
|
||||
|
||||
```bash
|
||||
brew install scrcpy
|
||||
```
|
||||
|
||||
由於執行期間需要可以藉由 `PATH` 存取 `adb` 。如果還沒有安裝 `adb` 可以使用下列方式安裝:
|
||||
|
||||
```bash
|
||||
brew cask install android-platform-tools
|
||||
```
|
||||
|
||||
你也可以自己[編譯 _Scrcpy_][BUILD]。
|
||||
|
||||
|
||||
## 執行
|
||||
|
||||
將電腦和你的 Android 裝置連線,然後執行:
|
||||
|
||||
```bash
|
||||
scrcpy
|
||||
```
|
||||
|
||||
_Scrcpy_ 可以接受命令列參數。輸入下列指令就可以瀏覽可以使用的命令列參數:
|
||||
|
||||
```bash
|
||||
scrcpy --help
|
||||
```
|
||||
|
||||
|
||||
## 功能
|
||||
|
||||
> 以下說明中,有關快捷鍵的說明可能會出現 <kbd>MOD</kbd> 按鈕。相關說明請參見[快捷鍵]內的說明。
|
||||
|
||||
[快捷鍵]: #快捷鍵
|
||||
|
||||
### 畫面擷取
|
||||
|
||||
#### 縮小尺寸
|
||||
|
||||
使用比較低的解析度來投放 Android 裝置在某些情況可以提升效能。
|
||||
|
||||
限制寬和高的最大值(例如: 1024):
|
||||
|
||||
```bash
|
||||
scrcpy --max-size 1024
|
||||
scrcpy -m 1024 # 縮短版本
|
||||
```
|
||||
|
||||
比較小的參數會根據螢幕比例重新計算。
|
||||
根據上面的範例,1920x1080 會被縮小成 1024x576。
|
||||
|
||||
|
||||
#### 更改 bit-rate
|
||||
|
||||
預設的 bit-rate 是 8 Mbps。如果要更改 bit-rate (例如: 2 Mbps):
|
||||
|
||||
```bash
|
||||
scrcpy --bit-rate 2M
|
||||
scrcpy -b 2M # 縮短版本
|
||||
```
|
||||
|
||||
#### 限制 FPS
|
||||
|
||||
限制畫面最高的 FPS:
|
||||
|
||||
```bash
|
||||
scrcpy --max-fps 15
|
||||
```
|
||||
|
||||
僅在 Android 10 後正式支援,不過也有可能可以在 Android 10 以前的版本使用。
|
||||
|
||||
#### 裁切
|
||||
|
||||
裝置的螢幕可以裁切。如此一來,鏡像出來的螢幕就只會是原本的一部份。
|
||||
|
||||
假如只要鏡像 Oculus Go 的其中一隻眼睛:
|
||||
|
||||
```bash
|
||||
scrcpy --crop 1224:1440:0:0 # 位於 (0,0),大小1224x1440
|
||||
```
|
||||
|
||||
如果 `--max-size` 也有指定的話,裁切後才會縮放。
|
||||
|
||||
|
||||
#### 鎖定影像方向
|
||||
|
||||
|
||||
如果要鎖定鏡像影像方向:
|
||||
|
||||
```bash
|
||||
scrcpy --lock-video-orientation 0 # 原本的方向
|
||||
scrcpy --lock-video-orientation 1 # 逆轉 90°
|
||||
scrcpy --lock-video-orientation 2 # 180°
|
||||
scrcpy --lock-video-orientation 3 # 順轉 90°
|
||||
```
|
||||
|
||||
這會影響錄影結果的影像方向。
|
||||
|
||||
|
||||
### 錄影
|
||||
|
||||
鏡像投放螢幕的同時也可以錄影:
|
||||
|
||||
```bash
|
||||
scrcpy --record file.mp4
|
||||
scrcpy -r file.mkv
|
||||
```
|
||||
|
||||
如果只要錄影,不要投放螢幕鏡像的話:
|
||||
|
||||
```bash
|
||||
scrcpy --no-display --record file.mp4
|
||||
scrcpy -Nr file.mkv
|
||||
# 用 Ctrl+C 停止錄影
|
||||
```
|
||||
|
||||
就算有些幀為了效能而被跳過,它們還是一樣會被錄製。
|
||||
|
||||
裝置上的每一幀都有時間戳記,所以 [封包延遲 (Packet Delay Variation, PDV)][packet delay variation] 並不會影響錄影的檔案。
|
||||
|
||||
[packet delay variation]: https://en.wikipedia.org/wiki/Packet_delay_variation
|
||||
|
||||
|
||||
### 連線
|
||||
|
||||
#### 無線
|
||||
|
||||
_Scrcpy_ 利用 `adb` 和裝置通訊,而 `adb` 可以[透過 TCP/IP 連結][connect]:
|
||||
|
||||
1. 讓電腦和裝置連到同一個 Wi-Fi。
|
||||
2. 獲取手機的 IP 位址(設定 → 關於手機 → 狀態).
|
||||
3. 啟用裝置上的 `adb over TCP/IP`: `adb tcpip 5555`.
|
||||
4. 拔掉裝置上的線。
|
||||
5. 透過 TCP/IP 連接裝置: `adb connect DEVICE_IP:5555` _(把 `DEVICE_IP` 換成裝置的IP位址)_.
|
||||
6. 和平常一樣執行 `scrcpy`。
|
||||
|
||||
如果效能太差,可以降低 bit-rate 和解析度:
|
||||
|
||||
```bash
|
||||
scrcpy --bit-rate 2M --max-size 800
|
||||
scrcpy -b2M -m800 # 縮短版本
|
||||
```
|
||||
|
||||
[connect]: https://developer.android.com/studio/command-line/adb.html#wireless
|
||||
|
||||
|
||||
#### 多裝置
|
||||
|
||||
如果 `adb devices` 內有多個裝置,則必須附上 _serial_:
|
||||
|
||||
```bash
|
||||
scrcpy --serial 0123456789abcdef
|
||||
scrcpy -s 0123456789abcdef # 縮短版本
|
||||
```
|
||||
|
||||
如果裝置是透過 TCP/IP 連線:
|
||||
|
||||
```bash
|
||||
scrcpy --serial 192.168.0.1:5555
|
||||
scrcpy -s 192.168.0.1:5555 # 縮短版本
|
||||
```
|
||||
|
||||
你可以啟用復數個對應不同裝置的 _scrcpy_。
|
||||
|
||||
#### 裝置連結後自動啟動
|
||||
|
||||
你可以使用 [AutoAdb]:
|
||||
|
||||
```bash
|
||||
autoadb scrcpy -s '{}'
|
||||
```
|
||||
|
||||
[AutoAdb]: https://github.com/rom1v/autoadb
|
||||
|
||||
#### SSH tunnel
|
||||
|
||||
本地的 `adb` 可以連接到遠端的 `adb` 伺服器(假設兩者使用相同版本的 _adb_ 通訊協定),以連接到遠端裝置:
|
||||
|
||||
```bash
|
||||
adb kill-server # 停止在 Port 5037 的本地 adb 伺服
|
||||
ssh -CN -L5037:localhost:5037 -R27183:localhost:27183 your_remote_computer
|
||||
# 保持開啟
|
||||
```
|
||||
|
||||
從另外一個終端機:
|
||||
|
||||
```bash
|
||||
scrcpy
|
||||
```
|
||||
|
||||
如果要避免啟用 remote port forwarding,你可以強制它使用 forward connection (注意 `-L` 和 `-R` 的差別):
|
||||
|
||||
```bash
|
||||
adb kill-server # 停止在 Port 5037 的本地 adb 伺服
|
||||
ssh -CN -L5037:localhost:5037 -L27183:localhost:27183 your_remote_computer
|
||||
# 保持開啟
|
||||
```
|
||||
|
||||
從另外一個終端機:
|
||||
|
||||
```bash
|
||||
scrcpy --force-adb-forward
|
||||
```
|
||||
|
||||
|
||||
和無線連接一樣,有時候降低品質會比較好:
|
||||
|
||||
```
|
||||
scrcpy -b2M -m800 --max-fps 15
|
||||
```
|
||||
|
||||
### 視窗調整
|
||||
|
||||
#### 標題
|
||||
|
||||
預設標題是裝置的型號,不過可以透過以下方式修改:
|
||||
|
||||
```bash
|
||||
scrcpy --window-title 'My device'
|
||||
```
|
||||
|
||||
#### 位置 & 大小
|
||||
|
||||
初始的視窗位置和大小也可以指定:
|
||||
|
||||
```bash
|
||||
scrcpy --window-x 100 --window-y 100 --window-width 800 --window-height 600
|
||||
```
|
||||
|
||||
#### 無邊框
|
||||
|
||||
如果要停用視窗裝飾:
|
||||
|
||||
```bash
|
||||
scrcpy --window-borderless
|
||||
```
|
||||
|
||||
#### 保持最上層
|
||||
|
||||
如果要保持 `scrcpy` 的視窗在最上層:
|
||||
|
||||
```bash
|
||||
scrcpy --always-on-top
|
||||
```
|
||||
|
||||
#### 全螢幕
|
||||
|
||||
這個軟體可以直接在全螢幕模式下起動:
|
||||
|
||||
```bash
|
||||
scrcpy --fullscreen
|
||||
scrcpy -f # 縮短版本
|
||||
```
|
||||
|
||||
全螢幕可以使用 <kbd>MOD</kbd>+<kbd>f</kbd> 開關。
|
||||
|
||||
#### 旋轉
|
||||
|
||||
視窗可以旋轉:
|
||||
|
||||
```bash
|
||||
scrcpy --rotation 1
|
||||
```
|
||||
|
||||
可用的數值:
|
||||
- `0`: 不旋轉
|
||||
- `1`: 90 度**逆**轉
|
||||
- `2`: 180 度
|
||||
- `3`: 90 度**順**轉
|
||||
|
||||
旋轉方向也可以使用 <kbd>MOD</kbd>+<kbd>←</kbd> _(左方向鍵)_ 和 <kbd>MOD</kbd>+<kbd>→</kbd> _(右方向鍵)_ 調整。
|
||||
|
||||
_scrcpy_ 有 3 種不同的旋轉:
|
||||
- <kbd>MOD</kbd>+<kbd>r</kbd> 要求裝置在垂直、水平之間旋轉 (目前運行中的 App 有可能會因為不支援而拒絕)。
|
||||
- `--lock-video-orientation` 修改鏡像的方向 (裝置傳給電腦的影像)。這會影響錄影結果的影像方向。
|
||||
- `--rotation` (或是 <kbd>MOD</kbd>+<kbd>←</kbd> / <kbd>MOD</kbd>+<kbd>→</kbd>) 只旋轉視窗的內容。這只會影響鏡像結果,不會影響錄影結果。
|
||||
|
||||
|
||||
### 其他鏡像選項
|
||||
|
||||
#### 唯讀
|
||||
|
||||
停用所有控制,包含鍵盤輸入、滑鼠事件、拖放檔案:
|
||||
|
||||
```bash
|
||||
scrcpy --no-control
|
||||
scrcpy -n
|
||||
```
|
||||
|
||||
#### 顯示螢幕
|
||||
|
||||
如果裝置有複數個螢幕,可以指定要鏡像哪個螢幕:
|
||||
|
||||
```bash
|
||||
scrcpy --display 1
|
||||
```
|
||||
|
||||
可以透過下列指令獲取螢幕 ID:
|
||||
|
||||
```
|
||||
adb shell dumpsys display # 找輸出結果中的 "mDisplayId="
|
||||
```
|
||||
|
||||
第二螢幕只有在 Android 10+ 時可以控制。如果不是 Android 10+,螢幕就會在唯讀狀態下投放。
|
||||
|
||||
|
||||
#### 保持清醒
|
||||
|
||||
如果要避免裝置在連接狀態下進入睡眠:
|
||||
|
||||
```bash
|
||||
scrcpy --stay-awake
|
||||
scrcpy -w
|
||||
```
|
||||
|
||||
_scrcpy_ 關閉後就會回復成原本的設定。
|
||||
|
||||
|
||||
#### 關閉螢幕
|
||||
|
||||
鏡像開始時,可以要求裝置關閉螢幕:
|
||||
|
||||
```bash
|
||||
scrcpy --turn-screen-off
|
||||
scrcpy -S
|
||||
```
|
||||
|
||||
或是在任何時候輸入 <kbd>MOD</kbd>+<kbd>o</kbd>。
|
||||
|
||||
如果要開啟螢幕,輸入 <kbd>MOD</kbd>+<kbd>Shift</kbd>+<kbd>o</kbd>。
|
||||
|
||||
在 Android 上,`POWER` 按鈕總是開啟螢幕。
|
||||
|
||||
為了方便,如果 `POWER` 是透過 scrcpy 轉送 (右鍵 或 <kbd>MOD</kbd>+<kbd>p</kbd>)的話,螢幕將會在短暫的延遲後關閉。
|
||||
|
||||
實際在手機上的 `POWER` 還是會開啟螢幕。
|
||||
|
||||
防止裝置進入睡眠狀態:
|
||||
|
||||
```bash
|
||||
scrcpy --turn-screen-off --stay-awake
|
||||
scrcpy -Sw
|
||||
```
|
||||
|
||||
|
||||
#### 顯示過期的幀
|
||||
|
||||
為了降低延遲, _scrcpy_ 預設只會顯示最後解碼的幀,並且拋棄所有在這之前的幀。
|
||||
|
||||
如果要強制顯示所有的幀 (有可能會拉高延遲),輸入:
|
||||
|
||||
```bash
|
||||
scrcpy --render-expired-frames
|
||||
```
|
||||
|
||||
#### 顯示觸控點
|
||||
|
||||
對於要報告的人來說,顯示裝置上的實際觸控點有時候是有幫助的。
|
||||
|
||||
Android 在_開發者選項_中有提供這個功能。
|
||||
|
||||
_Scrcpy_ 可以在啟動時啟用這個功能,並且在停止後恢復成原本的設定:
|
||||
|
||||
```bash
|
||||
scrcpy --show-touches
|
||||
scrcpy -t
|
||||
```
|
||||
|
||||
這個選項只會顯示**實際觸碰在裝置上的觸碰點**。
|
||||
|
||||
|
||||
### 輸入控制
|
||||
|
||||
|
||||
#### 旋轉裝置螢幕
|
||||
|
||||
輸入 <kbd>MOD</kbd>+<kbd>r</kbd> 以在垂直、水平之間切換。
|
||||
|
||||
如果使用中的程式不支援,則不會切換。
|
||||
|
||||
|
||||
#### 複製/貼上
|
||||
|
||||
如果 Android 剪貼簿上的內容有任何更動,電腦的剪貼簿也會一起更動。
|
||||
|
||||
任何與 <kbd>Ctrl</kbd> 相關的快捷鍵事件都會轉送到裝置上。特別來說:
|
||||
- <kbd>Ctrl</kbd>+<kbd>c</kbd> 通常是複製
|
||||
- <kbd>Ctrl</kbd>+<kbd>x</kbd> 通常是剪下
|
||||
- <kbd>Ctrl</kbd>+<kbd>v</kbd> 通常是貼上 (在電腦的剪貼簿與裝置上的剪貼簿同步之後)
|
||||
|
||||
這些跟你通常預期的行為一樣。
|
||||
|
||||
但是,實際上的行為是根據目前運行中的應用程式而定。
|
||||
|
||||
舉例來說, _Termux_ 在收到 <kbd>Ctrl</kbd>+<kbd>c</kbd> 後,會傳送 SIGINT;而 _K-9 Mail_ 則是建立新訊息。
|
||||
|
||||
如果在這情況下,要剪下、複製或貼上 (只有在Android 7+時才支援):
|
||||
- <kbd>MOD</kbd>+<kbd>c</kbd> 注入 `複製`
|
||||
- <kbd>MOD</kbd>+<kbd>x</kbd> 注入 `剪下`
|
||||
- <kbd>MOD</kbd>+<kbd>v</kbd> 注入 `貼上` (在電腦的剪貼簿與裝置上的剪貼簿同步之後)
|
||||
|
||||
另外,<kbd>MOD</kbd>+<kbd>Shift</kbd>+<kbd>v</kbd> 則是以一連串的按鍵事件貼上電腦剪貼簿中的內容。當元件不允許文字貼上 (例如 _Termux_) 時,這就很有用。不過,這在非 ASCII 內容上就無法使用。
|
||||
|
||||
**警告:** 貼上電腦的剪貼簿內容 (無論是從 <kbd>Ctrl</kbd>+<kbd>v</kbd> 或 <kbd>MOD</kbd>+<kbd>v</kbd>) 時,會複製剪貼簿中的內容至裝置的剪貼簿上。這會讓所有 Android 程式讀取剪貼簿的內容。請避免貼上任何敏感內容 (像是密碼)。
|
||||
|
||||
|
||||
#### 文字輸入偏好
|
||||
|
||||
輸入文字時,有兩種[事件][textevents]會被觸發:
|
||||
- _鍵盤事件 (key events)_,代表有一個按鍵被按下或放開
|
||||
- _文字事件 (text events)_,代表有一個文字被輸入
|
||||
|
||||
預設上,文字是被以鍵盤事件 (key events) 輸入的,所以鍵盤和遊戲內所預期的一樣 (通常是指 WASD)。
|
||||
|
||||
但是這可能造成[一些問題][prefertext]。如果在這輸入這方面遇到了問題,你可以試試:
|
||||
|
||||
```bash
|
||||
scrcpy --prefer-text
|
||||
```
|
||||
|
||||
(不過遊戲內鍵盤就會不可用)
|
||||
|
||||
[textevents]: https://blog.rom1v.com/2018/03/introducing-scrcpy/#handle-text-input
|
||||
[prefertext]: https://github.com/Genymobile/scrcpy/issues/650#issuecomment-512945343
|
||||
|
||||
|
||||
#### 重複輸入
|
||||
|
||||
通常來說,長時間按住一個按鍵會重複觸發按鍵事件。這會在一些遊戲中造成效能問題,而且這個重複的按鍵事件是沒有意義的。
|
||||
|
||||
如果不要轉送這些重複的按鍵事件:
|
||||
|
||||
```bash
|
||||
scrcpy --no-key-repeat
|
||||
```
|
||||
|
||||
|
||||
### 檔案
|
||||
|
||||
#### 安裝 APK
|
||||
|
||||
如果要安裝 APK ,拖放一個 APK 檔案 (以 `.apk` 為副檔名) 到 _scrcpy_ 的視窗上。
|
||||
|
||||
視窗上不會有任何反饋;結果會顯示在命令列中。
|
||||
|
||||
|
||||
#### 推送檔案至裝置
|
||||
|
||||
如果要推送檔案到裝置上的 `/sdcard/` ,拖放一個非 APK 檔案 (**不**以 `.apk` 為副檔名) 到 _scrcpy_ 的視窗上。
|
||||
|
||||
視窗上不會有任何反饋;結果會顯示在命令列中。
|
||||
|
||||
推送檔案的目標路徑可以在啟動時指定:
|
||||
|
||||
```bash
|
||||
scrcpy --push-target /sdcard/foo/bar/
|
||||
```
|
||||
|
||||
|
||||
### 音訊轉送
|
||||
|
||||
_scrcpy_ **不**轉送音訊。請使用 [sndcpy]。另外,參見 [issue #14]。
|
||||
|
||||
[sndcpy]: https://github.com/rom1v/sndcpy
|
||||
[issue #14]: https://github.com/Genymobile/scrcpy/issues/14
|
||||
|
||||
|
||||
## 快捷鍵
|
||||
|
||||
在以下的清單中,<kbd>MOD</kbd> 是快捷鍵的特殊按鍵。通常來說,這個按鍵是 (左) <kbd>Alt</kbd> 或是 (左) <kbd>Super</kbd>。
|
||||
|
||||
這個是可以使用 `--shortcut-mod` 更改的。可以用的選項有:
|
||||
- `lctrl`: 左邊的 <kbd>Ctrl</kbd>
|
||||
- `rctrl`: 右邊的 <kbd>Ctrl</kbd>
|
||||
- `lalt`: 左邊的 <kbd>Alt</kbd>
|
||||
- `ralt`: 右邊的 <kbd>Alt</kbd>
|
||||
- `lsuper`: 左邊的 <kbd>Super</kbd>
|
||||
- `rsuper`: 右邊的 <kbd>Super</kbd>
|
||||
|
||||
```bash
|
||||
# 以 右邊的 Ctrl 為快捷鍵特殊按鍵
|
||||
scrcpy --shortcut-mod=rctrl
|
||||
|
||||
# 以 左邊的 Ctrl 和左邊的 Alt 或是 左邊的 Super 為快捷鍵特殊按鍵
|
||||
scrcpy --shortcut-mod=lctrl+lalt,lsuper
|
||||
```
|
||||
|
||||
_<kbd>[Super]</kbd> 通常是 <kbd>Windows</kbd> 或 <kbd>Cmd</kbd> 鍵。_
|
||||
|
||||
[Super]: https://en.wikipedia.org/wiki/Super_key_(keyboard_button)
|
||||
|
||||
| Action | Shortcut
|
||||
| ------------------------------------------------- |:-----------------------------
|
||||
| 切換至全螢幕 | <kbd>MOD</kbd>+<kbd>f</kbd>
|
||||
| 左旋顯示螢幕 | <kbd>MOD</kbd>+<kbd>←</kbd> _(左)_
|
||||
| 右旋顯示螢幕 | <kbd>MOD</kbd>+<kbd>→</kbd> _(右)_
|
||||
| 縮放視窗成 1:1 (pixel-perfect) | <kbd>MOD</kbd>+<kbd>g</kbd>
|
||||
| 縮放視窗到沒有黑邊框為止 | <kbd>MOD</kbd>+<kbd>w</kbd> \| _雙擊¹_
|
||||
| 按下 `首頁` 鍵 | <kbd>MOD</kbd>+<kbd>h</kbd> \| _中鍵_
|
||||
| 按下 `返回` 鍵 | <kbd>MOD</kbd>+<kbd>b</kbd> \| _右鍵²_
|
||||
| 按下 `切換 APP` 鍵 | <kbd>MOD</kbd>+<kbd>s</kbd>
|
||||
| 按下 `選單` 鍵 (或解鎖螢幕) | <kbd>MOD</kbd>+<kbd>m</kbd>
|
||||
| 按下 `音量+` 鍵 | <kbd>MOD</kbd>+<kbd>↑</kbd> _(上)_
|
||||
| 按下 `音量-` 鍵 | <kbd>MOD</kbd>+<kbd>↓</kbd> _(下)_
|
||||
| 按下 `電源` 鍵 | <kbd>MOD</kbd>+<kbd>p</kbd>
|
||||
| 開啟 | _右鍵²_
|
||||
| 關閉裝置螢幕(持續鏡像) | <kbd>MOD</kbd>+<kbd>o</kbd>
|
||||
| 開啟裝置螢幕 | <kbd>MOD</kbd>+<kbd>Shift</kbd>+<kbd>o</kbd>
|
||||
| 旋轉裝置螢幕 | <kbd>MOD</kbd>+<kbd>r</kbd>
|
||||
| 開啟通知列 | <kbd>MOD</kbd>+<kbd>n</kbd>
|
||||
| 關閉通知列 | <kbd>MOD</kbd>+<kbd>Shift</kbd>+<kbd>n</kbd>
|
||||
| 複製至剪貼簿³ | <kbd>MOD</kbd>+<kbd>c</kbd>
|
||||
| 剪下至剪貼簿³ | <kbd>MOD</kbd>+<kbd>x</kbd>
|
||||
| 同步剪貼簿並貼上³ | <kbd>MOD</kbd>+<kbd>v</kbd>
|
||||
| 複製電腦剪貼簿中的文字至裝置並貼上 | <kbd>MOD</kbd>+<kbd>Shift</kbd>+<kbd>v</kbd>
|
||||
| 啟用/停用 FPS 計數器(顯示於 stdout - 通常是命令列) | <kbd>MOD</kbd>+<kbd>i</kbd>
|
||||
|
||||
_¹在黑邊框上雙擊以移除它們。_
|
||||
_²右鍵會返回。如果螢幕是關閉狀態,則會打開螢幕。_
|
||||
_³只支援 Android 7+。_
|
||||
|
||||
所有 <kbd>Ctrl</kbd>+_按鍵_ 快捷鍵都會傳送到裝置上,所以它們是由目前運作的應用程式處理的。
|
||||
|
||||
|
||||
## 自訂路徑
|
||||
|
||||
如果要使用特定的 _adb_ ,將它設定到環境變數中的 `ADB`:
|
||||
|
||||
ADB=/path/to/adb scrcpy
|
||||
|
||||
如果要覆寫 `scrcpy-server` 檔案的路徑,則將路徑設定到環境變數中的 `SCRCPY_SERVER_PATH`。
|
||||
|
||||
[相關連結][useful]
|
||||
|
||||
[useful]: https://github.com/Genymobile/scrcpy/issues/278#issuecomment-429330345
|
||||
|
||||
|
||||
## 為何叫 _scrcpy_ ?
|
||||
|
||||
有一個同事要我找一個跟 [gnirehtet] 一樣難念的名字。
|
||||
|
||||
[`strcpy`] 複製一個字串 (**str**ing);`scrcpy` 複製一個螢幕 (**scr**een)。
|
||||
|
||||
[gnirehtet]: https://github.com/Genymobile/gnirehtet
|
||||
[`strcpy`]: http://man7.org/linux/man-pages/man3/strcpy.3.html
|
||||
|
||||
|
||||
## 如何編譯?
|
||||
|
||||
請看[這份文件 (英文)][BUILD]。
|
||||
|
||||
[BUILD]: BUILD.md
|
||||
|
||||
|
||||
## 常見問題
|
||||
|
||||
請看[這份文件 (英文)][FAQ]。
|
||||
|
||||
[FAQ]: FAQ.md
|
||||
|
||||
|
||||
## 開發者文件
|
||||
|
||||
請看[這個頁面 (英文)][developers page].
|
||||
|
||||
[developers page]: DEVELOP.md
|
||||
|
||||
|
||||
## Licence
|
||||
|
||||
Copyright (C) 2018 Genymobile
|
||||
Copyright (C) 2018-2020 Romain Vimont
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
|
||||
## 相關文章
|
||||
|
||||
- [Scrcpy 簡介 (英文)][article-intro]
|
||||
- [Scrcpy 可以無線連線了 (英文)][article-tcpip]
|
||||
|
||||
[article-intro]: https://blog.rom1v.com/2018/03/introducing-scrcpy/
|
||||
[article-tcpip]: https://www.genymotion.com/blog/open-source-project-scrcpy-now-works-wirelessly/
|
||||
@@ -222,7 +222,7 @@ Default is 0 (automatic).\n
|
||||
.SH SHORTCUTS
|
||||
|
||||
In the following list, MOD is the shortcut modifier. By default, it's (left)
|
||||
Alt or (left) Super, but it can be configured by \-\-shortcut-mod (see above).
|
||||
Alt or (left) Super, but it can be configured by \-\-shortcut-mod.
|
||||
|
||||
.TP
|
||||
.B MOD+f
|
||||
@@ -316,10 +316,6 @@ Inject computer clipboard text as a sequence of key events
|
||||
.B MOD+i
|
||||
Enable/disable FPS counter (print frames/second in logs)
|
||||
|
||||
.TP
|
||||
.B Ctrl+click-and-move
|
||||
Pinch-to-zoom from the center of the screen
|
||||
|
||||
.TP
|
||||
.B Drag & drop APK file
|
||||
Install APK from computer
|
||||
|
||||
@@ -203,7 +203,7 @@ scrcpy_print_usage(const char *arg0) {
|
||||
"\n"
|
||||
" In the following list, MOD is the shortcut modifier. By default,\n"
|
||||
" it's (left) Alt or (left) Super, but it can be configured by\n"
|
||||
" --shortcut-mod (see above).\n"
|
||||
" --shortcut-mod.\n"
|
||||
"\n"
|
||||
" MOD+f\n"
|
||||
" Switch fullscreen mode\n"
|
||||
@@ -279,9 +279,6 @@ scrcpy_print_usage(const char *arg0) {
|
||||
" MOD+i\n"
|
||||
" Enable/disable FPS counter (print frames/second in logs)\n"
|
||||
"\n"
|
||||
" Ctrl+click-and-move\n"
|
||||
" Pinch-to-zoom from the center of the screen\n"
|
||||
"\n"
|
||||
" Drag & drop APK file\n"
|
||||
" Install APK from computer\n"
|
||||
"\n",
|
||||
@@ -532,9 +529,7 @@ parse_shortcut_mods_item(const char *item, size_t len) {
|
||||
} else if (STREQ("rsuper", item, key_len)) {
|
||||
mod |= SC_MOD_RSUPER;
|
||||
} else {
|
||||
LOGE("Unknown modifier key: %.*s "
|
||||
"(must be one of: lctrl, rctrl, lalt, ralt, lsuper, rsuper)",
|
||||
(int) key_len, item);
|
||||
LOGW("Unknown modifier key: %.*s", (int) key_len, item);
|
||||
return 0;
|
||||
}
|
||||
#undef STREQ
|
||||
|
||||
@@ -17,7 +17,6 @@
|
||||
#define CONTROL_MSG_CLIPBOARD_TEXT_MAX_LENGTH (CONTROL_MSG_MAX_SIZE - 6)
|
||||
|
||||
#define POINTER_ID_MOUSE UINT64_C(-1);
|
||||
#define POINTER_ID_VIRTUAL_FINGER UINT64_C(-2);
|
||||
|
||||
enum control_msg_type {
|
||||
CONTROL_MSG_TYPE_INJECT_KEYCODE,
|
||||
|
||||
@@ -70,8 +70,6 @@ input_manager_init(struct input_manager *im,
|
||||
im->sdl_shortcut_mods.data[i] = sdl_mod;
|
||||
}
|
||||
im->sdl_shortcut_mods.count = shortcut_mods->count;
|
||||
|
||||
im->vfinger_down = false;
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -301,36 +299,6 @@ input_manager_process_text_input(struct input_manager *im,
|
||||
}
|
||||
}
|
||||
|
||||
static bool
|
||||
simulate_virtual_finger(struct input_manager *im,
|
||||
enum android_motionevent_action action,
|
||||
struct point point) {
|
||||
bool up = action == AMOTION_EVENT_ACTION_UP;
|
||||
|
||||
struct control_msg msg;
|
||||
msg.type = CONTROL_MSG_TYPE_INJECT_TOUCH_EVENT;
|
||||
msg.inject_touch_event.action = action;
|
||||
msg.inject_touch_event.position.screen_size = im->screen->frame_size;
|
||||
msg.inject_touch_event.position.point = point;
|
||||
msg.inject_touch_event.pointer_id = POINTER_ID_VIRTUAL_FINGER;
|
||||
msg.inject_touch_event.pressure = up ? 0.0f : 1.0f;
|
||||
msg.inject_touch_event.buttons = 0;
|
||||
|
||||
if (!controller_push_msg(im->controller, &msg)) {
|
||||
LOGW("Could not request 'inject virtual finger event'");
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
static struct point
|
||||
inverse_point(struct point point, struct size size) {
|
||||
point.x = size.width - point.x;
|
||||
point.y = size.height - point.y;
|
||||
return point;
|
||||
}
|
||||
|
||||
static bool
|
||||
convert_input_key(const SDL_KeyboardEvent *from, struct control_msg *to,
|
||||
bool prefer_text, uint32_t repeat) {
|
||||
@@ -544,18 +512,10 @@ input_manager_process_mouse_motion(struct input_manager *im,
|
||||
return;
|
||||
}
|
||||
struct control_msg msg;
|
||||
if (!convert_mouse_motion(event, im->screen, &msg)) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (!controller_push_msg(im->controller, &msg)) {
|
||||
LOGW("Could not request 'inject mouse motion event'");
|
||||
}
|
||||
|
||||
if (im->vfinger_down) {
|
||||
struct point mouse = msg.inject_touch_event.position.point;
|
||||
struct point vfinger = inverse_point(mouse, im->screen->frame_size);
|
||||
simulate_virtual_finger(im, AMOTION_EVENT_ACTION_MOVE, vfinger);
|
||||
if (convert_mouse_motion(event, im->screen, &msg)) {
|
||||
if (!controller_push_msg(im->controller, &msg)) {
|
||||
LOGW("Could not request 'inject mouse motion event'");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -627,9 +587,7 @@ input_manager_process_mouse_button(struct input_manager *im,
|
||||
// simulated from touch events, so it's a duplicate
|
||||
return;
|
||||
}
|
||||
|
||||
bool down = event->type == SDL_MOUSEBUTTONDOWN;
|
||||
if (down) {
|
||||
if (event->type == SDL_MOUSEBUTTONDOWN) {
|
||||
if (control && event->button == SDL_BUTTON_RIGHT) {
|
||||
press_back_or_turn_screen_on(im->controller);
|
||||
return;
|
||||
@@ -660,36 +618,10 @@ input_manager_process_mouse_button(struct input_manager *im,
|
||||
}
|
||||
|
||||
struct control_msg msg;
|
||||
if (!convert_mouse_button(event, im->screen, &msg)) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (!controller_push_msg(im->controller, &msg)) {
|
||||
LOGW("Could not request 'inject mouse button event'");
|
||||
return;
|
||||
}
|
||||
|
||||
// Pinch-to-zoom simulation.
|
||||
//
|
||||
// If Ctrl is hold when the left-click button is pressed, then
|
||||
// pinch-to-zoom mode is enabled: on every mouse event until the left-click
|
||||
// button is released, an additional "virtual finger" event is generated,
|
||||
// having a position inverted through the center of the screen.
|
||||
//
|
||||
// In other words, the center of the rotation/scaling is the center of the
|
||||
// screen.
|
||||
#define CTRL_PRESSED (SDL_GetModState() & (KMOD_LCTRL | KMOD_RCTRL))
|
||||
if ((down && !im->vfinger_down && CTRL_PRESSED)
|
||||
|| (!down && im->vfinger_down)) {
|
||||
struct point mouse = msg.inject_touch_event.position.point;
|
||||
struct point vfinger = inverse_point(mouse, im->screen->frame_size);
|
||||
enum android_motionevent_action action = down
|
||||
? AMOTION_EVENT_ACTION_DOWN
|
||||
: AMOTION_EVENT_ACTION_UP;
|
||||
if (!simulate_virtual_finger(im, action, vfinger)) {
|
||||
return;
|
||||
if (convert_mouse_button(event, im->screen, &msg)) {
|
||||
if (!controller_push_msg(im->controller, &msg)) {
|
||||
LOGW("Could not request 'inject mouse button event'");
|
||||
}
|
||||
im->vfinger_down = down;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -30,8 +30,6 @@ struct input_manager {
|
||||
unsigned data[SC_MAX_SHORTCUT_MODS];
|
||||
unsigned count;
|
||||
} sdl_shortcut_mods;
|
||||
|
||||
bool vfinger_down;
|
||||
};
|
||||
|
||||
void
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
project('scrcpy', 'c',
|
||||
version: '1.16',
|
||||
version: '1.15.1',
|
||||
meson_version: '>= 0.48',
|
||||
default_options: [
|
||||
'c_std=c11',
|
||||
|
||||
@@ -6,8 +6,8 @@ android {
|
||||
applicationId "com.genymobile.scrcpy"
|
||||
minSdkVersion 21
|
||||
targetSdkVersion 29
|
||||
versionCode 19
|
||||
versionName "1.16"
|
||||
versionCode 18
|
||||
versionName "1.15.1"
|
||||
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
|
||||
}
|
||||
buildTypes {
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
set -e
|
||||
|
||||
SCRCPY_DEBUG=false
|
||||
SCRCPY_VERSION_NAME=1.16
|
||||
SCRCPY_VERSION_NAME=1.15.1
|
||||
|
||||
PLATFORM=${ANDROID_PLATFORM:-29}
|
||||
BUILD_TOOLS=${ANDROID_BUILD_TOOLS:-29.0.2}
|
||||
|
||||
Reference in New Issue
Block a user