Repository navigation
RGBBeat v2.2.0 - 礼物特效修复版
⚠️ 此版本存在严重问题:礼物特效播放时,桌面与本 App 的触摸会被遮挡层挡住(v2.2.0 / v2.2.1 均受影响)。请升级到 v2.2.2。
RGBBeat v2.2.0 — 礼物特效修复版
本版本按维护者要求用修复版覆盖旧代码基线。v2.1.0 的液态玻璃导航栏、Gradle 9.3 / AGP 9.1 工具链与音效相关改动在本版本中不再包含;versionCode 13 > v2.1.0 的 12。
⚠️ 本 APK 为 debug 签名(工程未配置 release keystore)。若你安装的是官方 release 签名版本,需先卸载再安装,签名不一致无法直接覆盖。
礼物特效:居中、透明、完整呈现
- 新增
EffectGlSurfaceView:GLSurfaceView+ OES 外部纹理,片元着色器做自适应背景抠除(局部对比度 + 彩度)。黑 / 白 / 灰 / 渐变底一律变全透明,只保留线条、粒子、星点与彩色流光;视频上下边缘羽化,消除底部雾状硬边。 - 新增
EffectLayout:按素材原始宽高比FIT_CENTER居中,横屏素材(1568×720 / 992×720 / 896×528)完整呈现、不裁切、不拉伸。 - 新增
EffectKeyMode与设置项「背景抠除模式」:自动(默认)/ 纯黑底 / 浅色·白底 / 不抠(排查用),切换后立即重绘,正在播放也生效。 - 新增
EffectTint与设置项「礼物特效颜色」:三段素材统一染色,默认白里粉#FFB7D8(亮部收成白芯、中间调透粉),按亮度调制保留层次;可选心形粉#FF29B7/ 玫瑰紫 / 极光青 / 深海蓝 / 鎏金橙 / 荧光绿 / 中国红 / 素材原色。解决白色线条在浅色界面上不明显、三段颜色不统一的问题。旧版保存过默认「心形粉」的会被一次性迁移到白里粉。 - 修复
TextureView初始GONE导致系统不创建SurfaceTexture、视频永远播不出来;改为始终 VISIBLE 的 GL Surface + ready 回调补播。 - 修复
stop()把轮播索引重置为 -1,导致三段视频永远只播第一段;抽出EffectPicker并加回归测试。 - 修复用只持续一帧的
state.beat做触发条件导致漏触发;改用BeatState.beatSeq单调序号做边沿检测,冷却 12s 防刷屏。 - 震动改为遵循用户开关与强度;补
onError复位、Surface/MediaPlayer成对释放、服务/窗口销毁时完整release()。
一轮逻辑复查后补的两处修复
- 播放状态机可能卡死:
prepareAsync()之后如果解码器迟迟不回调onPrepared/onError(部分 ROM 上 Surface 中途重建、或素材解码器初始化失败时会出现),playing会永久为true,LightRenderer的「未在播放」判断从此恒假,礼物特效再也触发不出来。新增 6 秒prepare看门狗:超时未真正开播就stop()复位,并把「已开播」与「准备中」拆成startedPlaying两个状态。 - 开机后前 12 秒不触发:
lastHighlightTrigger初值为 0,而冷却判断用elapsedRealtime(),开机不足 12 秒时第一拍会被冷却挡掉。初值改为-HIGHLIGHT_COOLDOWN,首次命中立即生效。
设置与工程链路
- 关键修复:设置页写
<包名>_preferences,服务与首页读rgbbeat,两个文件不通,所有设置(含礼物特效开关)改了都不生效;已统一为rgbbeat并自动迁移旧值。 - 补齐设置页与首页的特效开关、特效选择、「立即预览礼物特效」。
- 恢复被误删的
build.gradle/settings.gradle/app/build.gradle。 - 恢复被整段注释掉的 3D 粒子绘制(默认仍关闭)。
- 修正单测仍用旧构造函数签名、SeekBar 默认值与
Prefs不一致等编译/行为问题。 - 三段素材由 HEVC(hvc1)、moov 在文件尾,转为 H.264 Main / yuv420p / moov 前置 / 无音轨,兼容 Android 8.0+ 硬解;原始 HEVC 素材保留在源码包
original-hevc-mp4/。
验证
- 真实构建:JDK 21 + Gradle 8.14 + Android SDK 35,
clean assembleDebug testDebugUnitTestBUILD SUCCESSFUL。 - 45 个 JVM 单元测试全部通过,0 失败(含新增
EffectKeyModeTest/EffectLayoutTest/EffectPickerTest/EffectTintTest)。 - 19 个 XML 与资源引用一致性校验 0 错误。
安装与使用
- Android 8.0+,授予悬浮窗权限;LSPosed 模块需勾选启用并重启。
- 安装本 Release 的 APK(debug 签名;与官方 release 签名不同时需先卸载)。
- 开启服务 → 首页「立即预览礼物特效」即可验证。
- 若换了素材仍有雾状残留:设置 → 高潮礼物特效 → 背景抠除模式,切到对应底色模式。
仓库变更
- README 全面重写:补充礼物特效渲染原理(解码 → OES 纹理 → 自适应抠背景 → FIT_CENTER → 染色 → 预乘 alpha 合成)、特效相关设置项、故障排查(
prepare timeout/ 只播第一段 / 底部灰雾 / motion 模式不触发)、工程结构更新到当前全部类;许可证更正为AGPL-3.0(与仓库LICENSE一致,原文误写为 GPL-3.0)。 - 新增 Gradle Wrapper(
gradlew/gradlew.bat/gradle/wrapper/*,Gradle 8.14),可直接./gradlew assembleDebug。 - 删除旧实现文件:main 分支上的 8 个液态玻璃 Kotlin 文件已移除(见上),仓库内容替换为本版本源码。
与 v2.1.0 的具体差异(覆盖前请确认)
- 远端
HighlightEffectsRenderer仍是TextureView GONE+stop()重置轮播索引的旧实现(视频依旧播不出来、只播第一段),本版本整体重写。 - 覆盖后 main 上不再有 8 个液态玻璃相关 Kotlin 文件:
LiquidBottomTab.kt/LiquidBottomTabs.kt/MainNav.kt及com.kyant.backdrop下 5 个 utils 文件;Gradle 9.3 / AGP 9.1 / Kotlin Compose 工具链也回退到 Gradle 8.14 / AGP 8.5.2 / 纯 Java。 - 远端最后一次提交把礼物特效触发条件改成
energy > 0.1 + 5s 冷却(去掉 beat 条件);本版本用的是BeatState.beatSeq节拍边沿 + 12s 冷却。若希望保留「只要有能量就触发」,把LightRenderer的触发判断改为「能量阈值 或 节拍边沿」即可。 - 提交历史不会丢:发布脚本以远端当前 HEAD 作为新提交的 parent,代码内容被覆盖、历史保留。
已知限制
- GL 色键在运行时编译,阈值位于
EffectGlSurfaceView.FRAGMENT_SHADER(sstep(0.025, 0.14, edge)/sstep(0.05, 0.22, chroma)),不同设备观感可能需要微调。 - 三段 mp4 无 alpha 通道,靠着色器抠背景;纯白界面上的白色线条对比度会偏低。
- 触发条件仍是「节拍命中」。晕车(motion)模式没有音频输入,
beatSeq不递增,因此该模式下礼物特效不会自动触发(手动预览不受影响)。如需该模式也播放,把LightRenderer的触发条件改成「节拍边沿 或 能量超过阈值」即可。