Skip to content

一个让 HyperOS 支持 Material You Monet 风格图标的 Python 脚本

License

Notifications You must be signed in to change notification settings

VincentAzz/HyperMonetIconTheme

Repository files navigation

HyperMonetIconTheme

English | 简体中文

Hits

🤔 这是什么

一个让 HyperOS 通过 Magisk 模块支持 Material You Monet 风格图标的 Python 脚本。

本项目通过移植转换并着色 Lawnicons 的SVG图标资源到 HyperOS 规范的 PNG 分层图标资源,为缺乏完整 Material You 图标着色支持且无法使用三方图标包的 HyperOS 提供了优雅的 Monet 风格图标支持。

主要特点:

  • 通过 Magisk 模块安装
  • 兼容 HyperOS 1 & 2
  • 完整移植 Lawnicons 图标包的 7400+ 个高质量svg图标,上游图标库更新频繁,国内外应用支持度高
  • 包含线条和填充两种样式 (Outlined & Filled)
  • 保持 HyperOS 图标原生的连续曲率圆角矩形
  • 支持配置图标前景色和背景色
  • 支持配置图标映射
  • 支持一键锁屏快捷方式
  • 支持 Github Action 云端自动化构建打包 Magisk 模块,无需配置本地环境

Important

需要 root 权限

如果觉得还不错,欢迎给本项目和 Lawnicons 点个Star 🌟


🥳 使用效果

Xiaomi 13 | HyperOS 2 (CN) | Android 15 | Kitsune Mask 27001

1. Outlined 线条

保持 Lawnicons 的原始样式,不进行任何修改

蓝色


红色


绿色


2. Filled 填充

灵感来源于 Niagara Launcher 的 Anycon - Material 样式

在 Outlined 样式的基础之上新增了对图标封闭区域的推断和填充,无封闭区域的图标保持 Outlined

🛠️ 工作原理

不论是Magisk模块还是mtz主题包,MIUI/HyperOS的图标主题核心都在于其中包含的icons文件,其本质是一个去掉后缀的zip包,用来存放图标资源

icons包结构如下:

icons/
  ├─ transform_config.xml
  └─ res/
      └─ drawable-xxhdpi/
            ├─ com.tencent.mm/
            │   ├─ 0.png
            │   └─ 1.png
            ├─ com.coolapk.market/
            │   ├─ 0.png
            │   └─ 1.png
            └─ ...

其中drawable-xxhdpi中存放以对应应用包名命名的目录,每个应用的静态分层图标以png图片形式存在,由背景0.png,图标本体1.png组成,不支持SVG和drawable xml

Lawnicons 包含了大量用于生成动态配色图标的SVG矢量图标,而SVG文件可以通过cairoSVGpil库转换为png并着色。

Lawnicons 还包含了图标-包名的映射文件appfilter.xml,这为生成以包名命名的目录提供了可能。不过其使用了包名/activity而非仅包名来映射图标,一个包名下可能列举了多个activity,同一个包名或图标可能会出现在多个映射条目中,不利于icons包的构建。

本项目的核心是将 Lawnicons 的 SVG 图标转换为 HyperOS 可用的主题资源。脚本主要工作流程如下:

  1. 图标映射处理

    • 解析 Lawnicons 的 appfilter.xml
    • 简化和去重映射数据,确保每个应用只对应一个图标,得到方便使用的icon_mapper.xml,
    • 支持通过 icon_mapper_alt.xml 自定义映射
  2. 图标资源转换

    • 将 SVG 矢量图标转换为 PNG 格式
    • 按指定颜色对图标进行着色
    • 按 HyperOS 主题规范调整图标大小和缩放比例
    • 生成符合 HyperOS 规范的分层图标(背景层和图标层)
  3. 主题包构建

    • 按应用包名组织图标资源
    • 生成符合 HyperOS 规范的 icons 资源包
    • 打包为 Magisk 模块

虽然无法实现真正的端侧动态取色,但通过自定义颜色方案,仍可以实现与壁纸色彩高度统一的 Monet 图标效果。


📖 如何使用

前提条件

  • 确保 HyperOS 已经 root
  • 有一定的折腾动手能力

Step1:基于壁纸获取前景色和背景色

Monet 图标分为前景色和背景色。前景色 FG_COLOR 用作图标线条颜色,背景色 BG_COLOR 用作图标背景底色。通常在亮色模式下,前景色是深色,背景色是浅色;在暗色模式下,前景色是浅色,背景色是深色。

这一步将基于你的壁纸获取合适的前景色 FG_COLOR 和背景色 BG_COLOR

下面提供了几种可行的获取颜色的方式,但似乎都不太优雅:

方式1:取色器

安装任意版本的 Lawnicons,直接截图取色。以获得与 Lawnicons 完全相同的效果

通过取色器选取图标线条 FG_COLOR,选取图标背景颜色 BG_COLOR,例如,下图中获取的是暗色模式下 Lawnicons 图标的前景色。

方式2:Material Theme Builder

将壁纸上传到 Material Theme Builder,以获得完整的 Material You 配色方案

如欲创建深色模式下使用的图标,可在页面右侧下方的 Light Scheme 中选取 (Primary 或 Secondary) Container 即 P-90 或 S-90 作为 FG_COLOR,On (Primary 或 Secondary) Container 即 P-10 或 S-10 作为 BG_COLOR。

