2011-10-14 12 views
21

Ho un'interfaccia utente in cui il layout radice è un RelativeLayout. Ha un numero di viste, come campi, pulsanti, ecc.Come funziona setDrawingCacheEnabled() di Android?

Ci sono anche altri due pannelli che sono inizialmente invisibili. Quando l'utente fa clic su un pulsante, uno di questi pannelli scorre da sinistra, un altro scorre dalla parte inferiore. Il problema è che il frame rate è patetico su un Nexus S.

Voglio usare setDrawingCacheEnabled (true) per (spero) velocizzare l'animazione di questi due pannelli. Come esempio semplificato, qui è più o meno come faccio a scorrere in uno di questi pannelli. Lo chiamerò "detailPanel".

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); 
    } 
} 

Ora nel DetailPanel provo ad usare la cache. Speravo che il rendering bitmap tramite la cache potrebbe migliorare le prestazioni:

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); 
    } 
    } 
} 

Il bitmap non è nullo ed è la giusta dimensione, ma è completamente nero.

Perché il bitmap è nero? Quel codice potrebbe essere oscenamente sbagliato; Ho provato un milione di cose diverse e non riesco a capirlo.

+0

Hai provato a estendere SlidingDrawer? Ha già l'animazione scorrevole. –

+0

L'animazione specifica non è esattamente ciò che sto cercando. È più che voglio una comprensione generale di come funziona la cache di disegno, quindi posso applicarla a tutti i tipi di interfacce utente. –

+0

Forse questo è qualcosa nella giusta direzione: http://android-developers.blogspot.com/2009/01/why-is-my-list-black-android.html – MrJre

risposta

2

Si consiglia di costruire la cache disegno prima di usarlo, altrimenti Vi darà una bitmap vuota

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

Da documentazione Android (http://developer.android.com/reference/android/view/View.html#setDrawingCacheEnabled%28boolean%29):

L'attivazione della cache disegno è simile per impostare un livello quando l'accelerazione hardware è disattivata. Quando l'accelerazione hardware è attivata, l'abilitazione della cache di disegno non ha alcun effetto sul rendering perché il sistema utilizza un meccanismo diverso per l'accelerazione che ignora il flag. Se si desidera utilizzare una bitmap per la vista, anche quando l'accelerazione hardware è abilitata, vedere setLayerType (int, android.graphics.Paint) per informazioni su come abilitare i livelli software e hardware.

Forse è questo il tuo caso?