SetShadowLayer provoca lento tiempo de dibujo en GridView?
Actualmente estoy trabajando con un GridView que contiene ImageViews y me gustaría sombras detrás de mis imágenes. Hay potencialmente, por ejemplo, 15 imágenes visibles en la cuadrícula en cualquier momento. Trabajando bajo la suposición de que quiero que mi pantalla para hacer a 50fps a aparecer suave, mi matemáticas muestra que quiero que el tiempo de dibujo total de cada ImageView no sea peor que alrededor de 1,3ms.
Eché un vistazo a cómo Romain Guy estaba haciendo sombras en su aplicación Shelves: http://code.google.com/p/shelves/source/browse/trunk/Shelves/src/org/curiouscreature/android/shelves/util/ ImageUtilities.java
- Vista de imagen de Android Autoscroll
- Relleno de ScrollView
- Cuando es necesario ejecutar invalidate () en una vista?
- Diferencia entre setAlpha y setImageAlpha
- Rotación a un ImageView, dentro de un RelativeLayout
Eso parecía tener sentido, así que creé la siguiente clase:
public class ShadowImageView extends ImageView { private static final int SHADOW_RADIUS = 8; private static final int SHADOW_COLOR = 0x99000000; private static final Paint SHADOW_PAINT = new Paint(); static { SHADOW_PAINT.setShadowLayer(SHADOW_RADIUS / 2.0f, 0.0f, 0.0f, SHADOW_COLOR); SHADOW_PAINT.setColor(0xFF000000); SHADOW_PAINT.setStyle(Paint.Style.FILL); } public ShadowImageView(Context context, AttributeSet attrs) { super(context, attrs); } @Override public void onDraw(Canvas canvas) { final int containerWidth = getMeasuredWidth(); final int containerHeight = getMeasuredHeight(); canvas.drawRect( SHADOW_RADIUS / 2.0f, SHADOW_RADIUS / 2.0f, containerWidth - SHADOW_RADIUS / 2.0f, containerHeight - SHADOW_RADIUS / 2.0f, SHADOW_PAINT); } }
(Obviamente esto sólo me da rectángulos negros con sombras, pero fue suficiente para obtener una estimación inicial de rendimiento.)
Desplazarse a través de la cuadrícula estaba bastante agitado, así que comprobé los tiempos de dibujo que estaba recibiendo en el Visor de Jerarquía: ~ 3.5ms por ImageView. Esto sale a alrededor de 19fps en el mejor de los casos.
Sin embargo, si quito la sentencia setShadowLayer (), el Visor de jerarquía muestra tiempos de dibujo alrededor de 0,2ms por ImageView.
Si me olvido de drawRect () y en su lugar crear un parche de nueve con bordes de sombra, llamando setBackgroundResource (R.drawable.my_nine_patch) en onDraw (), veo tiempos de dibujo alrededor de 1,5ms por ImageView.
¿Existen problemas de rendimiento conocidos con Paint con un shadowLayer? ¿Estoy haciendo algo tonto en el código anterior?
- Controlar la visibilidad de la vista desde un recurso
- ¿Cómo obtienes efecto de rizo para extender los límites de vista pasados?
- ImageView no escala en dispositivos de pantalla grande
- Cómo saber si Ver dentro de Desplazamiento es visible completamente o no
- Establecer una imagen en el elemento ListView utilizando SimpleCursorAdapter y ViewBinder
- Creación de una vista de imagen dibujable y zoomable en android
- Cargar imágenes en GridView con Universal Image Loader
- Cómo reasignar una imagen de 9 parches mediante programación a un ImageView?
- Leer la información de Contact usando File Descriptor en android
- Mostrar texto de Kannada en la aplicación de Android