Android clipPath equivalente para hardware acelerado Ver
La única parte de mi aplicación que todavía se procesa software es la representación de una vista donde necesito dibujar un mapa de bits redondo. Estoy usando clipPath para recortar el mapa de bits que necesito renderizar a la forma redonda.
Entiendo que clipPath no es hardware acelerado, pero estoy buscando un algoritmo que me permita proporcionar la funcionalidad equivalente mediante aceleración de hardware.
Específicamente, necesito crear una región de recorte redondeada de un mapa de bits de origen y tenerla renderizada a mi lienzo.
Si tiene que usar clipPath puede apagar la aceleración de hardware como se muestra a continuación.
<application android:label="@string/application_name" android:hardwareAccelerated="false">
Y también podría controlar la aceleración de hardware entre las capas Application, Activity, Window y View. Información detallada que se describe en este artículo de Aceleración de hardware en el sitio web de desarrollo de Android .
Usted podría intentar esto, aunque no estoy seguro de que sea hardware acelerado:
En onCreate:
- Crear una pintura (llamada bitmapPaint) que utiliza setXfermode: http://developer.android.com/reference/android/graphics/Paint.html#setXfermode(android.graphics.Xfermode)
- Poner un AvoidXfermode , también su obsoleto, funciona bastante bien. Pase el color blanco y el modo objetivo con una alta tolerancia (como 240)
En onLayout:
- Crear un mapa de bits del mismo tamaño que su vista
- Dibuja tu círculo dentro de su lienzo, en blanco, usando un alias anti para un borde limpio
En onDraw:
- Dibuja el mapa de bits con el círculo blanco en el lienzo de pintura
- Ahora, dibuja tu mapa de bits dentro de tu lienzo de pintura usando el bitmapPaint que creaste en onCreate
El mapa de bits se debe representar dentro del círculo solamente.
Si su mapa de bits no cambia mucho, clip de una vez a la forma en un nuevo mapa de bits y, a continuación, dibuje el mapa de bits recortado en su onDraw.
A continuación, se muestra un ejemplo de cómo cortar un círculo de un mapa de bits de origen
Bitmap bitmap = Bitmap.createBitmap(source.getWidth(), source.getHeight(), Bitmap.Config.ARGB_8888); Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG); Canvas canvas = new Canvas(bitmap); paint.setColor(Color.RED); // Draw your shape here canvas.drawCircle(cx, cy, radius, paint); paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN)); canvas.drawBitmap(sourceBitmap, 0, 0, paint);