studio - Trabaja alrededor de Canvas.clipPath() que ya no es compatible con Android
hardware acceleration windows 10 (2)
Canvas.clipPath()
soporte Canvas.clipPath()
con aceleración de hardware se ha reintroducido desde API 18 .
La mejor forma de evitar el problema es llamar a setLayerType(View.LAYER_TYPE_SOFTWARE, null)
solo cuando se ejecuta 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 clipPath()
llamada clipPath()
con un bloque try-catch para evitar bloqueos imprevistos de la aplicación:
if (doClip) {
try {
canvas.clipPath(clipPath);
} catch (UnsupportedOperationException e) {
Log.e(TAG, "clipPath() not supported");
doClip = false;
}
}
De todos modos, UnsupportedOperationException nunca debe lanzarse en API> = 18.
Consulte Operaciones de dibujo no admitidas
Desde android 3.0, el método clipPath() ya no se admite en dispositivos con aceleración de hardware activada (lea este article para obtener más detalles).
Estoy trabajando con lienzo y necesito dibujar una imagen redondeada. ¿Alguna idea sobre cómo puedo hacer eso?
* No puedo desactivar la aceleración de hardware, estoy buscando otra solución.
Respondido: Tnx @Malcolm por su respuesta. Encontré un buen ejemplo que demuestra esta técnica , básicamente es una máscara.
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 afectada por alguna de estas características o limitaciones faltantes, puede desactivar la aceleración de hardware solo para la parte afectada de su aplicación llamando a setLayerType (View.LAYER_TYPE_SOFTWARE, null) . De esta forma, aún puede aprovechar la aceleración de hardware en cualquier otro lugar. Consulte Controlar la aceleración de hardware 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 deshabilitar la aceleración de hardware en la parte de la aplicación donde necesita usar los métodos no compatibles en dispositivos con un nivel de API inferior a 18. Puede hacerlo para una vista en particular, no hay necesidad de apagarlo por completo. para toda la aplicación.
Si no desea desactivar la aceleración de hardware, le sugiero usar 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.