SuperAPI AI 工具集

artwork-seeded-dynamic-scheme

设计与创作

查看项目

更新于 10-17 16:16

技能介绍

用途

该技能用于让作品颜色为界面着色。与 artwork-palette-theming 手动挑选色板(强调色、背景色)并逐个放置不同,本技能从单一“种子颜色”派生出一整套配色方案,并将该方案包裹在对应子树中,使每个按钮、容器和标签都通过角色解析颜色,无需手动放置任何颜色。

主要能力

核心收益在于:每个 onX 角色都与其 X 生成对比配对。手动从色板挑选的前景色,正是导致文字不可读的常见来源。

使用方式

示例代码(已适配):

val seedColor = if (paletteColor == Color.Black) fallbackSeed else paletteColor val animatedSeed by animateColorAsState(seedColor, tween(durationMillis = 800)) val scheme = rememberDynamicColorScheme(seedColor = animatedSeed, isDark = true, style = Vibrant) ThemeWrapper(colorScheme = scheme) { Content(state, actions) }

注意事项(陷阱)

回退判断应比较种子初始化时使用的哨兵值,而不是与 null 比较。种子通常通过 animatable 传入,而它永不为 null——它持有创建时的值。因此“未解析”意味着“仍等于该初始值”,比较必须显式命名它。两个需要有意接受的后果:若作品提取出的颜色恰好就是该哨兵值,则会永远保留回退,因此应选择真实作品很少产生的哨兵值;若提取始终未完成,回退将永久且静默地保留。

对种子做补间并重新派生,绝不要对方案做动画。方案是数十个一起生成的角色,独立动画会让它们交叉——前景可能在飞行途中越过自己的背景——且不存在集合自洽的时刻。对单个种子做动画可让每个中间方案内部保持一致。

没有补间时,切换会读作闪烁而非颜色变化。每个表面、容器、轮廓和标签在同一帧变化,眼睛会将其报告为闪烁。约 800 毫秒足够慢,能读作屏幕在重新着色,又足够短,不会滞后于作品。

派生方案是真实开销,而补间要求每帧派生一次。色调色板生成针对每个不同的种子值运行,因此 800 毫秒动画意味着数十次派生。对单次屏幕过渡尚可;对列表中的每一项则不可,对随滚动变化的种子也不可。若必须低成本,可将动画步进为少量值,而非连续补间。

在内容组合函数顶部读取种子会让整个子树订阅它。种子通常作为外壳持有的 animatable 传入;在最外层组合函数读取其 .value 意味着该动画的每一帧都会重组其下所有内容。应在需要它的最小组合函数中读取,或明知代价地接受——且绝不要在两处读取,那会为一个值加倍订阅。

包裹子树,而非整个应用。主题包裹器应围绕内容组合函数,使应用其余部分保留用户主题。从内部打开的 sheet 和 dialog 会跨窗口边界继承它——这通常正是所需。

固定明暗模式,不要询问系统。按构造即为深色的屏幕应使用固定的 dark 标志派生。在已决定明暗的子树内读取系统设置,会产生与其绘制表面不一致的方案。

在子树内,硬编码颜色是唯一不会跟随的部分。它们并非全都错误——浮在照片或视频上的控件合理地保持白色——但每一个都是规则的例外,而没有写明理由的例外正是规则腐化的方式。

生成风格是每个表面的决策。鲜艳风格比柔和风格保留更多作品色度;同一种子在一个风格下读作“作品的颜色”,在另一个下读作“有品位的淡色”。应在派生方案处选择它,不要让一个应用中的两个表面意外地用不同风格从同一种子派生。

验证方式

派生、包裹与回退应集中在一处,三者彼此相隔几行:

grep -rn --include='*.kt' --exclude-dir=build -B6 "rememberDynamicColorScheme(" .

每个种子回退都是与命名哨兵值的比较,而非 null 检查:

grep -rn --include='*.kt' --exclude-dir=build -B2 -A2 "seedColor = " . | grep -E "== Color.|?:"

种子被动画而方案没有:

grep -rn --include='.kt' --exclude-dir=build "animateColorAsState(" . | grep -i "seed" grep -rn --include='.kt' --exclude-dir=build "animate.*ColorScheme|ColorScheme.*animate" .

第二条命令必须无输出。

主题子树内的硬编码颜色,以便逐一检查是否有写明理由:

grep -rn --include='.kt' --exclude-dir=build -B2 "Color.White|Color.Black"
$(grep -rl --include='
.kt' --exclude-dir=build "rememberDynamicColorScheme(" . | head -1)

目视检查:播放带有强烈色彩作品的内容,然后跳到色调差异很大的作品,观察容器而非背景——真正被派生的方案也会给按钮重新着色。然后将应用切换到浅色主题,确认子树不变,而其后的屏幕跟随变化。

适用场景

适用于需要根据作品颜色动态生成完整配色方案、并让控件自动继承对比配对角色的界面,尤其是单屏过渡场景。

限制

不适合列表中的每一项,也不适合随滚动变化的种子;连续补间会带来每帧派生的开销。硬编码颜色不会跟随方案。若提取未完成,回退会永久且静默保留。