2011-10-14 13 views
21

Tengo una IU donde el diseño de la raíz es un RelativeLayout. Tiene una serie de Vistas, como campos, botones, etc.¿Cómo funciona SetDrawingCacheEnabled() de Android?

También hay otros dos paneles que son inicialmente invisibles. Cuando el usuario hace clic en un botón, uno de estos paneles se desliza desde la izquierda, otro se desliza desde la parte inferior. El problema es que la velocidad de cuadros es patética en un Nexus S.

Quiero usar setDrawingCacheEnabled (true) para (espero) acelerar la animación de estos dos paneles. Como un ejemplo simplificado, aquí está más o menos cómo me deslizo en uno de estos paneles. Lo llamaré "panel detallado".

public class MyActivity extends Activity { 
    // Initially invisible. 
    private View detailPanel; 

    // A simple slide animation. 
    private Animation detailEnterAnimation; 

    ... 

    public void someButtonClicked(View view) { 
    detailPanel.startAnimation(detailEnterAnimation); 
    detailPanel.setVisibility(View.VISIBLE); 
    detailPanel.setDrawingCacheEnabled(true); 
    } 
} 

Ahora en DetailPanel trato de usar el caché. Tenía la esperanza de que la representación de mapa de bits a través de la caché mejoraría el rendimiento:

public class DetailPanel extends LinearLayout { 
    public void draw(Canvas canvas) { 
    Bitmap cache = getDrawingCache(); 
    if (cache != null) { 
     canvas.drawBitmap(cache, 0, 0, null); 
    } else { 
     super.draw(canvas); 
    } 
    } 
} 

el mapa de bits no es nulo y es del tamaño correcto, pero es completamente negro.

¿Por qué mi mapa de bits es negro? Ese código puede ser obscenamente incorrecto; Probé un millón de cosas diferentes y no puedo entenderlo.

+0

¿Has intentado extender SlidingDrawer? Ya tiene la animación deslizante. –

+0

La animación específica no es realmente lo que busco. Es más que quiero una comprensión general de cómo funciona la memoria caché de dibujo para poder aplicarla a todo tipo de UI. –

+0

Tal vez esto es algo en la dirección correcta: http://android-developers.blogspot.com/2009/01/why-is-my-list-black-android.html – MrJre

Respuesta

2

Es posible que desee construir su caché de dibujo antes de usarlo, de lo contrario se le dará un mapa de bits en blanco

public void someButtonClicked(View view) { 
    detailPanel.startAnimation(detailEnterAnimation); 
    detailPanel.setVisibility(View.VISIBLE); 
    detailPanel.setDrawingCacheEnabled(true); 
    detailPanel.buildDrawingCache(); //may be you need to add this? 
    } 
5

De la documentación Android (http://developer.android.com/reference/android/view/View.html#setDrawingCacheEnabled%28boolean%29):

Habilitar la caché de dibujo es similar a establecer una capa cuando la aceleración de hardware está desactivada. Cuando la aceleración de hardware está activada, habilitar la memoria caché de dibujo no tiene ningún efecto en la representación porque el sistema usa un mecanismo diferente para la aceleración que ignora la bandera. Si desea utilizar un mapa de bits para la vista, incluso cuando la aceleración de hardware esté habilitada, consulte setLayerType (int, android.graphics.Paint) para obtener información sobre cómo habilitar capas de software y hardware.

Quizás este es tu caso?