Как рассчитать результат наложения двух цветовых целых с альфа-каналами на Android - PullRequest
1 голос
/ 05 июня 2019

У меня есть два цвета с альфа-каналами, представленными в Android как целые числа, и мне нужно получить результат, на котором эти цвета накладываются друг на друга (как если бы у меня было два полупрозрачных вида друг на друга).

Я уже пытался использовать варианты 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)
}

Однако это очевидночто это не сработает, если оба цвета имеют альфа-канал, поскольку он полностью удалит альфа-канал.

Как я могу сохранить альфа-канал обоих наложенных цветов?

1 Ответ

3 голосов
/ 05 июня 2019

Я думаю, что это будет смешивать цвета, уважая их альфы.

@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
    )
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...