外观
图标 — 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 |
| viewport | 256 × 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 个别名不要手改 —— 重跑生成会覆盖掉。