Rust Material Design色彩库material-colors的使用,提供标准化的Material Design调色板和色彩工具

Rust Material Design色彩库material-colors的使用

material-colors是一个非官方的Rust库,提供了Material Design标准调色板和色彩工具的实现。

特性

  • std: 默认启用,禁用后可在有分配器的no_std环境中使用
  • image: 添加从图像提取颜色的支持,需要启用std特性
  • serde: 添加主题和配色方案的JSON序列化支持
  • no-libm: 移除内置的FloatExt特性实现

使用示例

从HEX颜色创建主题

use material_colors::{color::Argb, theme::ThemeBuilder};

let theme = ThemeBuilder::with_source(Argb::from_u32(0xffaae5a4)).build();

// 可以使用生成的主题...

从图像创建主题

use material_colors::{
    image::{FilterType, ImageReader},
    theme::ThemeBuilder,
};

#[tokio::main]
async fn main() -> Result<(), reqwest::Error> {
    let image = reqwest::get("https://picsum.photos/id/866/1920/1080")
        .await?
        .bytes()
        .await?
        .to_vec();

    let mut data = ImageReader::read(image).expect("failed to read image");

    // Lanczos3需要的时间稍长,但能提供最佳的颜色提取像素
    // 如果不满意结果,可以尝试其他FilterType值
    data.resize(128, 128, FilterType::Lanczos3);

    let theme = ThemeBuilder::with_source(ImageReader::extract_color(&data)).build();

    // 可以使用生成的主题...

    Ok(())
}

完整示例代码

// 完整示例:创建Material Design主题并获取配色方案
use material_colors::{
    color::Argb,
    scheme::Scheme,
    theme::{Theme, ThemeBuilder},
};

fn main() {
    // 从HEX颜色创建主题
    let theme = ThemeBuilder::with_source(Argb::from_u32(0xff4285F4)).build();
    
    // 获取亮色和暗色配色方案
    let light_scheme: Scheme = theme.light_scheme.clone();
    let dark_scheme: Scheme = theme.dark_scheme.clone();
    
    // 使用配色方案中的颜色
    let primary_color = light_scheme.primary;
    let secondary_color = light_scheme.secondary;
    
    println!("Primary color: {:?}", primary_color);
    println!("Secondary color: {:?}", secondary_color);
}

安装

在项目目录中运行以下Cargo命令:

cargo add material-colors

或者在Cargo.toml中添加:

material-colors = "0.4.2"

技术细节

  • 最低支持的Rust版本(MSRV)是1.63.0
  • 需要alloc支持,因为使用了大量VecBox
  • 使用了大量浮点运算,在某些平台上可能表现不同

许可证

双许可证:MIT或Apache 2.0


1 回复

Rust Material Design色彩库material-colors使用指南

简介

material-colors是一个Rust实现的Material Design色彩库,提供了标准化的Material Design调色板和色彩工具,帮助开发者在Rust项目中轻松使用Material Design的色彩系统。

安装

Cargo.toml中添加依赖:

[dependencies]
material-colors = "0.1"

基本使用

1. 访问预设颜色

use material_colors::color::MaterialColor;

fn main() {
    // 获取红色500色值
    let red_500 = MaterialColor::Red.get(500);
    println!("Red 500: {:?}", red_500);
    
    // 获取蓝色200色值
    let blue_200 = MaterialColor::Blue.get(200);
    println!("Blue 200: {:?}", blue_200);
}

2. 使用完整的Material调色板

use material_colors::color::{MaterialColor, Color};

fn main() {
    // 获取完整的蓝色调色板
    let blue_palette = MaterialColor::Blue.palette();
    
    // 遍历所有色阶
    for (shade, color) in blue_palette.iter() {
        println!("Blue {}: {:?}", shade, color);
    }
    
    // 使用特定颜色
    let primary_color = blue_palette.get(&500).unwrap();
    println!("Primary color: {:?}", primary_color);
}

高级功能

1. 颜色转换

use material_colors::color::{MaterialColor, Color};

fn main() {
    let color = MaterialColor::Indigo.get(500);
    
    // 转换为HEX字符串
    println!("HEX: {}", color.to_hex());
    
    // 转换为RGB元组
    println!("RGB: {:?}", color.to_rgb());
    
    // 转换为HSL元组
    println!("HSL: {:?}", color.to_hsl());
}

2. 颜色混合

use material_colors::color::{MaterialColor, Color};

fn main() {
    let red = MaterialColor::Red.get(500);
    let blue = MaterialColor::Blue.get(500);
    
    // 混合颜色(50%红色 + 50%蓝色)
    let purple = red.mix(&blue, 0.5);
    println!("Purple: {:?}", purple);
}

3. 颜色亮度调整

use material_colors::color::{MaterialColor, Color};

fn main() {
    let mut color = MaterialColor::Teal.get(500);
    
    // 调亮20%
    let lighter = color.lighten(0.2);
    println!("Lighter: {:?}", lighter);
    
    // 调暗20%
    let darker = color.darken(0.2);
    println!("Darker: {:?}", darker);
}

实用工具

1. 对比度检查

use material_colors::color::{MaterialColor, Color};

fn main() {
    let text_color = MaterialColor::White.get(0); // 白色
    let bg_color = MaterialColor::DeepPurple.get(500); // 深紫色
    
    // 检查对比度是否符合WCAG标准
    let contrast_ratio = text_color.contrast_ratio(&bg_color);
    println!("Contrast ratio: {:.2}", contrast_ratio);
    
    if text_color.has_sufficient_contrast(&bg_color) {
        println!("This color combination meets WCAG AA standards");
    } else {
        println!("This color combination does NOT meet WCAG AA standards");
    }
}

