在这里插入图片描述

一、Icon颜色概述

通过color属性设置图标的颜色,支持多种颜色表示方式。颜色是图标设计中最富表现力的元素之一,能够传递情感、状态和品牌特色。

颜色的作用

合理使用图标颜色可以带来以下效果:

  • 情感传达:不同颜色激发不同的情绪反应
  • 状态表示:用颜色区分正常、警告、错误等状态
  • 品牌强化:使用品牌色增强品牌识别度
  • 视觉引导:通过颜色对比引导用户注意力
  • 无障碍友好:为色盲用户提供多重识别方式

颜色体系分类

图标颜色

语义颜色

功能颜色

品牌颜色

主题颜色

成功-绿色

警告-黄色

错误-红色

信息-蓝色

激活-主色

禁用-灰色

悬停-高亮

按下-深色

二、基础颜色使用

常用色系

Material Design提供了一套预定义的颜色调色板,开发者可以直接使用:

色系 颜色值 应用场景 情感暗示
红色系 Colors.red 错误、删除、重要 警告、紧急
绿色系 Colors.green 成功、完成、通过 积极、肯定
蓝色系 Colors.blue 信息、链接、科技 信任、专业
黄色系 Colors.yellow 警告、注意、待办 谨慎、提醒
橙色系 Colors.orange 通知、提醒、活动 活力、温暖
紫色系 Colors.purple 特殊、高级、创意 神秘、优雅
灰色系 Colors.grey 禁用、次要点、辅助 中性、低调
黑色系 Colors.black 主要内容、重要文本 权威、正式

颜色选择流程

操作图标

状态图标

装饰图标

成功

警告

错误

信息

主要操作

次要操作

确定图标颜色

图标类型

使用主题色

使用语义色

使用品牌色

状态类型

绿色

黄色/橙色

红色

蓝色

重要程度

主题主色

主题辅助色

三、透明度与层次

透明度应用场景

透明度是营造层次感和视觉深度的有效手段:

透明度 视觉效果 使用场景 示例
1.0 完全不透明 正常状态 默认图标颜色
0.8-0.9 轻微透明 次要元素 背景图标
0.5-0.7 中等透明 禁用状态 未激活功能
0.3-0.5 明显透明 背景装饰 空状态插图
0.1-0.3 极度透明 淡化元素 水印、占位

透明度使用原则

  1. 保持可识别性:即使降低透明度,图标应该仍然清晰可辨
  2. 避免过度透明:透明度过低会影响可访问性
  3. 考虑背景对比:透明图标应该与背景有足够对比
  4. 状态一致性:相同状态的图标透明度应该保持一致

四、主题颜色集成

主题颜色类型

Flutter的主题系统提供了丰富的颜色属性供图标使用:

主题属性 说明 使用场景 适用范围
primaryColor 主色调 主要操作、强调内容 应用全局
accentColor 强调色 次要操作、浮动按钮 特定元素
scaffoldBackgroundColor 背景色 与背景对比的图标 大面积背景
cardColor 卡片色 卡片内图标 卡片容器
dividerColor 分隔线色 辅助信息图标 分隔区域

主题颜色优势

使用主题颜色有以下优势:

  • 自动适配:切换主题时自动更新颜色
  • 一致性:保持应用颜色统一
  • 易维护:修改主题一处,全局生效
  • 暗色模式:支持暗色模式自动切换
  • 品牌一致:强化品牌色彩识别

五、状态颜色编码

语义颜色规范

为了提升用户体验,应该遵循通用的颜色语义规范:

状态 颜色 色值示例 触发条件
正常 主色/默认 Colors.blue 标准操作状态
成功 绿色 Colors.green 操作完成、验证通过
警告 黄色/橙色 Colors.orange 注意事项、待确认
错误 红色 Colors.red 操作失败、验证错误
信息 蓝色 Colors.blue 提示消息、帮助信息
禁用 灰色 Colors.grey 不可用状态
加载 蓝色/主题色 Colors.blue 数据加载中
离线 灰色 Colors.grey 网络未连接

状态切换流程

成功

失败

警告

加载

成功

