一款 Android 桌面悬浮窗应用,在屏幕上层播放 GIF 动画,支持拖拽、手动/自动切换角色动画。
- 悬浮窗动画 — 在其他应用之上显示透明 GIF 动画窗口
- 多角色选择 — 支持库洛米、一二、布布及同框动画,可多选组合
- 缩放调节 — 通过 SeekBar 实时调整悬浮窗大小
- 轮播模式 — 可开启自动随机切换,并设置轮播间隔(秒)
- 手势交互
- 拖拽:移动悬浮窗位置(位置自动保存)
- 单击:手动切换下一张动画
- 长按(> 0.5s):打开设置界面
| 项目 | 版本 / 说明 |
|---|---|
| 语言 | Java 21 |
| minSdk | 28 (Android 9) |
| targetSdk | 35 |
| compileSdk | 36 |
| Android Gradle Plugin | 8.13.2 |
| Gradle | 9.5.1 |
| 主要依赖 | AndroidX AppCompat、Preference、Material、HiddenApiBypass |
Yier/
├── build.gradle # 根构建脚本
├── settings.gradle # 模块配置(仅 :yier)
├── gradle.properties # Gradle / AndroidX 全局配置
└── yier/ # 主应用模块
├── build.gradle
├── sign.jks # 签名密钥(本地)
├── src/main/
│ ├── AndroidManifest.xml
│ ├── assets/
│ │ └── assets.zip # GIF 资源包
│ ├── java/rp/yier/
│ │ ├── SettingsActivity.java # 设置页 & 悬浮窗管理
│ │ └── GIFView.java # GIF 渲染 View
│ └── res/ # 布局、偏好设置、图标等
└── proguard-rules.pro
自定义 View,基于 ImageDecoder + AnimatedImageDrawable 播放 GIF,使用硬件加速层渲染,支持等比缩放与无限循环。
启动时从 assets/assets.zip 解压 GIF 资源,按目录前缀分类:
| 前缀 | 角色 |
|---|---|
k/ |
库洛米 |
y/ |
一二 |
x/ |
布布 |
m/ |
一二与布布同框 |
资源通过 mmap 映射到内存,配合 DirectByteBuffer 反射构造,降低大量 GIF 加载时的内存开销。
使用 WindowManager + TYPE_APPLICATION_OVERLAY 创建不可聚焦的透明悬浮窗,需用户授予「显示在其他应用上层」权限(SYSTEM_ALERT_WINDOW)。
- JDK 21
- Android SDK(compileSdk 36、Build Tools 36.1.0)
- Android NDK 29.0.14206865(已在
build.gradle中指定)
# Debug 包
./gradlew assembleDebug
# Release 包(启用 ProGuard 混淆)
./gradlew assembleReleaseWindows 下可使用:
gradlew.bat assembleDebug构建产物位于 yier/build/outputs/apk/。
签名配置位于
yier/build.gradle的signingConfigs,使用模块目录下的sign.jks。首次构建前请确认密钥文件存在。
| 权限 | 用途 |
|---|---|
SYSTEM_ALERT_WINDOW |
创建桌面悬浮窗 |
首次启动时,若未授权悬浮窗权限,应用会自动跳转至系统设置页请求授权。
| 选项 | 说明 |
|---|---|
| 开启动画 | 显示 / 隐藏悬浮窗 |
| 缩放比例 | 调整悬浮窗尺寸(默认 50 为基准) |
| 轮播动画 | 开启后按间隔自动随机切换 |
| 轮播间隔 | 自动切换的时间间隔(秒) |
| 动画选择 | 多选要展示的角色类型 |
未指定开源许可证。使用前请确认 GIF 素材及相关角色的版权归属。