以编程方式使飞镖中的十六进制颜色变亮或变暗
Programmatically Lighten or Darken a hex color in dart
我正在尝试以编程方式将此散列颜色代码 #159424 (GREEN-COLOR) 转换为更暗和更亮。请问如何操作?
使绿色更深
toDarkColor(String hashColor){
// how to convert that hash string to make green color darker?
}
让绿色变淡
toLightColor(String hashColor){
// how to convert that hash string to make green color lighter?
}
您可以使用 tinycolor 包:
TinyColor.fromString("#159424").darken(10).color
编辑:
您可以像这样将 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")}";
}
或者如果你想要 opacity/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")}";
}
对于想要变暗或变亮的人 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);
Live Demo
由于 TinyColor 的某些部分似乎已损坏,而我真的只需要变亮和变暗,NearHuscarl 的回答对我来说是完美的。
但是,它缺少一个完整回答原始问题所必需的部分,即将散列颜色代码(声明为 String
)转换为 Color
。
为此,您可以使用:
Color hexToColor(String code) {
return Color(int.parse(code.substring(0, 6), radix: 16) + 0xFF000000);
}
以上不是我的代码,而是我从a tutorial here.
那里学到的东西
然后只需将其与 NearHuscarl 的代码结合起来即可获得所需的效果:
final Color darkerGreen = darken(hexToColor('#159424'));
无需插件的颜色准确解决方案
接受的答案在变暗时会改变颜色的色调(色调更饱和)。此外,它的增亮功能会产生纯白色,某些颜色的量为 0.3,尽管白色只能在量为 1 时达到。
以下两种方法产生基色的阴影,看起来'darker'或'lighter'而不改变色调.
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()
);
}
示例:将颜色调暗 15%。
final Color darkerGreen = darken(Color(0xFF159424), 15);
如果按照 OP 的要求从十六进制字符串值开始,请使用 J.M。泰勒解法:
Color hexToColor(String code) {
return Color(int.parse(code.substring(0, 6), radix: 16) + 0xFF000000);
}
final Color darkerGreen = darken(hexToColor('#159424'));
注意:它用于 Flutter 项目,因为它使用 material 的 Color
class.
我的解决方案基于
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();
}
}
有了这个就可以简单地:
Colors.red.darken()
Colors.red.lighten()
Colors.red.lighten(0.1)
只要您导入扩展,这对任何颜色都有效。
我使用了HSLColor
的withLightness
方法来淡化颜色。
HSLColor.fromColor(Colors.red).withLightness(0.95).toColor()
我正在尝试以编程方式将此散列颜色代码 #159424 (GREEN-COLOR) 转换为更暗和更亮。请问如何操作?
使绿色更深
toDarkColor(String hashColor){
// how to convert that hash string to make green color darker?
}
让绿色变淡
toLightColor(String hashColor){
// how to convert that hash string to make green color lighter?
}
您可以使用 tinycolor 包:
TinyColor.fromString("#159424").darken(10).color
编辑:
您可以像这样将 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")}";
}
或者如果你想要 opacity/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")}";
}
对于想要变暗或变亮的人 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);
Live Demo
由于 TinyColor 的某些部分似乎已损坏,而我真的只需要变亮和变暗,NearHuscarl 的回答对我来说是完美的。
但是,它缺少一个完整回答原始问题所必需的部分,即将散列颜色代码(声明为 String
)转换为 Color
。
为此,您可以使用:
Color hexToColor(String code) {
return Color(int.parse(code.substring(0, 6), radix: 16) + 0xFF000000);
}
以上不是我的代码,而是我从a tutorial here.
那里学到的东西然后只需将其与 NearHuscarl 的代码结合起来即可获得所需的效果:
final Color darkerGreen = darken(hexToColor('#159424'));
无需插件的颜色准确解决方案
接受的答案在变暗时会改变颜色的色调(色调更饱和)。此外,它的增亮功能会产生纯白色,某些颜色的量为 0.3,尽管白色只能在量为 1 时达到。
以下两种方法产生基色的阴影,看起来'darker'或'lighter'而不改变色调.
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()
);
}
示例:将颜色调暗 15%。
final Color darkerGreen = darken(Color(0xFF159424), 15);
如果按照 OP 的要求从十六进制字符串值开始,请使用 J.M。泰勒解法:
Color hexToColor(String code) {
return Color(int.parse(code.substring(0, 6), radix: 16) + 0xFF000000);
}
final Color darkerGreen = darken(hexToColor('#159424'));
注意:它用于 Flutter 项目,因为它使用 material 的 Color
class.
我的解决方案基于
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();
}
}
有了这个就可以简单地:
Colors.red.darken()
Colors.red.lighten()
Colors.red.lighten(0.1)
只要您导入扩展,这对任何颜色都有效。
我使用了HSLColor
的withLightness
方法来淡化颜色。
HSLColor.fromColor(Colors.red).withLightness(0.95).toColor()