在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通道?
答案 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
)
}