如何插值四种颜色?

3
我需要在麦克风可视化器中插值四种颜色。
  • 当用户静音时,显示白色。

  • 当用户轻声说话时,显示红色。

  • 当用户正常说话时,显示黄色。

  • 当用户大声说话时,显示绿色。

我创建了一个void函数来更改颜色,但我不知道如何插值这四种颜色,我只知道如何使用两种颜色进行插值。我需要怎么做?
 // used to take colors mix according to proportion
  private int interpolateColor(final int a, final int b,
                               final float proportion) {
    final float[] hsva = new float[3];
    final float[] hsvb = new float[3];
    Color.colorToHSV(a, hsva);
    Color.colorToHSV(b, hsvb);
    for (int i = 0; i < 3; i++) {
      hsvb[i] = interpolate(hsva[i], hsvb[i], proportion);
    }
    return Color.HSVToColor(hsvb);
  }

  private float interpolate(final float a, final float b,
                            final float proportion) {
    return (a + ((b - a) * proportion));
  }

有不止一种插值函数可供使用,但你可能想要的是:找出你处于哪两种颜色之间,并仅对这两种颜色进行插值。 - o11c
1个回答

1

假设您已经确定了用户当前的“音量”(用浮点数表示,其中0是完全静音,1是最大值),那么我会像这样做:

float v = userVolume();

if (v < SOFT_CUTOFF)
    color = interpolateColor(SILENT_COLOR, SOFT_COLOR, v/SOFT_CUTOFF);
else if (v < NORMAL_CUTOFF)
    color = interpolateColor(SOFT_COLOR, NORMAL_COLOR, (v-SOFT_CUTOFF)/(NORMAL_CUTOFF-SOFT_CUTOFF));
else
    color = interpolateColor(NORMAL_COLOR, LOUD_COLOR, (v-NORMAL_CUTOFF)/(1-NORMAL_CUTOFF));

SOFT_CUTOFF和NORMAL_CUTOFF应该设置为0到1之间的值,用于定义它们在何种比例下应成为完整颜色。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接