Skip to content

图标 — Phosphor ​

内置 Phosphor 图标集,不需要引入图标依赖,也不需要往 res/drawable 里塞 SVG。

基本用法 ​

kotlin
Icon(imageVector = Phosphor.Bold.Lock, contentDescription = null)
Icon(imageVector = Phosphor.Fill.Heart, contentDescription = "收藏")

// 默认字重的快捷入口(= Bold)
Icon(imageVector = Phosphor.CloudSlash, contentDescription = null)

配合 IconButton / ActionImageButton:

kotlin
ActionImageButton(
    icon = Phosphor.Gear,
    onAction = { openSettings() },
    contentDescription = "设置",
)

按状态切字形(实心 / 描边):

kotlin
BottomNavItem("首页", icon = Phosphor.Bold.House, selectedIcon = Phosphor.Fill.House)

参数 ​

六个字重 ​

字重说明
Phosphor.Thin最细
Phosphor.Light细
Phosphor.Regular常规(Phosphor 官方默认字重)
Phosphor.Bold粗
Phosphor.Fill实心
Phosphor.Duotone双色(背景层带 fillAlpha)

每个字重 1512 个图标,用 Phosphor.字重.图标名 取。

默认字重快捷入口 ​

Phosphor.图标名 是 Phosphor.Bold.图标名 的别名 —— PhosphorDefault.kt 里有 1512 个这样的顶层扩展属性,一份对应一个图标。存量代码里的 Phosphor.Xxx 继续可用。

图标本身的规格 ​

项值
默认尺寸24.dp × 24.dp
viewport256 × 256
填充色Color.Black(实际颜色由 Icon(tint = …) 决定)

要点 ​

  • 颜色由 Icon(tint = …) 控制,不要去改图标本身。 图标构建出来是黑色的,直接塞进自定义绘制里会得到纯黑;正常用法都是 Icon(imageVector = …, tint = MaterialTheme.colorScheme.onSurface)。
  • 形状会由 Icon 的 modifier 缩放,但字重不会跟着变。 想要 16dp 的图标就把 Modifier.size(16.dp) 传下去,不要去找「小号字重」—— 没有那个东西。
  • 新代码建议显式写字重(Phosphor.Regular.House),别用 Phosphor.House 这种省略形式。省略形式的含义是「跟着默认字重走」,将来默认字重一变,所有用法会一起变。
  • Fill 是实心、Bold 是描边,做选中 / 未选中两态时用这一对,别用 Bold / Regular(粗细差太小时切换看不出来)。
  • Duotone 是双色(背景层带 fillAlpha),它在 Icon 的单色 tint 下只会渲染成「浅一层的同色」+ 主色。想要两种颜色得自己画,Icon 给不了。
  • 找不到图标时先确认名称:Phosphor 的命名是 Heart / HeartStraight / HeartHalf / HeartBreak / Heartbeat 这种,不是「心形」的意译。搜不到就换一个同义名(MagnifyingGlass 而不是 Search)。

说明 ​

  • 图标是扩展属性,首次访问时才构建 ImageVector 并缓存。 所以「1512 × 6 = 9072 个图标」全部躺在库里也不会让冷启动变慢 —— 用多少建多少,不用操心体积。反过来,同一个图标重复取用只会命中缓存,不会重复构建。
  • 为什么不做成 R.drawable / SVG 资源:作为扩展属性挂在对象上,取用是编译期可检查的 —— 名字写错编译就报错,而不是运行时画出一片空白。放进 res/drawable 的话错误只能在运行期发现,而且每个图标都要多一份资源 ID。
  • 按首字母分文件存放(PhosphorBoldA.kt … PhosphorBoldX.kt 等),单个文件不会大到没法打开。这也是全部 1512 个图标能放进一个模块的原因。
  • Phosphor.kt 本身只是一个命名空间入口 —— 里面只有六个空对象(Thin / Light / Regular / Bold / Fill / Duotone),图标本身在各自的分文件里以扩展属性声明。
  • 默认字重别名的生成方式是脚本(generate_phosphor_kt.js),所以那 1512 个别名不要手改 —— 重跑生成会覆盖掉。