如欲创建浅色模式下使用的图标,可在页面右侧下方的 Dark Scheme 中选取 (Primary 或 Secondary) Container 即 P-30 或 S-30 作为 FG_COLOR,On (Primary 或 Secondary) Container 即 P-90 或 S-90 作为 BG_COLOR。

也可根据个人喜好搭配色彩、深浅和对比度

方式3:使用预设颜色值

下面提供了几组样例图片中所使用的配色方案

# 深色主题 蓝色
FG_COLOR = "#d1e2fc"
BG_COLOR = "#1c232b"

# 浅色主题 蓝色
FG_COLOR = "#011c31"
BG_COLOR = "#e8ecf7"
# 深色主题 红色
FG_COLOR = "#fcdbcf"
BG_COLOR = "#2d2017"

# 浅色主题 红色
FG_COLOR = "#331300"
BG_COLOR = "#f5eae4"
# 深色主题 绿色
FG_COLOR = "#c7efac"
BG_COLOR = "#1e241a"

# 浅色主题 绿色
FG_COLOR = "#071e02"
BG_COLOR = "#eaeee0"
# 浅色主题 黑白 (构建速度最快)
FG_COLOR = "#000000"
BG_COLOR = "#ffffff"

Step2:运行脚本

方式1(推荐):通过GitHub Actions在线构建

无需配置环境,直接在线构建:

  1. 确保你有Github账号并登录
  2. Fork 本仓库
  3. 进入 Fork 仓库的 Actions 页面
  4. 点击左侧的 "Build"
  5. 点击右侧的 "Run workflow":
    • 填入先前获取的前景色和背景色(十六进制颜色值,如 #d1e2fc),或使用默认的深蓝色配色
    • 可选添加颜色主题名称(将包含在输出文件名中)
  6. 需要处理7000+个图标,耗时大约6分钟
  7. 待构建完成后下载 Artifacts:magisk_HyperMonetIcon_*.zipmtz_HyperMonetIcon_*.zip,并解压一次

方式2:本地构建

需要配置本地环境:

  1. 下载或克隆本仓库和 Lawnicons develop 分支

  2. 将 lawnicons-develop 目录置于本项目目录下,确保 lawnicons-develop 下不存在更进一步的嵌套目录

    • 应当看起来如下

              

  1. 安装 Python 3.x,务必记住勾选 "Add Python to Path"

  2. 安装包含了 Cairo 图形库的 GTK For Windows Runtime

  3. 安装 cairoSVG 和 pillow,在终端中执行:pip install cairoSVG pillow

  4. 按需编辑 configs/config.py 中 15-16行 的颜色值和 51行 的线程数

  5. 按需编辑 mappers/icon_mapper_alt.xml,自定义图标映射 (建议阅读注释)

  6. 在当前目录下的终端中执行:python HyperMonetIconThemeScript.py

  7. 运行耗时取决于CPU性能和线程数设置,大约需要5分钟

  8. 运行结束后,工件 magisk_HyperMonetIcon_*.zipmtz_HyperMonetIcon_*.mtz 将输出至当前目录


Step3:安装使用

Magisk 模块

  1. 通过 Magisk / Kitsune Mask / KernelSU 刷入 zip 模块
  2. 重启设备
  3. 如需更新图标,建议删除旧模块并重启后再刷入新模块

mtz 主题包 (不推荐)

  1. 确保已经安装 LSPosed 和主题破解
  2. 在主题商店中从SD卡导入 mtz 文件
  3. 进入 模块混搭-图标,使用本主题图标

Warning

务必优先使用 Magisk 模块而非 mtz 主题包

mtz还在测试当中。受版本影响较大,无高级材质,部分图标无法生效,应用开闭动画圆角可能有问题


⚗️ 兼容性

兼容性取决于模板文件。

已测试,一切正常:

  • Xiaomi 13 (CN)

    • HyperOS 2.0.17 (Android 15) + Kitsune Mask 27.1
  • Xiaomi 12S (CN)

    • HyperOS 1.0.24.7.28.DEV (Android 14) + Magisk 26.4

MIUI14及更低版本可能会遇到遮罩圆角问题。

Global 和 EU 系统版本待进一步测试。

其他系统版本、其他分辨率机型待测试补充。


📝 Todos

✅ 已完成

  • 基础实现
  • 自定义图标映射
  • 集成到 Github Action
  • 一键锁屏快捷方式

🚧 进行中

  • 其他快捷方式图标
  • 更多形状及遮罩:Pixel圆形、OneUI风格
  • 兼容性增强

💡 计划中


🙋‍♀️ 提交图标

请向上游 Lawnicons 提交 SVG 图标

图标规则与提交向导 https://github.com/LawnchairLauncher/lawnicons/blob/develop/CONTRIBUTING.md


🥰 链接和资源

金山文档

123云盘: 包含一切需要的文件和预构建包,方便Github下载慢的同学

酷安:@CapybaraSaid/HyperMonetIconTheme,另一种在HyperOS上使用莫奈图标的方法

About

一个让 HyperOS 支持 Material You Monet 风格图标的 Python 脚本

Resources

License

Stars

Watchers

Forks

Packages

No packages published