2011-10-14 9 views
21

Mam interfejs użytkownika, w którym układem głównym jest RelativeLayout. Ma wiele widoków, takich jak pola, przyciski itp.Jak działa setDrawingCacheEnabled() Androida?

Istnieją również dwa inne panele, które początkowo są niewidoczne. Gdy użytkownik kliknie przycisk, jeden z tych paneli zostanie przesunięty z lewej strony, a drugi zsunie się od dołu. Problem polega na tym, że liczba klatek na sekundę jest żałosna na Nexusie S.

Chcę użyć setDrawingCacheEnabled (true), aby (mam nadzieję) przyspieszyć animację tych dwóch paneli. Jako uproszczony przykład, poniżej przybliżam sposób wsuwania w jeden z tych paneli. Nazwę to "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); 
    } 
} 

Teraz w DetailPanelu staram się korzystać z pamięci podręcznej. Miałam nadzieję, że renderowanie bitmap poprzez cache by poprawić wydajność:

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

bitmapa jest niezerowe i jest odpowiedniej wielkości, ale jest całkowicie czarny.

Dlaczego moja bitmapa jest czarna? Ten kod może być niepoprawnie błędny; Wypróbowałem milion różnych rzeczy i po prostu nie mogę tego rozgryźć.

+0

Czy próbowałeś rozszerzyć SlidingDrawer? Ma już animację ślizgową. –

+0

Specyficzna animacja nie jest tym, czego szukam. Chodzi raczej o ogólne zrozumienie działania pamięci podręcznej rysunku, więc mogę zastosować ją do wszystkich rodzajów interfejsów użytkownika. –

+0

Może to jest coś we właściwym kierunku: http://android-developers.blogspot.com/2009/01/why-is-my-list-black-android.html – MrJre

Odpowiedz

2

Możesz budować pamięć podręczną rysowania przed użyciem, w przeciwnym razie daje pustą bitmapę

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

z dokumentacji Androida (http://developer.android.com/reference/android/view/View.html#setDrawingCacheEnabled%28boolean%29):

Włączanie cache rysunek jest podobny do ustawiania warstwy, gdy akceleracja sprzętowa jest wyłączona. Gdy akceleracja sprzętowa jest włączona, włączenie buforowania rysunku nie ma wpływu na renderowanie, ponieważ system używa innego mechanizmu przyspieszania, który ignoruje flagę. Jeśli chcesz użyć mapy bitowej dla widoku, nawet gdy włączona jest akceleracja sprzętowa, zobacz setLayerType (int, android.graphics.Paint), aby uzyskać informacje na temat włączania warstw oprogramowania i sprzętu.

Może to twoja sprawa?

Powiązane problemy