2010-06-01 12 views
14

Tüm ekranımı dolduran özel bir görünüm var. (Bir piyano klavyesi) Bir kullanıcı anahtara dokunduğunda, çağrılacak invalidate() neden olur ve tüm klavye dokunarak yeni durumu gösterecek şekilde yeniden çizilir.Android: Kısmen yeniden çizilecek özel görünüm nasıl alınır?

Şu anda görünüm çok basit, ancak biraz daha güzel grafikler eklemeyi planlıyorum. Klavyenin tamamı dinamik olarak oluşturulduğundan, bu, tüm klavyenin daha pahalı bir şekilde yeniden çizilmesini sağlar.

Yani, kısmi yeniden çizime bakalım. Şimdi doğru kirli bölge ile invalidate(Rect dirty) diyoruz. Gerçekten kısmi bir yeniden çizim yapmak istiyorsam, yalnızca kirli bölgedeki anahtarları çizmek için onDraw(Canvas canvas) yöntemimi ayarladım. Bu, tuşların çekilmesiyle sonuçlanır, ancak klavyenin geri kalanı tamamen siyahtır/hiç çizilmez.

invalidate(Rect dirty) numaralı telefonun şu anki canvas "önbelleğini" ve yalnızca kirli bölgedeki çizimi "izin veriyor" olacağını beklemede yanlış mıyım?

İstediğim şeyi elde edebilmem için herhangi bir yolu var mı? (Bir yolu "önbellek" tuval ve sadece kirli bölgeyi yeniden çizmek "

cevap

18

Güncel güzel çözüm elle bir bitmap tam tuval önbelleğe şudur:?

private void onDraw(Canvas canvas) 
{ 
    if (!initialDrawingIsPerformed) 
    { 
      this.cachedBitmap = Bitmap.createBitmap(getWidth(), getHeight(), 
      Config.ARGB_8888); //Change to lower bitmap config if possible. 
      Canvas cacheCanvas = new Canvas(this.cachedBitmap); 
      doInitialDrawing(cacheCanvas); 
      canvas.drawBitmap(this.cachedBitmap, 0, 0, new Paint()); 
      initialDrawingIsPerformed = true; 
    } 
    else 
    { 
      canvas.drawBitmap(this.cachedBitmap, 0, 0, new Paint()); 
      doPartialRedraws(canvas); 
    } 
} 

Tabii, bilgi depolamak için gereken Kendinizi yeniden çizmeniz ve her zaman yeni bir Paint kullanmama hakkında bilgi edinin, ancak bunlar ayrıntılardır:

Ayrıca not: Uygulamanızın bellek kullanımı üzerinde bitmapler oldukça ağırdır.Kullanılan bir Görünümü önbelleğe aldığımda çökme yaşadım bir scroller ve cihazın 10 katı kadardı, çünkü 10MB hafıza kullanıldı!

+1

Hmm, bu solutnioyu sevmiyorum çünkü anahtarlarının kısmen çizilmesinin sebebi, ilk olarak, hiscanvasını tam olarak çizmesi gerektiğidir. Soru şu ki, tuvali ilk etapta doğru çizemedi. –

+1

Şimdi şunu bilmem gerekir ki, 'invalidate' bir kirli 'rect' ile çağırdığınızda, normal çizim kodunuzu kullanabilir ve yalnızca aslında 'rect'de kirli çizim işlemlerini gerçekleştirmelidir. 'Canvas'' rect' dışında kalan işlemleri atar. Yine de bu, kendi kodunuzun birçoğunu oluşturduğunu ve HW hızlandırmasıyla yaptığım testlerde, görünümü tamamen oluşturduğundan daha yavaş olduğunu gösteriyor. – Peterdk

+1

Tuval için bitmapler çizmek için boya parametresinin boş olabileceğini unutmayın, örn. canvas.drawBitmap (bitmap, 0, 0, boş) '. – greg7gkb

5

Peterdk'in yanıtını tamamlamak için, işlemlerinizi Bitmap yerine bir Resmin içine kaydedebilirsiniz. o çok fazla bellek sürebilir dedi gibi

  • A Bitmap, tüm pikselleri kurtaracak.
  • Bir Resim vb drawRect, drawLine gibi, aramaları kazandıracak
  • O uygulamanızda gerçekten ağır olanı bağlıdır

: beraberlik operasyonların bir çok birkaç ağır hesaplamalar tarafından işlemleri çizmek ama kontrollü , bir çok boş/kullanılmayan alan (Resim tercih et) vb ...

+0

Güzel, buna bakacak! – Peterdk

+0

Özür dilerim. 'Picture' kaydı' drawBitmap (bitmap) 'dır? Muhtemelen hayır değil mi? – Yeung

+0

Resim oynatmanın yalnızca yazılım tuvallerinde desteklendiğini unutmayın, dolayısıyla bunu kullanan görünümler için Donanım katmanlarını kullanamazsınız. – greg7gkb

İlgili konular