Как преобразовать цвета строки шестнадцатеричных как #b74093
к Color
в флаттере?
Как преобразовать цвета строки шестнадцатеричных как #b74093
к Color
в флаттере?
Ответы:
Во Flutter Color
класс принимает только целые числа в качестве параметров , или есть возможность использовать именованные конструкторы fromARGB
и fromRGBO
.
Таким образом, нам нужно только преобразовать строку #b74093
в целочисленное значение. Также мы должны уважать, что непрозрачность всегда должна быть указана.
255
(полная) непрозрачность представлена шестнадцатеричным значением FF
. Это уже оставляет нас с 0xFF
. Теперь нам просто нужно добавить нашу цветовую строку следующим образом:
const color = const Color(0xffb74093); // Second `const` is optional in assignments.
Буквы могут быть выбраны с большой буквы или нет:
const color = const Color(0xFFB74093);
Начиная с Dart 2.6.0
, вы можете создатьextension
Color
класс для класса, который позволяет использовать шестнадцатеричные строки цвета для создания Color
объекта:
extension HexColor on Color {
/// String is in the format "aabbcc" or "ffaabbcc" with an optional leading "#".
static Color fromHex(String hexString) {
final buffer = StringBuffer();
if (hexString.length == 6 || hexString.length == 7) buffer.write('ff');
buffer.write(hexString.replaceFirst('#', ''));
return Color(int.parse(buffer.toString(), radix: 16));
}
/// Prefixes a hash sign if [leadingHashSign] is set to `true` (default is `true`).
String toHex({bool leadingHashSign = true}) => '${leadingHashSign ? '#' : ''}'
'${alpha.toRadixString(16).padLeft(2, '0')}'
'${red.toRadixString(16).padLeft(2, '0')}'
'${green.toRadixString(16).padLeft(2, '0')}'
'${blue.toRadixString(16).padLeft(2, '0')}';
}
fromHex
Метод также может быть объявлен в mixin
или class
потому , что HexColor
имя должно быть явно указано для того , чтобы использовать его, но расширение полезно для toHex
метода, который может быть использован в неявном виде . Вот пример:
void main() {
final Color color = HexColor.fromHex('#aabbcc');
print(color.toHex());
print(const Color(0xffaabbcc).toHex());
}
Многие другие ответы здесь показывают, как вы можете динамически создать Color
из шестнадцатеричной строки, как я делал выше. Однако это означает, что цвет не может быть const
.
В идеале вы должны назначать свои цвета так, как я объяснил в первой части этого ответа, что более эффективно при многократном создании экземпляров цветов, что обычно имеет место для виджетов Flutter.
HexColor.fromHex
работает, но Color.fromHex
не работает).
0x
просто указывает, что следующие цифры будут проанализированы как шестнадцатеричные 🙃
Color
Класс ожидает , что целое число ARGB. Поскольку вы пытаетесь использовать его со RGB
значением, представьте его как int и добавьте к нему префикс 0xff
.
Color mainColor = Color(0xffb74093);
Если вас это раздражает и вы все еще хотите использовать строки, вы можете расширить Color
и добавить конструктор строк
class HexColor extends Color {
static int _getColorFromHex(String hexColor) {
hexColor = hexColor.toUpperCase().replaceAll("#", "");
if (hexColor.length == 6) {
hexColor = "FF" + hexColor;
}
return int.parse(hexColor, radix: 16);
}
HexColor(final String hexColor) : super(_getColorFromHex(hexColor));
}
использование
Color color1 = HexColor("b74093");
Color color2 = HexColor("#b74093");
Color color3 = HexColor("#88b74093"); // if you wish to use ARGB format
Если вы хотите использовать шестнадцатеричный код цвета в этом формате # 123456, тогда его очень легко использовать, создайте переменные типа Color и присвойте ему следующие значения.
Color myHexColor = Color(0xff123456)
// her you notice I use the 0xff and that is opacity or transparency of the color
// and you can also change these value .
используйте myhexcolor и вы готовы к работе.
если вы хотите изменить непрозрачность цвета непосредственно из шестнадцатеричного кода, тогда измените значение ff в 0xff на значение соответственно из таблицы ниже.
Шестнадцатеричные значения непрозрачности
100% - FF
95% - F2
90% - E6
85% - D9
80% - СС
75% - BF
70% - B3
65% - А6
60% - 99
55% - 8C
50% - 80
45% - 73
40% - 66
35% - 59
30% - 4D
25% - 40
20% - 33
15% - 26
10% - 1А
5% - 0D
0% - 00
Чтобы преобразовать шестнадцатеричную строку в int, выполните:
int hexToInt(String hex)
{
int val = 0;
int len = hex.length;
for (int i = 0; i < len; i++) {
int hexDigit = hex.codeUnitAt(i);
if (hexDigit >= 48 && hexDigit <= 57) {
val += (hexDigit - 48) * (1 << (4 * (len - 1 - i)));
} else if (hexDigit >= 65 && hexDigit <= 70) {
// A..F
val += (hexDigit - 55) * (1 << (4 * (len - 1 - i)));
} else if (hexDigit >= 97 && hexDigit <= 102) {
// a..f
val += (hexDigit - 87) * (1 << (4 * (len - 1 - i)));
} else {
throw new FormatException("Invalid hexadecimal value");
}
}
return val;
}
Пример звонка:
Color color=new Color(hexToInt("FFB74093"));
Простая функция без использования класса:
Color _colorFromHex(String hexColor) {
final hexCode = hexColor.replaceAll('#', '');
return Color(int.parse('FF$hexCode', radix: 16));
}
Вы можете использовать это так:
Color color1 = _colorFromHex("b74093");
Color color2 = _colorFromHex("#b74093");
Color(int.parse('#000000'.replaceAll('#', '0xff')))
Простой способ :
String color = yourHexColor.replaceAll('#', '0xff');
Использование:
Container(
color: Color(int.parse(color)),
)
Есть другое решение. Если вы сохраняете свой цвет как обычную шестнадцатеричную строку и не хотите добавлять к ней непрозрачность (начиная с FF): 1) Преобразуйте вашу шестнадцатеричную строку в int. Чтобы преобразовать шестнадцатеричную строку в целое число, выполните одно из следующих действий:
var myInt = int.parse(hexString, radix: 16);
или
var myInt = int.parse("0x$hexString");
в качестве префикса 0x (или -0x) по умолчанию для int.parse устанавливается основание 16.
2) Добавьте непрозрачность к вашему цвету через код
Color color = new Color(myInt).withOpacity(1.0);
ThemeData
.
Во Flutter создайте цвет из RGB с альфа, используйте
return new Container(
color: new Color.fromRGBO(0, 0, 0, 0.5),
);
Как использовать hex-цвет:
return new Container(
color: new Color(0xFF4286f4),
);
//0xFF -> the opacity (FF for opaque)
//4286f4 -> the hex-color
Hex-цвет с непрозрачностью:
return new Container(
color: new Color(0xFF4286f4).withOpacity(0.5),
);
// или изменить значение "FF"
100% — FF
95% — F2
90% — E6
85% — D9
80% — CC
75% — BF
70% — B3
65% — A6
60% — 99
55% — 8C
50% — 80
45% — 73
40% — 66
35% — 59
30% — 4D
25% — 40
20% — 33
15% — 26
10% — 1A
5% — 0D
0% — 00
Для получения дополнительной информации перейдите по официальной ссылке https://api.flutter.dev/flutter/dart-ui/Color-class.html.
///
/// Convert a color hex-string to a Color object.
///
Color getColorFromHex(String hexColor) {
hexColor = hexColor.toUpperCase().replaceAll('#', '');
if (hexColor.length == 6) {
hexColor = 'FF' + hexColor;
}
return Color(int.parse(hexColor, radix: 16));
}
Text(
'hello world',
style: TextStyle(
color: getColorFromHex('#aabbcc'),
fontWeight: FontWeight.bold,
)
)
Для общего ознакомления. Существует более простой способ использования библиотеки Supercharged . Несмотря на то, что вы можете использовать методы расширения со всеми упомянутыми решениями, вы найдете практический набор пользовательских библиотек.
"#ff00ff".toColor(); // painless hex to color
"red".toColor(); // supports all web color names
Проще, правда?
"#b74093"
? ХОРОШО...
int getColorHexFromStr(String colorStr)
{
colorStr = "FF" + colorStr;
colorStr = colorStr.replaceAll("#", "");
int val = 0;
int len = colorStr.length;
for (int i = 0; i < len; i++) {
int hexDigit = colorStr.codeUnitAt(i);
if (hexDigit >= 48 && hexDigit <= 57) {
val += (hexDigit - 48) * (1 << (4 * (len - 1 - i)));
} else if (hexDigit >= 65 && hexDigit <= 70) {
// A..F
val += (hexDigit - 55) * (1 << (4 * (len - 1 - i)));
} else if (hexDigit >= 97 && hexDigit <= 102) {
// a..f
val += (hexDigit - 87) * (1 << (4 * (len - 1 - i)));
} else {
throw new FormatException("An error occurred when converting a color");
}
}
return val;
}
import 'package:flutter/material.dart';
class HexToColor extends Color{
static _hexToColor(String code) {
return int.parse(code.substring(1, 7), radix: 16) + 0xFF000000;
}
HexToColor(final String code) : super(_hexToColor(code));
}
Импортируйте новый класс и используйте его следующим образом HexToColor('#F2A03D')
Вы можете нажать на Color Widget, и он расскажет вам гораздо глубже о том, как эти буквы обозначают. Вы также можете использовать метод Color.fromARGB () для создания пользовательских цветов, что намного проще для меня. Используйте веб-сайт Flutter Doctor Color Picker, чтобы выбрать любой цвет, который вы хотите для своего приложения флаттера.
Вы можете использовать этот пакет from_css_color, чтобы выйти Color
из шестнадцатеричной строки. Он поддерживает как трех-, так и шестизначную шестнадцатеричную запись RGB.
Color color = fromCSSColor('#ff00aa')
Для оптимизации создайте экземпляр Color один раз для каждого цвета и сохраните его где-нибудь для дальнейшего использования.