微信 / QQ 底栏液态玻璃 · WeChat-LiquidGlass

为微信和 QQ 打造的 iOS 26 风格液态玻璃底部导航栏 · LSPosed 模块(libxposed API 102)

✨ 特性

  • 🫧 单 pass AGSL 透镜管线:圆角矩形 SDF 折射、边缘色散、重力传感器高光
  • 💧 玻璃滴选中动效:切换标签时液滴滑动、回弹;支持横向拖拽切换,跟手拉伸、松手吸附
  • 🎯 对齐 KernelSU 管理器:悬浮 pill 宽度贴合内容、4dp 轻模糊 + 容器色垫底、 按压时液滴放大 78/56 并淡入折射、焦点标签放大 1.1×
  • 🔍 背景实时跟随:玻璃折射的是当前页面的真实内容,切页即变
  • 🧩 完整保留原生功能:红点、未读数、图标渐变、长按菜单全部走应用自己的实现
  • 🪟 双宿主:微信与 QQ 共用一套安装器,差异集中在 HostApp 一张表里
  • 🌗 深浅色跟随:读取应用 uiMode,辅以标签色众数探测交叉校验
  • ♿ 降级兜底:Android 12 保留 GPU 模糊与液滴,只少了边缘折射(AGSL 需 13); Android 12 以下退化为轻磨砂;native 模糊库不可用时自动切纯 Java 实现

📦 安装

  1. 准备支持 libxposed API 102 的 LSPosed 环境
  2. 安装 APK,在 LSPosed 中启用(作用域已限定 com.tencent.mm 和 com.tencent.mobileqq, 只勾选想改造的那个也可以)
  3. 强制停止微信 / QQ 后重新打开

已测试:微信 8.0.77 (3160) QQ 9.2.85 (13860) 9.1.52 (9054)

🔍 工作原理

两个应用的主界面结构几乎是双胞胎——内容区铺满全屏,底栏以 layout_gravity=bottom 浮在它上面,同处一个 FrameLayout——所以安装器只有一套:

Hook Instrumentation.callActivityOnResume
  └─ 主界面 Activity:按类名定位底栏(两家资源 ID 都被 AndResGuard 混淆,不可用)
       └─ 布局手术:把底栏搬进 LiquidGlassHostLayout
            ├─ 玻璃层 LiquidGlassView(backdrop = 底栏原本的全屏兄弟)
            ├─ 液滴层 LiquidGlassView(跟随选中项,可拖拽)
            └─ 应用原生底栏(背景已清空)

应用相关的部分全在 HostApp 里:

微信 QQ
包名 com.tencent.mm com.tencent.mobileqq
主界面 Activity ui.LauncherUI activity.SplashActivity
底栏 ui.LauncherUIBottomTabView widget.QQTabWidget(默认)
widget.QQTabLayout(灰度)
切页信号 setTo(int) setCurrentTab(int)
backdrop CustomViewPager tabcontent / ViewPager2
额外处理 — 隐藏自带的 QQBlurViewWrapper

QQ 同一个安装包里带了新旧两套底栏,服务端开关 tab_layout_9065_116522266 默认关闭,即绝大多数用户跑的是 QQTabWidget(android.widget.TabWidget 子类)。 两套都在表里,运行时按实际存在的那个走。

日志 tag:LiquidGlass

🛠️ 构建

无需 Gradle / Android Studio:

./setup-tools.sh   # 下载 android.jar / build-tools 34 / libxposed
./build.sh

产物:LiquidGlass-vX.Y.Z.apk(自动生成 debug 签名)。

可调参数

参数 位置 默认
折射高度 / 边缘带 GlassTuner.onSize() 24dp(同 KernelSU lens())
模糊强度 tuneGlass() 4dp(同 KernelSU blur())
每列额外留白 hugContentWidth() 32dp
底部抬升 GlassConfig.barOffsetDp 12dp
按压放大 / 焦点放大 DropletDragController / DropletPanel 78/56 · 1.1
拖拽形变上限 DropletDragController.STRETCH_LIMIT 0.2

液滴

静止时是一层 10% 的纯色块;按住/拖拽时按 pressProgress 淡入透镜:

lens(refractionHeight = 10dp × p, refractionAmount = 14dp × p,
     depthEffect = true, chromaticAberration = 0.5)

液滴折射的是 页面 + 一份单独绘制的 1.1× 标签副本(KernelSU 的 CombinedBackdrop)。拖拽时看到的放大图标正是这份副本经折射后的样子, 因此液滴层必须压在真实标签之上,而真实标签保持原尺寸——两边都缩放会叠加两次。

动画

滑动/按压完全复刻 KernelSU 的 DampedDragAnimation:五条独立弹簧,参数照搬。

弹簧 阻尼比 / 刚度 驱动
value 1.0 / 1000 位置(以标签为单位,非像素)
velocity 0.5 / 300 归一化速度 → 拉伸形变
press 1.0 / 1000 按压进度
scaleX 0.6 / 250 横向缩放
scaleY 0.7 / 250 纵向缩放

两处易被忽略但决定手感的细节:位置以标签为单位追踪,速度按标签数归一化, 因此不同屏幕密度手感一致;release() 会等液滴接近目标才回落缩放, 这样甩动读起来是一个连贯动作而非"滑动 + 单独缩回"。

