在Android Studio(Kotlin)中动态着色可绘制对象

时间:2019-03-04 09:22:16

标签: android kotlin

我正在尝试在一天中的某个时间(小时)之后动态着色草地的图像。基本上,我想检查一天中的时间,并将草地的色相/亮度更改为自定义(预设)设置。例如,在中午,它是标准的绿色图像,在夜间,我希望给它一个蓝色调并将其变暗。在一天中的其他时间类似。

standard green image

我对android studio和kotlin完全陌生,我不知道该怎么做。希望有人能够帮助我。

1 个答案:

答案 0 :(得分:0)

您可能想尝试一下。适合您的情况

只需将此类ColorFilterGenerator复制到您的项目中。

    public class ColorFilterGenerator
{
    /**
 * Creates a HUE ajustment ColorFilter
 * @see http://groups.google.com/group/android-developers/browse_thread/thread/9e215c83c3819953
 * @see http://gskinner.com/blog/archives/2007/12/colormatrix_cla.html
 * @param value degrees to shift the hue.
 * @return
 */
public static ColorFilter adjustHue( float value )
{
    ColorMatrix cm = new ColorMatrix();

    adjustHue(cm, value);

    return new ColorMatrixColorFilter(cm);
}

/**
 * @see http://groups.google.com/group/android-developers/browse_thread/thread/9e215c83c3819953
 * @see http://gskinner.com/blog/archives/2007/12/colormatrix_cla.html
 * @param cm
 * @param value
 */
public static void adjustHue(ColorMatrix cm, float value)
{
    value = cleanValue(value, 180f) / 180f * (float) Math.PI;
    if (value == 0)
    {
        return;
    }
    float cosVal = (float) Math.cos(value);
    float sinVal = (float) Math.sin(value);
    float lumR = 0.213f;
    float lumG = 0.715f;
    float lumB = 0.072f;
    float[] mat = new float[]
    { 
            lumR + cosVal * (1 - lumR) + sinVal * (-lumR), lumG + cosVal * (-lumG) + sinVal * (-lumG), lumB + cosVal * (-lumB) + sinVal * (1 - lumB), 0, 0, 
            lumR + cosVal * (-lumR) + sinVal * (0.143f), lumG + cosVal * (1 - lumG) + sinVal * (0.140f), lumB + cosVal * (-lumB) + sinVal * (-0.283f), 0, 0,
            lumR + cosVal * (-lumR) + sinVal * (-(1 - lumR)), lumG + cosVal * (-lumG) + sinVal * (lumG), lumB + cosVal * (1 - lumB) + sinVal * (lumB), 0, 0, 
            0f, 0f, 0f, 1f, 0f, 
            0f, 0f, 0f, 0f, 1f };
    cm.postConcat(new ColorMatrix(mat));
}

protected static float cleanValue(float p_val, float p_limit)
{
    return Math.min(p_limit, Math.max(-p_limit, p_val));
}
}

现在为您的用例场景。

ImageView meadow = (ImageView)findViewById(R.id.meadow );

    if (its day ){
    meadow.setColorFilter(ColorFilterGenerator.adjustHue(100));
    }else if(its night){
    meadow.setColorFilter(ColorFilterGenerator.adjustHue(162));
    }

PS:您需要根据需要调整色相值。我只是代表了一个例子。

ColorFilterGenreator功劳归于@Richard