如何将颜色转换为 MaterialColor,以便在我的应用程序中拥有有限的颜色调色板?

Dim*_*las 7 colors dart flutter

对于我的应用程序,我想限制我的颜色调色板,因此我创建了一个充满包含颜色实例的常量的类:


class Colors 
{
  static var red = Color(0xFFFF1212);
  static var blue = Color(0xFF1212FF);
  static var green = Color(0xFF12F1FA);
}

Run Code Online (Sandbox Code Playgroud)

但有时MaterialColor需要a。所以我需要以某种方式将 Color 实例转换为MaterialColor实例。但建造者需要提供一个样本(某种调色板)。我怎样才能做到这一点?

Xpl*_*tsR 8

MaterialColor getMaterialColor(Color color) {
final int red = color.red;
final int green = color.green;
final int blue = color.blue;
final int alpha = color.alpha;

final Map<int, Color> shades = {
  50: Color.fromARGB(alpha, red, green, blue),
  100: Color.fromARGB(alpha, red, green, blue),
  200: Color.fromARGB(alpha, red, green, blue),
  300: Color.fromARGB(alpha, red, green, blue),
  400: Color.fromARGB(alpha, red, green, blue),
  500: Color.fromARGB(alpha, red, green, blue),
  600: Color.fromARGB(alpha, red, green, blue),
  700: Color.fromARGB(alpha, red, green, blue),
  800: Color.fromARGB(alpha, red, green, blue),
  900: Color.fromARGB(alpha, red, green, blue),
};

 return MaterialColor(color.value, shades);
}
Run Code Online (Sandbox Code Playgroud)

我发现这在将颜色转换为材质颜色方面非常准确


Dim*_*las 6

我的一种方法受到这篇文章的启发。我的方法是使用各种不透明度通道,在红色、绿色和蓝色通道上具有固定值。根据此文档,颜色还存储在单独的红色、绿色和蓝色通道中,可以通过实例变量访问这些通道。

有了这些拼图,我做了这个功能:

 MaterialColor getMaterialColor(Color color) {
    final int red = color.red;
    final int green = color.green;
    final int blue = color.blue;

    final Map<int, Color> shades = {
      50: Color.fromRGBO(red, green, blue, .1),
      100: Color.fromRGBO(red, green, blue, .2),
      200: Color.fromRGBO(red, green, blue, .3),
      300: Color.fromRGBO(red, green, blue, .4),
      400: Color.fromRGBO(red, green, blue, .5),
      500: Color.fromRGBO(red, green, blue, .6),
      600: Color.fromRGBO(red, green, blue, .7),
      700: Color.fromRGBO(red, green, blue, .8),
      800: Color.fromRGBO(red, green, blue, .9),
      900: Color.fromRGBO(red, green, blue, 1),
    };

    return MaterialColor(color.value, shades);
  }
Run Code Online (Sandbox Code Playgroud)

使用上面的代码我执行以下操作:

  1. 我提取红绿蓝通道
  2. 我为固定阴影放置了不透明度
  3. 我使用制造的色调并将它们放入MaterialColor

我知道我可以使用第二个参数和色调数量,但这对我来说太麻烦了。就我而言,有某种固定的色调就足够了。