如何计算在Android上使用alpha通道覆盖两个颜色整数的结果

时间:2019-06-05 14:42:22

标签: android kotlin colors

在Android上,我有两种颜色的alpha通道表示为整数,我需要获取这些颜色的结果颜色彼此叠加(就像我彼此有两个半透明视图一样)。

我已经尝试使用ColorUtils.blendARGB的变体,但这并不是我真正需要的。

我可以很容易地计算出这样的数字:

/**
 * Takes receiver as top color and attempts to overlay it over param color.
 * Result is basically [ColorUtils.blendARGB] but in overlay mode instead of blend mode.
 */
infix fun Int.overlay(bottomColor: Int): Int {
    val ratio = 1 - ((Color.alpha(this) / 255f) * (Color.alpha(bottomColor) / 255f))
    return ColorUtils.blendARGB(ColorUtils.setAlphaComponent(this, 255), ColorUtils.setAlphaComponent(bottomColor, 255), ratio)
}

但是很明显,如果两种颜色都具有alpha通道,则这将不起作用,因为它将完全删除alpha。

如何同时保留两种重叠颜色的Alpha通道?

1 个答案:

答案 0 :(得分:3)

我认为这会融合尊重其alpha的颜色。

@ColorInt infix fun @receiver:ColorInt Int.overlay(@ColorInt bottomColor: Int): Int {
    val topAlpha = Color.alpha(this)
    val bottomAlpha = Color.alpha(bottomColor)
    val alphaSum = bottomAlpha + topAlpha
    return Color.argb(
        Math.min(255, alphaSum),
        (Color.red(bottomColor) * bottomAlpha + Color.red(this) * topAlpha) / alphaSum,
        (Color.green(bottomColor) * bottomAlpha + Color.green(this) * topAlpha) / alphaSum,
        (Color.blue(bottomColor) * bottomAlpha + Color.blue(this) * topAlpha) / alphaSum
    )
}