Seal应用内主题编辑器:颜色选择器的实现

Seal应用内主题编辑器:颜色选择器的实现

【免费下载链接】Seal 🦭 Video/Audio Downloader for Android, based on yt-dlp, designed with Material You 【免费下载链接】Seal 项目地址: https://gitcode.com/gh_mirrors/se/Seal

在移动应用设计中,主题定制已成为提升用户体验的重要功能。Seal作为一款基于Material You设计的音视频下载工具,其主题编辑器允许用户通过直观的颜色选择器调整应用界面风格。本文将深入解析Seal颜色选择器的技术实现,包括色彩理论基础、核心算法模块及UI交互逻辑。

色彩系统架构

Seal的主题编辑功能建立在现代色彩理论基础上,采用HCT(色相-色度-色调)色彩模型实现精确的颜色控制。该系统通过Monet引擎将用户选择的基础色扩展为完整的主题色板,确保界面元素间的色彩和谐。

核心色彩模型

HCT模型是Seal颜色系统的核心,它将传统的RGB颜色空间转换为更符合人类视觉感知的维度:

  • 色相(Hue):颜色的基本属性(如红、绿、蓝)
  • 色度(Chroma):颜色的鲜艳程度
  • 色调(Tone):颜色的明暗程度

HCT实现代码位于color/src/main/java/io/material/hct/Hct.kt,通过该类可实现RGB与HCT颜色空间的相互转换。

主题色板生成

Monet引擎根据用户选择的基础色和风格偏好生成完整的主题色板,包含以下关键组件:

  • Accent系列:用于强调按钮、标题等交互元素
  • Neutral系列:用于背景、文本等基础元素

色板生成逻辑在color/src/main/java/com/kyant/monet/Monet.kt中实现,通过dynamicColorScheme()函数为浅色/深色模式提供不同的色彩配置。

颜色选择器实现

调色盘样式

Seal提供多种预设调色盘样式,用户可根据喜好选择不同的色彩组合方案。这些样式定义在color/src/main/java/com/kyant/monet/PaletteStyle.kt中,包括:

样式名称特点适用场景
TonalSpot主色鲜艳,辅助色柔和平衡视觉重点
Spritz低饱和度,高对比度阅读类界面
Vibrant高饱和度,强视觉冲击多媒体应用
Expressive冷暖色对比,情感化设计创意类应用

每个样式通过ColorSpec配置不同的色度曲线和色相偏移,例如Vibrant样式的实现:

val Vibrant: PaletteStyle = PaletteStyle(
    accent1Spec = ColorSpec({ 48.0 }) { 0.0 },
    accent2Spec = ColorSpec({ 24.0 }) { it.hueRotation(VibrantSecondaryHueRotation) },
    accent3Spec = ColorSpec({ 32.0 }) { it.hueRotation(VibrantTertiaryHueRotation) },
    neutral1Spec = ColorSpec({ 10.0 }) { 0.0 },
    neutral2Spec = ColorSpec({ 12.0 }) { 0.0 }
)

色相旋转算法

为确保辅助色与主色协调,Seal实现了基于色相环的自动旋转算法。该算法根据主色的色相值,通过预设的旋转规则计算辅助色的最佳位置,代码位于PaletteStyle.kthueRotation()函数:

private fun Double.hueRotation(list: Array<Pair<Int, Int>>): Double {
    var i = 0
    val size = list.size - 2
    if (size >= 0) {
        while (true) {
            val i2 = i + 1
            val intValue = (list[i2]).first.toFloat()
            when {
                list[i].first <= this && this < intValue -> {
                    return (this + list[i].second.toDouble()).mod(360.0)
                }
                i == size -> break
                else -> i = i2
            }
        }
    }
    return this
}

色彩_utils工具类

颜色选择器依赖多个工具类处理色彩计算:

UI交互实现

颜色拾取界面

主题编辑器的UI组件位于应用的ui模块,通过自定义视图实现颜色拾取器:

  • 色相环:用于选择基础色相
  • 色度/色调网格:调整颜色的鲜艳度和明暗
  • 实时预览:即时显示颜色变化效果

动态主题应用

用户选择颜色后,系统通过LocalTonalPalettes将新的色彩配置应用到整个应用:

val LocalTonalPalettes = staticCompositionLocalOf {
    Color(0xFF007FAC).toTonalPalettes()
}

该代码位于Monet.kt,通过Compose的CompositionLocal机制实现主题状态的全局管理。

实际应用效果

主题切换示例

以下是不同调色盘样式的实际应用效果:

Vibrant样式

Vibrant样式

TonalSpot样式

TonalSpot样式

Expressive样式

Expressive样式

Monochrome样式

Monochrome样式

深色/浅色模式适配

Seal的颜色系统自动适配深色/浅色模式,通过Monet.kt中的dynamicColorScheme()函数实现两套色彩配置,确保在不同光线环境下都能提供良好的视觉体验。

开发指南

颜色API使用

开发人员可通过以下API获取主题颜色:

// 获取主色调
val primaryColor = 40.a1
// 获取背景色
val backgroundColor = 98.n1

其中a1代表accent1系列,n1代表neutral1系列,数字表示色调值(0-100)。

自定义调色盘

如需添加自定义调色盘样式,可参考PaletteStyle.kt中的现有实现,通过配置ColorSpec定义新的色彩规则。

总结

Seal的主题编辑器通过HCT色彩模型和Monet引擎,为用户提供了直观而强大的颜色定制功能。核心实现位于color模块,通过分离色彩计算与UI交互,确保了系统的灵活性和可维护性。无论是普通用户还是开发人员,都能通过这套系统轻松创建符合个人喜好的应用主题。

完整的主题编辑功能源码可在app/src/main/java/com/junkfood/seal/ui/目录下查看,包含颜色选择器的UI实现和状态管理逻辑。

【免费下载链接】Seal 🦭 Video/Audio Downloader for Android, based on yt-dlp, designed with Material You 【免费下载链接】Seal 项目地址: https://gitcode.com/gh_mirrors/se/Seal

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值