5

Este código dibuja una forma de un solo color (con alfa) utilizando un canal alfa de mapa de bits.Honeycomb Hardware Acceleration no parece funcionar con 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); 

Por ejemplo, se tomará el mapa de bits a la izquierda y dibujar en el lienzo como aparece a la derecha:

enter image description here

Sin embargo, esto no funciona en Honeycomb (Android 3.0) cuando la aceleración de hardware está activada. Dibuja la forma como negro sin importar qué. Ignora el valor del color. Sin embargo, funciona bien en ICS (Android 4.0) con aceleración de hardware activada.

Sé que algunas API no son compatibles con la aceleración de hardware, como Romain Guy documented here, en ¿Qué operaciones de dibujo son compatibles?, pero parece que no utilizo ninguno de los mencionados como no compatibles.

Además, sonaba como si dijera que setColorFilter debería funcionar at this post.

¿Hay algo en mi código que no sea compatible con Honeycomb? ¿Alguna solución? Me encantaría dejar aceleración de hardware en este caso.

Gracias

Respuesta

6

Hubo un error con la forma en que Android 3.0 manejaba mapas de bits alpha8. Lo siento terriblemente por esto, ya que fue completamente mi culpa. Sin embargo, este problema se corrigió en Android 4.0.

Existen dos soluciones posibles: - Establezca un tipo de capa de software en su vista - O bien, cree su propio mapa de bits y obtenga lo que necesita en él. A continuación, puede dibujar este mapa de bits sobre el lienzo acelerado por hardware.

+0

+1. Muy agradable. ¡Gracias por visitarnos y dejarnos saber! :) – MrGomez

+1

¡Oigan, no se preocupen, ustedes han hecho cosas increíbles con Android, no hay necesidad de disculparse! De todos modos, terminé yendo por la ruta de hacer el dibujo en un mapa de bits y luego dibujar el mapa de bits en el lienzo acelerado por hardware como dijiste. ¡Funciona para mi! Gracias – cottonBallPaws

+0

@littleFluffyKitty Me alegro de que todo salió bien. Gracias, @RomainGuy! – MrGomez

4

creo que la mejor respuesta aquí va a ser de Romain individuo. Quoth he:

Sin embargo, lo que está describiendo debería funcionar bien. Todos los gradientes son compatibles, así como todos los modos de fusión. Por favor, informe errores con casos de prueba reproducibles para cualquier problema que encuentre y los conseguiré corregidos.

Teniendo en cuenta esta afirmación, el comportamiento que está experimentando es un error. Este es uno de esos casos en los que contacting the primary developer responsible es en realidad la mejor solución técnica que se puede proporcionar.

Lo hizo publicar una solución, sin embargo:

he comprobado la aplicación y el procesador de hardware actualmente sólo admite los shaders de diferentes tipos dentro de un ComposeShader. Esto significa que puede usar un gradiente + un mapa de bits, pero no dos mapas de bits o dos degradados . Tenga en cuenta que para Vistas que hacen cosas que no son compatibles con el hardware puede usar setLayerType(LAYER_TYPE_SOFTWARE, null) para forzar para que se procesen en el software.

Quizás él publique aquí para aclararnos más a todos. He did. :)

+0

Gracias por la información. Intenté configurar view.setLayerType (LAYER_TYPE_SOFTWARE, null) pero el lienzo onDraw() recibe todavía hardware acelerado ('canvas.isHardwareAccelerated') y el código aún se produce en los resultados incorrectos. Parece que el lienzo en sí no debe ser acelerado por hardware. – cottonBallPaws

+0

¿Alguien sabe si hay una manera de hacer que el lienzo sea renderizado por software? – cottonBallPaws

+1

Establezca el tipo de capa en el software. Si está obteniendo un lienzo de hardware, es posible que esté configurando la capa en la vista incorrecta. –

Cuestiones relacionadas