Honeycomb Hardware Acceleration, похоже, не работает с setColorFilter

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

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); 

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

Введите описание изображения здесь

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

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

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

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

благодаря

Solutions Collecting From Web of "Honeycomb Hardware Acceleration, похоже, не работает с setColorFilter"

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

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

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

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

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

Однако он сделал обходное решение:

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

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