以编程方式使 dart 中的十六进制颜色变亮或变暗

jaz*_*bpn 14 color-scheme colors uicolor dart flutter-layout

我正在尝试以编程方式将此哈希颜色代码 #159424 (GREEN-COLOR) 转换为更暗和更亮。如何做到这一点,请帮忙?

使绿色变深

toDarkColor(String hashColor){
  // how to convert that hash string to make green color darker?
}
Run Code Online (Sandbox Code Playgroud)

使绿色更亮

toLightColor(String hashColor){
  // how to convert that hash string to make green color lighter? 
}
Run Code Online (Sandbox Code Playgroud)

Nea*_*arl 49

对于想要变暗或变亮Color而不是十六进制字符串的人

// ranges from 0.0 to 1.0

Color darken(Color color, [double amount = .1]) {
  assert(amount >= 0 && amount <= 1);

  final hsl = HSLColor.fromColor(color);
  final hslDark = hsl.withLightness((hsl.lightness - amount).clamp(0.0, 1.0));

  return hslDark.toColor();
}

Color lighten(Color color, [double amount = .1]) {
  assert(amount >= 0 && amount <= 1);

  final hsl = HSLColor.fromColor(color);
  final hslLight = hsl.withLightness((hsl.lightness + amount).clamp(0.0, 1.0));

  return hslLight.toColor();
}

// usage
final lightRed = lighten(Colors.red);
final darkBlue = darken(Colors.blue, .3);
Run Code Online (Sandbox Code Playgroud)

现场演示


Voi*_*ler 15

我的解决方案基于/sf/answers/4102326861/

extension ColorBrightness on Color {
  Color darken([double amount = .1]) {
    assert(amount >= 0 && amount <= 1);

    final hsl = HSLColor.fromColor(this);
    final hslDark = hsl.withLightness((hsl.lightness - amount).clamp(0.0, 1.0));

    return hslDark.toColor();
  }

  Color lighten([double amount = .1]) {
    assert(amount >= 0 && amount <= 1);

    final hsl = HSLColor.fromColor(this);
    final hslLight =
        hsl.withLightness((hsl.lightness + amount).clamp(0.0, 1.0));

    return hslLight.toColor();
  }
}
Run Code Online (Sandbox Code Playgroud)

有了这个就可以简单地:

Colors.red.darken()
Colors.red.lighten()
Colors.red.lighten(0.1)
Run Code Online (Sandbox Code Playgroud)

只要您导入扩展程序,这适用于任何颜色。


Tie*_*Nam 13

一内衬内置方法:

Color.lerp(myColor, Colors.white, 0.4) // 0 = keep as is, 1 = white
Run Code Online (Sandbox Code Playgroud)

  • 这是最好的答案,它产生与我的答案“不带插件的颜色准确插件”完全相同的色调,但不需要自定义功能。 (2认同)

mr_*_*ore 10

无需插件的色彩准确解决方案

接受的答案在变暗时会改变颜色的色调(色调更饱和)。此外,它的增亮功能会为某些颜色产生 0.3 的纯白色,尽管白色应该只达到 1 的量。

以下两种方法可以不改变色调情况下产生看起来“更深”或“更亮”的基色阴影

import 'package:flutter/material.dart';

/// Darken a color by [percent] amount (100 = black)
// ........................................................
Color darken(Color c, [int percent = 10]) {
    assert(1 <= percent && percent <= 100);
    var f = 1 - percent / 100;
    return Color.fromARGB(
        c.alpha,
        (c.red * f).round(),
        (c.green  * f).round(),
        (c.blue * f).round()
    );
}

/// Lighten a color by [percent] amount (100 = white)
// ........................................................
Color lighten(Color c, [int percent = 10]) {
    assert(1 <= percent && percent <= 100);
    var p = percent / 100;
    return Color.fromARGB(
        c.alpha,
        c.red + ((255 - c.red) * p).round(),
        c.green + ((255 - c.green) * p).round(),
        c.blue + ((255 - c.blue) * p).round()
    );
}
Run Code Online (Sandbox Code Playgroud)

示例:将颜色加深 15%。

final Color darkerGreen = darken(Color(0xFF159424), 15);
Run Code Online (Sandbox Code Playgroud)

如果按照 OP 的要求从十六进制字符串值开始,请使用 JM Taylor 的解决方案:

Color hexToColor(String code) {
    return Color(int.parse(code.substring(0, 6), radix: 16) + 0xFF000000);
}

final Color darkerGreen = darken(hexToColor('#159424'));
Run Code Online (Sandbox Code Playgroud)

注意:它用于 Flutter 项目,因为它使用材质的Color类。

  • 这确实提供了比接受的答案更好的输出颜色。+1 (3认同)

jan*_*tol 7

您可以使用tinycolor包:

TinyColor.fromString("#159424").darken(10).color
Run Code Online (Sandbox Code Playgroud)

编辑:

您可以Color像这样转换回十六进制字符串:

String toHex(Color color) {
  return "#${color.red.toRadixString(16).padLeft(2, "0")}"
      "${color.green.toRadixString(16).padLeft(2, "0")}"
      "${color.blue.toRadixString(16).padLeft(2, "0")}";
}
Run Code Online (Sandbox Code Playgroud)

或者如果你想要不透明度/alpha:

String toHex(Color color) {
  return "#${color.alpha.toRadixString(16).padLeft(2, "0")}"
      "${color.red.toRadixString(16).padLeft(2, "0")}"
      "${color.green.toRadixString(16).padLeft(2, "0")}"
      "${color.blue.toRadixString(16).padLeft(2, "0")}";
}
Run Code Online (Sandbox Code Playgroud)

  • 请记住,TinyColor 未维护,并且在 Flutter &gt;= 2.0 中根本不起作用。 (2认同)

She*_*hid 5

I used withLightness method of HSLColor to lighten the color.

HSLColor.fromColor(Colors.red).withLightness(0.95).toColor()
Run Code Online (Sandbox Code Playgroud)