feat: add Paw Play, a cat-friendly Android touch toy

This commit is contained in:
2026-10-24 22:10:58 +08:00
commit fee35d678b
36 changed files with 3459 additions and 0 deletions
+203
View File
@@ -0,0 +1,203 @@
# 猫爪游乐场 · Paw Play
给猫猫玩的 Android 触摸玩具。不是让猫盯着看的视频,而是会对爪子有回应的三个小游戏。
> 在线仓库:<https://git.k1412.top/wuyang/pawplay>
> 下载 APK:<https://git.k1412.top/wuyang/pawplay/releases>
> 开源协议:MIT
本项目已在 **小米 M367FC / Android 17(API 37)/ 2272×3408** 上实机验证,没有使用模拟器。
桌面图标叫 **「猫爪游乐场」**,包名 `com.local.pawplay`,当前版本 **1.0.1**。
![鱼池(横屏)](screenshots/05-fish-landscape.png)
## 三个模式
| 鱼池 | 红点 | 羽毛 |
| --- | --- | --- |
| 6–7 条锦鲤在水里游动、悬停、突然加速。爪子碰到鱼会变成气泡和星星,鱼过一会儿从边缘游回来。 | 经典红点。会停、会突然窜出去;爪子拍到它时整颗点会瞬移,并留下红色余晖。 | 三根暖色羽毛在阳光里慢慢飘。挥爪会带起风,羽毛被吹开、旋转,再慢慢落回来。 |
| ![鱼池](screenshots/01-fish-portrait.png) | ![红点](screenshots/03-laser-portrait.png) | ![羽毛](screenshots/04-feather-portrait.png) |
横屏是更舒服的玩法,竖屏也完整支持。全屏、无状态栏、无导航栏,屏幕常亮。
## 为什么这样设计(给猫,而不是给人)
- **猎物质感**:慢速游动 + 突然加速/停顿 + 方向变化,接近猫会追的小动物。
- **大目标**:鱼和羽毛都做得够大,猫不需要精确点中。
- **全屏任意触摸都有反馈**:不是只有“点中按钮”才算。多指、整只爪子拍下来都有水波、气泡或风。
- **没有失败**:没有分数、倒计时、Game Over、广告、内购、弹窗、联网。
- **不闪屏**:动画平滑,没有高频闪烁;对猫的视觉更友好。
- **声音柔和**:四段很短的轻音效,默认开启,可以一键关掉。不会突然爆音。
- **家长入口藏起来**:要长按角落的爪印 2 秒才会打开,猫乱拍不会误触。
- **不收集数据**:APK 没有申请任何权限,也没有 INTERNET 权限。
- **60fps**:单 Activity + 自绘 View + Choreographer,实测 1191 帧里 1 帧 janky(0.08%)。
## 下载与安装
- Release 里提供已签名的 APK(v1.0.1,约 209 KB)
- 也可以自己从源码构建,见下文
- 安装后桌面图标为 **「猫爪游乐场」**,首次打开默认进入 **鱼池**
## 打开与玩法
1. 在桌面点 **「猫爪游乐场」** 图标。
2. 把平板平放或放在稳定的支架上,让猫猫用爪子直接碰屏幕。
3. 底部提示条会在约 6 秒后自动消失,不挡游戏。
4. 鱼池、红点、羽毛在 **家长设置** 里切换。
### 家长设置
**长按左上角或右上角的爪印 2 秒**(按住不要移动),会出现家长面板:
- 切换 **鱼池 / 红点 / 羽毛**(点一下立即生效,面板不会关,方便继续调)
- **轻柔音效** 开关
- **继续玩**:关闭面板
- **退出游戏**:退出并移除任务
面板打开时按返回键 = 关闭面板;在游戏界面按一次返回键会提示“再按一次返回键可退出”,2 秒内再按一次才退出。这样猫踩到返回手势不会马上退出。
如果猫总是从底部手势退出,可以在系统设置里开启 **屏幕固定**(不同系统叫“应用固定/屏幕钉住”),把游戏固定住;退出时再按系统手势解锁。
## 猫安全与陪玩建议
这不是“把猫交给平板”的产品,建议人陪着玩:
- **贴钢化膜**:猫爪和屏幕都需要保护,软膜容易被抓花。
- **放平/支架**:平板不要放在桌边,避免拍下去;远离水杯。
- **一次 5–10 分钟**:猫出现甩尾、耳朵后压、瞳孔放大、哈气、躲开,就立刻停。
- **不要强迫**:有的猫对屏幕完全没兴趣,这很正常;换成红点或羽毛试试。
- **亮度适中**:晚上不要把亮度拉满;不要在黑暗中长时间玩。
- **注意卫生**:玩完擦一下屏幕;别让猫咬平板边角或充电线。
- **屏幕不是猫抓板**:如果猫开始用爪子刨屏幕边缘,停下来,换实体逗猫棒。
- **不是托管工具**:屏幕互动不能替代真实的追逐、扑咬和陪伴。
## 安装信息
- 应用名:猫爪游乐场
- 包名:`com.local.pawplay`
- 版本:1.0.1(versionCode 2)
- minSdk 26 / targetSdk 35
- 大小:约 209 KB
- 权限:**无**
- 签名:本机自签名(不是应用商店版本)
- APK:从 <https://git.k1412.top/wuyang/pawplay/releases> 下载
安装:
```bash
adb install -r 猫爪游乐场-1.0.1.apk
```
也可以用系统包管理器安装(例如在设备本机的 shell 中):
```bash
pm install -r --user 0 /data/local/tmp/猫爪游乐场-1.0.1.apk
```
启动:
```bash
am start -n com.local.pawplay/.MainActivity
```
## 源码与构建
```
app/
AndroidManifest.xml
build.sh # 不用 Gradle 的构建脚本
src/com/local/pawplay/
MainActivity.java # 全屏、沉浸式、返回键策略
CatPlayView.java # 单 View:场景调度、触摸、家长面板
Scene.java # 场景基类 + 粒子
FishScene.java
LaserScene.java
FeatherScene.java
Particle.java
SoundKit.java
res/ # 图标、字符串、4 个 WAV
keystore/ # 本机自签名密钥(已 gitignore,不提交)
tools/generate_sounds.py # 生成四段轻音效
screenshots/ # 实机截图
```
### 依赖
- JDK 17+
- Android SDK:Android 35 platform 的 `android.jar`
- Android 34 的 `android.jar`(给系统 `aapt2` 做资源链接;35 的资源表 Ubuntu 版 aapt2 读不了)
- build-tools 35 里的 `lib/d8.jar`
- `aapt2`、`apksigner`、`keytool`
- Python 3(只在重新生成音效时需要)
### 构建
```bash
git clone https://git.k1412.top/wuyang/pawplay.git
cd pawplay
TOOLCHAIN=/path/to/toolchain bash app/build.sh
```
如果 `build.sh` 没有执行权限,用 `bash app/build.sh` 即可。
可用环境变量覆盖:
- `ANDROID_JAR`:android-35/android.jar
- `RESOURCE_JAR`:android-34/android.jar
- `D8_JAR`:build-tools/35.0.0/lib/d8.jar
- `AAPT2`:aapt2 可执行文件
- `KEYSTORE` / `STOREPASS` / `KEYPASS`:签名密钥;不提供时会自动生成 `app/keystore/catplay.jks`
输出:`app/猫爪游乐场.apk`。
重新生成音效:
```bash
python3 tools/generate_sounds.py
```
### 技术要点
- 单 Activity + 自定义 `View`,`Choreographer` 驱动,`Canvas` 自绘,无 AndroidX、无 Gradle。
- 三个场景各自持有绘制状态和粒子池;多指触摸直接映射到场景,不依赖按钮。
- 家长面板也是 Canvas 绘制,命中区用 `RectF`;长按进度环和 2 秒阈值在 `CatPlayView` 内。
- 鱼群有目标游动、逃逸、boid 式分离和位置修正,避免叠在一起。
- 音效由 `tools/generate_sounds.py` 合成 44.1kHz/16-bit 单声道 WAV,`SoundPool` 播放。
- 全屏采用 `WindowInsetsController`(API 30+)和旧版 immersive flags;刘海安全区从 `DisplayCutout` 读取。
- 无任何网络或存储权限。
## 验证记录
- 实机:Xiaomi M367FC,Android 17 / SDK 37,2272×3408,400dpi。
- 竖屏、横屏都实际运行并截图。
- `dumpsys gfxinfo`:1191 帧,1 帧 janky(0.08%),50th 5ms,90th 10ms,99th 20ms。
- 返回键:第一次提示,第二次退出(实机验证)。
- 家长面板:长按打开、切换模式、**继续玩**关闭(修复了 1.0 里关闭动画卡在 1.0 导致看起来“没反应”的问题)。
- APK 无权限;安装后桌面图标正常。
## 已知限制
- 普通应用无法屏蔽系统级“上滑回桌面/侧滑返回”手势;需要更严格的防误触时,用系统的屏幕固定。
- 家长面板是自绘 UI,没有单独的 Android 无障碍节点;如需读屏支持可以再加。
- 本 APK 是本机自签名,适合自己安装,不适合直接上架应用商店。
- 猫对屏幕的兴趣差异很大;不感兴趣就换模式或换实体玩具,不要强迫。
## 开源协议
代码以 **MIT License** 开源,见 [LICENSE](LICENSE)。
Copyright (c) 2026 wuyang
如果这个项目让某只猫多扑了两下,欢迎在 Issues 里分享照片和反馈。
## 截图
| 横屏鱼池 | 横屏家长面板 |
| --- | --- |
| ![鱼池](screenshots/05-fish-landscape.png) | ![家长面板](screenshots/06-panel-landscape.png) |
| 横屏红点 | 横屏羽毛 |
| --- | --- |
| ![红点](screenshots/07-laser-landscape.png) | ![羽毛](screenshots/08-feather-landscape.png) |
| 竖屏家长面板 | 触摸反馈 / 返回提示 |
| --- | --- |
| ![竖屏家长面板](screenshots/02-panel-portrait.png) | ![触摸反馈](screenshots/09-touch-back.png) |