【问题标题】:How to change Text color based on background Image - Flutter如何根据背景图像更改文本颜色 - Flutter
【发布时间】:2019-06-23 14:27:19
【问题描述】:

我想根据背景图像更改文本(和图标)颜色以提高可见性。

我试过了: 使用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 的社区的帮助下,我在折叠时更改了它们的颜色。

【问题讨论】:

    标签: dart flutter textcolor


    【解决方案1】:

    颜色类已经有一个计算亮度的方法,称为computeLuminance()

    Color textColor = color.computeLuminance() > 0.5 ? Colors.black : Colors.white;
    

    【讨论】:

    • 如上所述,有时颜色会返回 null。所以我不能在上面使用这个方法
    • 警告:根据 computeLuminance(...) 文档This value is computationally expensive to calculate.
    【解决方案2】:

    我使用下面的方法来找出要使用哪一个(黑色或白色)。

    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);   }
    

    【讨论】:

    • 我的问题主要是获取背景图像的颜色。如果它返回null,我不能用这个方法
    【解决方案3】:

    根据卡片或按钮或标签的背景颜色获取文本颜色有两种方法。

    第一个是:

    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)),
            ),
          ),
        );
      }
    }
    

    【讨论】:

      【解决方案4】:

      你应该像这样创建调色板生成器

      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),
      ); 
      

      注意过滤器参数中的空列表

      【讨论】:

        【解决方案5】:

        对于您可以使用的按钮。这将根据背景自动更改按钮颜色

        buttonTheme: ButtonThemeData(
           buttonColor: Colors.teal[500],
           textTheme: ButtonTextTheme.primary
        )
        

        【讨论】:

          猜你喜欢
          • 2015-12-31
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-06-02
          • 1970-01-01
          • 2023-04-05
          • 2022-10-18
          • 2014-07-25
          相关资源
          最近更新 更多