Инвертировать цвета выделенного Android

Можно ли "инвертировать" цвета в Drawable? Вы знаете, что у вас есть в негативе?

Я знаю, что можно изменить Drawable на черно-белый... как насчет инверсии цветов?

Спасибо!

Ответ 1

После некоторых исследований выяснилось, что решение намного проще, чем я думал.

Вот он:

  /**
   * Color matrix that flips the components (<code>-1.0f * c + 255 = 255 - c</code>)
   * and keeps the alpha intact.
   */
  private static final float[] NEGATIVE = { 
    -1.0f,     0,     0,    0, 255, // red
        0, -1.0f,     0,    0, 255, // green
        0,     0, -1.0f,    0, 255, // blue
        0,     0,     0, 1.0f,   0  // alpha  
  };

  drawable.setColorFilter(new ColorMatrixColorFilter(NEGATIVE));

Ответ 2

Лучший способ сделать это - преобразовать ваш drawable в растровое изображение:

Bitmap fromDrawable = BitmapFactory.decodeResource(context.getResources(),R.drawable.drawable_resource);

И затем инвертируйте его как:

fooobar.com/questions/489284/...

А затем вернитесь к чертежу, если вам нужно:

Drawable invertedDrawable = new BitmapDrawable(getResources(),fromDrawable);

Ответ 3

По вашему ответу я создал короткое расширение Kotlin для Drawable

private val negative = floatArrayOf(
    -1.0f,     .0f,     .0f,    .0f,  255.0f, 
      .0f,   -1.0f,     .0f,    .0f,  255.0f, 
      .0f,     .0f,   -1.0f,    .0f,  255.0f, 
      .0f,     .0f,     .0f,   1.0f,     .0f 
)

fun Drawable.toNegative() {
    this.colorFilter = ColorMatrixColorFilter(negative)
}