2012-01-17 7 views
23

Desde android 3.0, el método clipPath() ya no es compatible con dispositivos con aceleración de hardware activada. (Lea esto article para obtener más información).Trabajar alrededor de Canvas.clipPath() que ya no es compatible con Android

Estoy trabajando con lienzo y necesito dibujar una imagen redondeada. ¿Alguna idea sobre cómo puedo hacer eso?

* No puedo apagar la aceleración de hardware, estoy buscando otra solución.

Respondido: Tnx @Malcolm por su respuesta. Encontré un buen ejemplo que demuestra this technique, es básicamente una máscara.

Respuesta

24

Canvas.clipPath() se ha vuelto a introducir el soporte con aceleración de hardware desde API 18.

La mejor manera de evitar el problema está llamando setLayerType(View.LAYER_TYPE_SOFTWARE, null) sólo cuando se está ejecutando en la API del 11 al 17:

if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN_MR2 
     && Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { 
    setLayerType(LAYER_TYPE_SOFTWARE, null); 
} 

también rodeado la llamada clipPath() con un bloque try-catch para evitar la aplicación imprevista accidentes:

if (doClip) { 
    try { 
     canvas.clipPath(clipPath); 
    } catch (UnsupportedOperationException e) { 
     Log.e(TAG, "clipPath() not supported"); 
     doClip = false; 
    } 
} 

de todos modos, UnsupportedOperationException nunca debe ser tirado en la API> = 18.

Ver Unsupported Drawing Operations

+0

¿No es exactamente lo mismo que en la otra respuesta, excepto por la mención del hecho de que la API 18 introdujo el soporte de hardware para ello? Este último debería agregarse, por supuesto. – Malcolm

+0

Sí, es ... Pero agregué la información de API nivel 18, explicaciones y ejemplos de código ... Todo en una respuesta breve. – araks

39

clipPath con aceleración de hardware solo es compatible con API de nivel 18 y superior, en niveles de API de 11 a 17 debe estar desactivado.

El artículo que has mencionado contiene una pista:

Si su aplicación se ve afectado por alguna de estas características o limitaciones que faltan, se puede desactivar la aceleración de hardware para sólo la parte afectada de su solicitud llamando setLayerType(View.LAYER_TYPE_SOFTWARE, null). De esta forma, aún puede aprovechar la aceleración de hardware en cualquier otro lugar. Consulte Controlling Hardware Acceleration para obtener más información sobre cómo habilitar y deshabilitar la aceleración de hardware en diferentes niveles en su aplicación.

La idea principal aquí es desactivar la aceleración de hardware en la parte de la aplicación en la que es necesario utilizar los métodos no admitidos en dispositivos con el nivel de API inferior a 18. Puede hacerlo por un punto de vista particular, no hay necesidad de apagarlo por completo para toda la aplicación.

Si no desea desactivar la aceleración de hardware, le sugiero que utilice los modos de Porter-Duff. Puede crear un mapa de bits con un círculo, luego dibujar su imagen en el lienzo usando un modo que pueda recortar su imagen al contenido original.

+1

Sí, pero solo tengo una vista (generalmente esto es lo que obtuve cuando trabajo con lienzo ...) Así que no puedo apagarlo, es por eso que estoy buscando una solución. –

+0

"Ya no es compatible, solo no está disponible con la aceleración de hardware activada". Los dobles negativos aquí hacen que esta oración sea difícil de leer. Tal vez reformule algo como: "' clipPath' solo está disponible con la aceleración de hardware desactivada ". –

+0

@LeoAccend ¿Por qué no simplemente [sugiere una edición] (http://stackoverflow.com/help/editing) usted mismo? – Malcolm

Cuestiones relacionadas