Trabajar alrededor del lienzo.clipPath () que ya no es compatible con Android


Desde android 3.0 el método clipPath() ya no es compatible en dispositivos con aceleración de hardware activada.(Lea este artículo para más detalles).

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

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

Respondido: Tnx @ Malcolm para su respuesta. Encontré un buen ejemplo que demuestra esta técnica , es básicamente una máscara.

Author: Community, 2012-01-17

2 answers

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

La mejor manera de solucionar el problema es llamar a setLayerType(View.LAYER_TYPE_SOFTWARE, null) solo cuando se está ejecutando en 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 rodeé la llamada clipPath() con un bloque try-catch para evitar bloqueos impredecibles 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.

Ver Operaciones de Dibujo no soportadas

 25
Author: araks,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-07-30 09:35:09

clipPath con la aceleración de hardware solo se admite en el nivel de API 18 y superior, en los niveles de API del 11 al 17 debe desactivarse.

El artículo que has mencionado contiene una pista:

Si su aplicación se ve afectada por cualquiera de estas características o limitaciones que faltan, 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 manera, usted todavía puede tomar ventaja de hardware acceleratin en todas partes. Consulte Control de 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 completamente para todo aplicación.

Si no desea desactivar la aceleración de hardware, entonces le sugeriría usar los modos Porter-Duff. Puede crear un mapa de bits con un círculo en él, luego dibujar su imagen en el lienzo utilizando un modo que recortaría su imagen al contenido original.

 39
Author: Malcolm,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-05-21 19:05:19