失败

初始状态

操作触发

处理结果

成功状态-绿色

错误状态-红色

警告状态-黄色

加载状态-蓝色

2秒后恢复

完成

结果

六、颜色对比度

对比度标准

为了确保可访问性,图标与背景的对比度需要符合WCAG 2.1标准:

对比度级别 最小对比度 适用场景 用户群体
AA级 4.5:1 标准内容 大多数用户
AAA级 7:1 增强内容 视力障碍用户
大文本AA级 3:1 18pt以上文本 大多数用户
大文本AAA级 4.5:1 18pt以上文本 视力障碍用户

背景适配建议

背景颜色 推荐图标颜色 避免使用的颜色
白色 黑色、深灰 浅灰、淡色
黑色 白色、浅灰 深灰、深色
主题色 白色、黑色 同色系浅色
图片背景 白色+阴影 同色系颜色

七、品牌色应用

品牌色的定义

品牌色是应用独特的颜色标识,通常包括:

  • 主品牌色:用于最重要的UI元素
  • 辅助品牌色:用于次要元素和强调
  • 品牌渐变:用于特殊装饰效果

品牌色使用规范

元素类型 颜色建议 使用原则
核心图标 主品牌色 强化品牌识别
次要图标 辅助品牌色 保持品牌一致性
装饰图标 品牌渐变 营造视觉层次
功能图标 语义颜色 优先功能语义
禁用图标 灰色 表示不可用状态

八、完整示例

class IconColorExample extends StatelessWidget {
  const IconColorExample({super.key});

  
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: const Text('Icon颜色')),
      body: ListView(
        padding: const EdgeInsets.all(16),
        children: [
          _buildColorPaletteCard(),
          const SizedBox(height: 16),
          _buildOpacityCard(),
          const SizedBox(height: 16),
          _buildStatusCard(),
          const SizedBox(height: 16),
          _buildThemeCard(),
        ],
      ),
    );
  }

  Widget _buildColorPaletteCard() {
    return Card(
      child: Padding(
        padding: const EdgeInsets.all(16),
        child: Column(
          crossAxisAlignment: CrossAxisAlignment.start,
          children: [
            const Text(
              '基础色系',
              style: TextStyle(fontSize: 18, fontWeight: FontWeight.bold),
            ),
            const SizedBox(height: 16),
            Wrap(
              spacing: 16,
              runSpacing: 16,
              children: const [
                _ColorIcon(Icons.favorite, '红色', Colors.red),
                _ColorIcon(Icons.thumb_up, '绿色', Colors.green),
                _ColorIcon(Icons.info, '蓝色', Colors.blue),
                _ColorIcon(Icons.warning, '黄色', Colors.yellow),
                _ColorIcon(Icons.error, '橙色', Colors.orange),
                _ColorIcon(Icons.star, '紫色', Colors.purple),
                _ColorIcon(Icons.circle, '灰色', Colors.grey),
                _ColorIcon(Icons.dark_mode, '黑色', Colors.black),
              ],
            ),
          ],
        ),
      ),
    );
  }

  Widget _buildOpacityCard() {
    return Card(
      child: Padding(
        padding: const EdgeInsets.all(16),
        child: Column(
          crossAxisAlignment: CrossAxisAlignment.start,
          children: [
            const Text(
              '透明度层次',
              style: TextStyle(fontSize: 18, fontWeight: FontWeight.bold),
            ),
            const SizedBox(height: 16),
            Row(
              mainAxisAlignment: MainAxisAlignment.spaceAround,
              children: const [
                _OpacityIcon(Icons.favorite, '100%', 1.0),
                _OpacityIcon(Icons.favorite, '75%', 0.75),
                _OpacityIcon(Icons.favorite, '50%', 0.5),
                _OpacityIcon(Icons.favorite, '25%', 0.25),
              ],
            ),
          ],
        ),
      ),
    );
  }

  Widget _buildStatusCard() {
    return Card(
      child: Padding(
        padding: const EdgeInsets.all(16),
        child: Column(
          crossAxisAlignment: CrossAxisAlignment.start,
          children: [
            const Text(
              '状态颜色',
              style: TextStyle(fontSize: 18, fontWeight: FontWeight.bold),
            ),
            const SizedBox(height: 16),
            Row(
              mainAxisAlignment: MainAxisAlignment.spaceAround,
              children: const [
                _StatusIcon(Icons.check_circle, '成功', Colors.green),
                _StatusIcon(Icons.warning, '警告', Colors.orange),
                _StatusIcon(Icons.error, '错误', Colors.red),
                _StatusIcon(Icons.info, '信息', Colors.blue),
              ],
            ),
          ],
        ),
      ),
    );
  }

  Widget _buildThemeCard() {
    return Card(
      child: Padding(
        padding: const EdgeInsets.all(16),
        child: Column(
          crossAxisAlignment: CrossAxisAlignment.start,
          children: [
            const Text(
              '主题颜色',
              style: TextStyle(fontSize: 18, fontWeight: FontWeight.bold),
            ),
            const SizedBox(height: 16),
            Builder(
              builder: (context) {
                final theme = Theme.of(context);
                return Column(
                  children: [
                    Row(
                      mainAxisAlignment: MainAxisAlignment.spaceAround,
                      children: [
                        _ThemeIcon(Icons.star, '主色', theme.primaryColor),
                        _ThemeIcon(Icons.favorite, '次要色', theme.colorScheme.secondary),
                        _ThemeIcon(Icons.brightness_4, '表面色', theme.cardColor),
                      ],
                    ),
                  ],
                );
              },
            ),
          ],
        ),
      ),
    );
  }
}