2. 随机颜色生成

use material_colors::color::MaterialColor;

fn main() {
    // 随机获取一个Material颜色
    let random_color = MaterialColor::random();
    println!("Random color: {:?}", random_color);
    
    // 随机获取一个特定色阶的颜色
    let random_shade = random_color.get(700);
    println!("Random shade: {:?}", random_shade);
}

实际应用示例

创建主题色板

use material_colors::color::{MaterialColor, Color};

struct AppTheme {
    primary: Color,
    secondary: Color,
    background: Color,
    surface: Color,
    error: Color,
}

impl AppTheme {
    fn new() -> Self {
        Self {
            primary: MaterialColor::Indigo.get(500),
            secondary: MaterialColor::Pink.get(400),
            background: MaterialColor::Grey.get(50),
            surface: MaterialColor::White.get(0),
            error: MaterialColor::Red.get(400),
        }
    }
}

fn main() {
    let theme = AppTheme::new();
    println!("Primary color: {}", theme.primary.to_hex());
}

响应式颜色调整

use material_colors::color::{MaterialColor, Color};

fn get_color_for_state(is_active: bool) -> Color {
    let base_color = MaterialColor::Blue.get(500);
    
    if is_active {
        base_color.lighten(0.1)
    } else {
        base_color.darken(0.1)
    }
}

fn main() {
    let active_color = get_color_for_state(true);
    let inactive_color = get_color_for_state(false);
    
    println!("Active: {}, Inactive: {}", 
        active_color.to_hex(), 
        inactive_color.to_hex());
}

完整示例

下面是一个完整的示例,展示了如何创建一个简单的GUI应用主题:

use material_colors::color::{MaterialColor, Color};

// 定义应用主题
#[derive(Debug)]
struct AppTheme {
    primary: Color,
    secondary: Color,
    background: Color,
    surface: Color,
    error: Color,
    on_primary: Color,
    on_secondary: Color,
    on_background: Color,
    on_surface: Color,
    on_error: Color,
}

impl AppTheme {
    // 创建浅色主题
    fn light() -> Self {
        Self {
            primary: MaterialColor::Indigo.get(500),
            secondary: MaterialColor::Pink.get(400),
            background: MaterialColor::Grey.get(50),
            surface: MaterialColor::White.get(0),
            error: MaterialColor::Red.get(400),
            on_primary: MaterialColor::White.get(0),
            on_secondary: MaterialColor::Black.get(0),
            on_background: MaterialColor::Black.get(0),
            on_surface: MaterialColor::Black.get(0),
            on_error: MaterialColor::White.get(0),
        }
    }

    // 创建深色主题
    fn dark() -> Self {
        Self {
            primary: MaterialColor::Indigo.get(200),
            secondary: MaterialColor::Pink.get(200),
            background: MaterialColor::Grey.get(900),
            surface: MaterialColor::Grey.get(800),
            error: MaterialColor::Red.get(300),
            on_primary: MaterialColor::Black.get(0),
            on_secondary: MaterialColor::Black.get(0),
            on_background: MaterialColor::White.get(0),
            on_surface: MaterialColor::White.get(0),
            on_error: MaterialColor::Black.get(0),
        }
    }

    // 检查主题的可访问性
    fn check_accessibility(&self) {
        println!("Checking theme accessibility...");
        
        // 检查主要颜色对比度
        let primary_contrast = self.on_primary.contrast_ratio(&self.primary);
        println!("Primary contrast ratio: {:.2}", primary_contrast);
        
        // 检查背景颜色对比度
        let background_contrast = self.on_background.contrast_ratio(&self.background);
        println!("Background contrast ratio: {:.2}", background_contrast);
    }
}

// 按钮组件示例
struct Button {
    text: String,
    background: Color,
    text_color: Color,
}

impl Button {
    fn new(text: &str, background: Color, text_color: Color) -> Self {
        Self {
            text: text.to_string(),
            background,
            text_color,
        }
    }

    fn render(&self) {
        println!("Rendering button '{}'", self.text);
        println!("Background: {}", self.background.to_hex());
        println!("Text color: {}", self.text_color.to_hex());
        
        let contrast = self.text_color.contrast_ratio(&self.background);
        println!("Contrast ratio: {:.2}", contrast);
    }
}

fn main() {
    // 创建浅色主题
    let light_theme = AppTheme::light();
    light_theme.check_accessibility();
    
    // 创建深色主题
    let dark_theme = AppTheme::dark();
    dark_theme.check_accessibility();
    
    // 使用主题创建按钮
    let primary_button = Button::new(
        "Click me", 
        light_theme.primary, 
        light_theme.on_primary
    );
    primary_button.render();
    
    // 创建禁用状态按钮
    let disabled_button = Button::new(
        "Disabled", 
        light_theme.primary.darken(0.3).desaturate(0.5), 
        light_theme.on_primary.lighten(0.2)
    );
    disabled_button.render();
}

总结

material-colors库为Rust开发者提供了完整的Material Design色彩系统实现,包括:

  1. 所有标准Material颜色及其色阶
  2. 颜色转换工具(HEX, RGB, HSL)
  3. 颜色混合和调整功能
  4. 对比度检查和可访问性工具
  5. 实用颜色生成功能

通过这个库,开发者可以轻松地在Rust应用中实现符合Material Design规范的颜色系统。

回到顶部