【问题标题】:Get median color between two colors获取两种颜色之间的中值颜色
【发布时间】:2014-09-14 15:00:15
【问题描述】:

我有 2 个颜色的字符串表示形式(例如:“#FFFFFF”和“#000000”),我正在寻找一种以编程方式获取这两种颜色的中值颜色的方法。我称之为“中值”的颜色将是在中心与这两个相交的颜色。

我需要这个才能分两步绘制渐变:

  • 从第一种颜色到中值的1个渐变
  • 从中间色到第二种颜色的1个渐变

所以它看起来像是从第一种颜色到第二种颜色的 1 个渐变,这是我做不到的。

我怎样才能做到这一点?

【问题讨论】:

  • 为什么不能分别平均三个分量?
  • 您应该指定“中位数”的含义。但我认为它只是每个 RGB 分量的平均值,对吧?
  • 一种颜色可以拆分为 (R,G,B) 或 (H,S,V),然后您可以取单个组件方面的中值。可以进行“伽马”校正,而不是简单的平均,但这里没有必要。 Color.getRed()/Green/Blue, new Color(r, g, b).

标签: java android colors gradient median


【解决方案1】:

你可以试试这个:

new ArgbEvaluator().evaluate(0.5, 0xffffff, 0x000000);

更多信息: http://developer.android.com/reference/android/animation/ArgbEvaluator.html

【讨论】:

  • 不错。我只是想知道为什么它会接受Object 并且在他们要求32-bit int value 的文档中。
  • 这至少需要API-11
  • ArgbEvaluator 只是一个线性插值器
【解决方案2】:

我会分别处理每个 RGB 分量。您可以使用Long.valueOf() 将十六进制解析为数字。平均两个值(根据需要四舍五入),然后使用 Long.toString() 填充到两位数返回到十六进制。

一些我没有测试过的示例代码:

     String colour1 = "#FFFFFF";
     String colour2 = "#000000";

     StringBuilder result = new StringBuilder("#");
     for (int i=0;i<3;i++) {
         String h1 = colour1.substring(i*2+1, 3+(i*2));
         String h2 = colour2.substring(i*2+1, 3+(i*2));

         long l1 = Long.parseLong(h1, 16);
         long l2 = Long.parseLong(h2, 16);

         long mid = (l1 + l2) / 2; //truncating not rounding

         String midStr = Long.toString(mid, 16);
         if (midStr.length() == 1) {
             result.append("0");
         }
         result.append(midStr.toUpperCase());

     }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-11-27
    • 2012-10-26
    • 2019-12-07
    • 2013-07-06
    • 1970-01-01
    • 1970-01-01
    • 2013-08-02
    • 1970-01-01
    相关资源
    最近更新 更多