Аппаратное ускорение сота не работает с setColorFilter - PullRequest
5 голосов
/ 27 марта 2012

Этот код рисует фигуру одного цвета (с альфа-каналом), используя альфа-канал растрового изображения.

Bitmap alphaMask = bitmap.extractAlpha();
Paint paint = new Paint();
int color = Color.GRAY;
...
paint.setColor(color);
paint.setColorFilter(new PorterDuffColorFilter(color, PorterDuff.Mode.DST_IN));
...
canvas.drawBitmap(alphaMask, x, y, paint);

Например, он возьмет левое растровое изображение и нарисует его на холсте, как это выглядит справа:

enter image description here

Однако в Honeycomb (Android 3.0) он не работает, если включено аппаратное ускорение.Он рисует черную форму, несмотря ни на что.Он игнорирует значение цвета.Тем не менее, он отлично работает на ICS (Android 4.0) с аппаратным ускорением.

Я знаю, что некоторые API не поддерживаются с аппаратным ускорением, так как Romain Guy задокументирован здесь , под Какие операции рисования поддерживаются? , но я, кажется, не использую ни одну из упомянутых как не поддерживаемых.

Кроме того, звучало так, как будто он сказал, что setColorFilter должен работать на этомpost .

Есть ли в моем коде что-то, что не поддерживается в Honeycomb?Есть обходные пути?Я хотел бы оставить аппаратное ускорение в этом случае.

Спасибо

Ответы [ 2 ]

6 голосов
/ 31 марта 2012

Произошла ошибка, связанная с тем, как Android 3.0 обрабатывает растровые изображения alpha8. Мне ужасно жаль, потому что это была моя вина. Однако эта проблема была исправлена ​​в Android 4.0.

Существует два возможных обходных пути: - Установите тип программного слоя на ваш взгляд - Или создайте свой собственный растровое изображение и визуализируйте в нем то, что вам нужно. Затем вы можете нарисовать это растровое изображение поверх аппаратно ускоренного Canvas.

4 голосов
/ 30 марта 2012

Я думаю, что лучший ответ здесь будет от Ромена Гая. Quoth he :

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

Учитывая это утверждение, поведение, которое вы испытываете, является ошибкой.Это один из тех случаев, когда контакт с основным разработчиком, ответственным за , на самом деле является лучшим техническим исправлением, которое может быть предоставлено.

Он опубликовал обходной путь, хотя:

Я проверил реализацию, и аппаратный рендер в настоящее время поддерживает только шейдеры разных типов внутри ComposeShader.Это означает, что вы можете использовать градиент + растровое изображение, но не два растровых изображения или два градиента.Обратите внимание, что для представлений, которые делают вещи, которые не поддерживаются в аппаратном обеспечении, вы можете использовать setLayerType(LAYER_TYPE_SOFTWARE, null), чтобы заставить их визуализировать в программном обеспечении.

Возможно, он опубликует здесь, чтобы еще больше осветить нас всех. Он сделал. :)

...