class _ColorIcon extends StatelessWidget {
  final IconData icon;
  final String label;
  final Color color;

  const _ColorIcon(this.icon, this.label, this.color);

  
  Widget build(BuildContext context) {
    return Container(
      padding: const EdgeInsets.all(12),
      decoration: BoxDecoration(
        color: color.withOpacity(0.1),
        borderRadius: BorderRadius.circular(12),
      ),
      child: Column(
        children: [
          Icon(icon, size: 32, color: color),
          const SizedBox(height: 8),
          Text(label, style: const TextStyle(fontSize: 12)),
        ],
      ),
    );
  }
}

class _OpacityIcon extends StatelessWidget {
  final IconData icon;
  final String label;
  final double opacity;

  const _OpacityIcon(this.icon, this.label, this.opacity);

  
  Widget build(BuildContext context) {
    return Column(
      children: [
        Icon(
          icon,
          size: 48,
          color: Colors.blue.withOpacity(opacity),
        ),
        const SizedBox(height: 8),
        Text(label, style: const TextStyle(fontSize: 12)),
        Text(
          '${(opacity * 100).toInt()}%',
          style: const TextStyle(fontSize: 10, color: Colors.grey),
        ),
      ],
    );
  }
}

class _StatusIcon extends StatelessWidget {
  final IconData icon;
  final String label;
  final Color color;

  const _StatusIcon(this.icon, this.label, this.color);

  
  Widget build(BuildContext context) {
    return Column(
      children: [
        Container(
          padding: const EdgeInsets.all(16),
          decoration: BoxDecoration(
            color: color.withOpacity(0.1),
            borderRadius: BorderRadius.circular(16),
          ),
          child: Icon(icon, size: 48, color: color),
        ),
        const SizedBox(height: 8),
        Text(
          label,
          style: const TextStyle(fontSize: 12, fontWeight: FontWeight.bold),
        ),
      ],
    );
  }
}

class _ThemeIcon extends StatelessWidget {
  final IconData icon;
  final String label;
  final Color color;

  const _ThemeIcon(this.icon, this.label, this.color);

  
  Widget build(BuildContext context) {
    return Column(
      children: [
        Container(
          padding: const EdgeInsets.all(12),
          decoration: BoxDecoration(
            color: color,
            borderRadius: BorderRadius.circular(12),
          ),
          child: Icon(icon, size: 32, color: Colors.white),
        ),
        const SizedBox(height: 8),
        Text(label, style: const TextStyle(fontSize: 12)),
      ],
    );
  }
}

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.csdn.net

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