点击切换也走同一条路径(press → 移动 → release),与拖拽完全一致。

🙏 致谢

📄 License

MIT

Releases

v0.2.3

Stable

9/27/2026, 1:10:10 PM

修复

  • 修复 QQ 底栏液滴与按钮底色偏到底栏外面(#7)。平板和展开的折叠屏上必现,手机上取决于 QQ 灰度下发的底栏样式
  • 修复微信从钱包等子页返回后,液滴停在原来的标签上不跟随(#9)
  • 修复列表滑到底部时,底栏上方出现白色 / 灰色斑块(#6)
  • 修复 QQ Play 版 8.2.11 上切换标签的钩子挂不上,底栏只能靠启动后的轮询去安装

优化

  • 减少重绘(针对 #10 滑动掉帧):玻璃只在背后内容变化时才重新取背景,画面静止时不再持续满帧重绘;取背景时直接复用页面这一帧已经录好的绘制结果,不再把宿主页面重画一遍
  • Android 12 改用 GPU 玻璃:和 Android 13 及以上同样的模糊与饱和度,只少了边缘折射;液滴和拖拽在 Android 12 上也能用了,以前每帧用 CPU 绘制页面的开销也没有了
  • Android 12 以下的软件磨砂同样只在背后内容变化时才重画

说明

  • 玻璃底下只在渲染线程上跑的动画(点击波纹、部分加载图标)在玻璃里可能会短暂停住,等它结束才更新
  • 之前自己编译安装过 0.2.2 的,签名不同,需要先卸载再安装

兼容性

  • 底栏结构已对照微信 8.0.78 (3180) 反编译核对
  • 底栏结构已对照 QQ 9.3.55 (15858)、9.3.60 (16070)、9.3.70 (16410) 和 Play 版 8.2.11 (1380) 反编译核对

安装方式与要求见 README。更新后请在 LSPosed 中确认作用域,并强制停止目标应用后重新打开。

Assets

1

v0.2.1

Stable

8/31/2026, 12:04:55 PM

新增

  • 切换标签时补回页面平滑过渡动画:两个宿主原本都把页面硬切,现在把滑动交还给应用自己的 ViewPager,与液滴动效同步

修复

  • 修复 QQ 9.3.x 聊天界面弹出键盘时输入框被遮挡
  • 修复 QQ 底栏被导航条遮挡、底部锚点偏移

兼容性

  • 已测试微信 8.0.77 (3160)
  • 已测试 QQ 9.2.85 (13860)

感谢 @tom613951 贡献 liuran001/WeChat-LiquidGlass#3 。

安装方式与要求见 README。更新后请在 LSPosed 中确认作用域,并强制停止目标应用后重新打开。

Assets

1

v0.2.0

Stable

8/30/2026, 8:08:13 PM

新增

  • 新增 QQ 底部导航栏适配,同时支持 QQTabWidget 与灰度发布的 QQTabLayout
  • 支持频道功能开关导致的 Tab 数量变化,底栏会自动重新绑定并刷新布局
  • 微信与 QQ 现共用同一套液态玻璃安装、渲染与交互逻辑

优化

  • 优化底栏宽度、图标居中与高度对齐,兼容 QAuxiliary 隐藏底栏标题
  • 优化液滴边缘形变范围、拖拽手感、激活态颜色及背景模糊过渡
  • 优化深色 / 浅色模式下的颜色、阴影、模糊与底部定位参数
  • 优化页面底部占位,让列表内容可延伸并滚动到悬浮底栏后方
  • 改善 QQ 侧边栏与底栏拖拽之间的手势冲突

修复

  • 修复深浅色切换后底栏下移、尺寸恢复或布局异常
  • 修复 QQ 原生模糊层重新显示造成的底部灰色区域
  • 修复动态页未铺满屏幕底部以及底栏后方出现白色 / 灰色留白
  • 修复拖拽期间红点、图标颜色和模糊效果突变等显示问题

兼容性

  • 已测试微信 8.0.77 (3160)
  • 已测试 QQ 9.2.85 (13860)、9.1.52 (9054)

安装方式与要求见 README。更新后请在 LSPosed 中确认作用域,并强制停止目标应用后重新打开。

Assets

1

v0.1.1

Stable

8/30/2026, 2:18:45 AM

修复

  • 会话列表最后一行不再被悬浮底栏压住。滚动容器的底部留白原先是按「页面高度 − 内容底边」算的,窗口延伸到导航栏之下后这个差值恒为 0,导致留白一直没生效。改为按胶囊的实际占位计算(从胶囊顶边量到屏幕底边再加 8dp),并每帧重新确保 clipToPadding=false——微信会把它改回 true,一旦如此那条留白带就变成纯背景而不是透出内容。

列表中段滚动时行内容照常透过玻璃显示,只有滚到末尾时最后一行才会完全避开胶囊。

其他

  • 构建脚本支持通过 KEYSTORE / KEYSTORE_PASS / KEY_ALIAS / KEY_PASS 环境变量传入正式签名,未设置时回落到本地 debug key

安装方式与要求见 README。需要 Android 13+ 与 LSPosed,作用域勾选微信后强制停止再打开。

Assets

1