我想根据背景图像更改文本(和图标)的颜色以提高可见性。
我已经尝试过: 使用palette_generator程序包,检查背景图像的主色,并使用flutter_statusbarcolor程序包的 useWhiteForgroundForColor 函数(返回布尔值)为我的文本选择黑色或白色(和图标)颜色。
问题:有时候,主导色可能为空。在我的测试中,这种情况发生在黑色和白色之间,我不知道有什么方法可以找出哪一种。
Future<bool> useWhiteTextColor(String imageUrl) async {
PaletteGenerator paletteGenerator =
await PaletteGenerator.fromImageProvider(
NetworkImage(imageUrl),
// Images are square
size: Size(300, 300),
// I want the dominant color of the top left section of the image
region: Offset.zero & Size(40, 40),
);
Color dominantColor = paletteGenerator.dominantColor?.color;
// Here's the problem
// Sometimes dominantColor returns null
// With black and white background colors in my tests
if (dominantColor == null) print('Dominant Color null');
return useWhiteForeground(dominantColor);
}
我发现other methods用于其他语言,但是我不知道在dart中实现相同方法的方法。
附加说明: 我的实际代码包括一些其他复杂性。我正在使用SliverAppBar,在这里我想确定当flexibleSpace展开时的标题和图标颜色。当我根据this在社区的帮助下倒塌时,我会更改它们的颜色。
答案 0 :(得分:5)
颜色类别已经有一种计算亮度的方法,称为 computeLuminance()
weak_script_method
答案 1 :(得分:0)
我使用以下方法找出要使用的方法(黑色或白色)。
Color getTextColor(Color color) {
int d = 0;
// Counting the perceptive luminance - human eye favors green color...
double luminance =
(0.299 * color.red + 0.587 * color.green + 0.114 * color.blue) / 255;
if (luminance > 0.5)
d = 0; // bright colors - black font
else
d = 255; // dark colors - white font
return Color.fromARGB(color.alpha, d, d, d); }
答案 2 :(得分:0)
您应该像这样创建调色板生成器
PaletteGenerator paletteGenerator =
await PaletteGenerator.fromImageProvider(
NetworkImage(imageUrl),
filters: [],
// Images are square
size: Size(300, 300),
// I want the dominant color of the top left section of the image
region: Offset.zero & Size(40, 40),
);
注意filters参数中的空白列表
答案 3 :(得分:0)
对于可以使用的按钮。这将根据背景自动更改按钮颜色
buttonTheme: ButtonThemeData(
buttonColor: Colors.teal[500],
textTheme: ButtonTextTheme.primary
)
答案 4 :(得分:0)
有两种方法可以根据卡片或按钮或标签的 BG 颜色获取文本颜色。
第一个是:
Color txColor = color.computeLuminance() < 0.5 ? Colors.white : Colors.black;
第二种是使用 Theme ,其中用户可能有设备的深色主题或浅色主题。
import 'dart:math';
import 'package:flutter/material.dart';
class ColorEstimationPage extends StatelessWidget {
Color _randomBackgroundColor() {
List<Color> colors = [Colors.red, Colors.green, Colors.amber, Colors.black];
return colors[Random().nextInt(colors.length)];
}
/// With this you can get the Color either black or white
Color _textColorForBackground(Color backgroundColor) {
if (ThemeData.estimateBrightnessForColor(backgroundColor) ==
Brightness.dark) {
return Colors.white;
}
return Colors.black;
}
@override
Widget build(BuildContext context) {
Color bgColor = _randomBackgroundColor();
return Scaffold(
backgroundColor: bgColor,
body: Center(
child: Text(
"I'm the correct text color!",
style: TextStyle(color: _textColorForBackground(bgColor)),
),
),
);
}
}