2010-03-11 17 views
16

Bir animasyon çizmeye çalışıyorum. Bunu yapmak için genişletilmiş Görünüm ve overDraw() yöntemini geçersiz kıldım. Beklediğim şey, onDraw() adındaki her zaman tuvalin içinde bıraktığım durumda olacağını ve bunu temizlemeyi seçebildiğimi ya da sadece bir kısmını çizebildiğimi (SurfaceView kullandığımda bu şekilde çalıştı)) ancak tuvalin geri geldiği her defasında zaten temizlendi. Temizleyemediğim bir yolu var mı? Ya da belki bir önceki durumu bir Bitmap'e kaydedersiniz, bu yüzden sadece bu Bitmap'i çizebilir ve daha sonra üstüne çekebilirim? Temel görünüm ve surfaceView arasındaki farkı görmek için numaralı bir görünüme sahip olmalısınızAndroid View.onDraw() her zaman temiz bir Tuvalete sahip

cevap

28

Bir yol olup olmadığından emin değilim. Ancak özel görünümlerim için her defasında herşeyi yeniden çiziyorum.(), Bir bitmap'e çizilir ve sonra da bitmap'i tuvaline çizer (sorunuzda önerdiğiniz gibi). İşte

ben

class A extends View { 

    private Canvas canvas; 
    private Bitmap bitmap; 

    protected void onSizeChanged(int w, int h, int oldw, int oldh) { 
     if (bitmap != null) { 
      bitmap .recycle(); 
     } 
     canvas= new Canvas(); 
     bitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888); 
     canvas.setBitmap(bitmap); 
    } 
    public void destroy() { 
     if (bitmap != null) { 
      bitmap.recycle(); 
     } 
    } 
    public void onDraw(Canvas c) { 
     //draw onto the canvas if needed (maybe only the parts of animation that changed) 
     canvas.drawRect(0,0,10,10,paint); 

     //draw the bitmap to the real canvas c 
     c.drawBitmap(bitmap, 
      new Rect(0,0,bitmap.getWidth(),bitmap.getHeight()), 
      new Rect(0,0,bitmap.getWidth(),bitmap.getHeight()), null); 
    } 
} 
+0

Bunu biraz önce anladım! Giriş için teşekkürler! – CaseyB

+0

Arabellek çizimi iyi çalışıyor, ancak bu büyük drawBitmap() yöntemi çok fazla FPS yiyor :( –

+0

Şu anda benim için bir darboğaz var - tam ekran bitmap'ini çizmek için her zaman önceki durumu geri yüklemek için yüksek çözünürlüklü aygıtlar için FPS'yi neredeyse hiç etkilemiyor. Kindle 8.9, 2560x1600'le 3. nesil gibi. Tuvali eski haline getirmeye zorlamanın bir yolu yok mu? OpenGL'ye derinleşme muhtemelen performans sorununu çözebilir, ancak zamanın yolu bu değil. –

1

. Bir surfaceView, çizmek için özel bir katmanı vardır, ki daha önce çizdiğin şeyin kaydını tutar. Şimdi bunu temel bir Görünüm üzerinde yapmak istiyorsanız, itemized overlay for the mapview örneğindeki gibi bir dizide çizdiğiniz her öğeyi yerleştirmeyi deneyebilirsiniz. Hemen hemen aynı şekilde çalışmalıdır

+0

Bu sayfayı gördüm. Aslında bu sayfa başlangıçta bir SurfaceView kullanmamı sağladı, ancak SurfaceView'un saydam bir arka plana sahip olmadığını buldum. ve diğer görünümlerin üstüne oturabilmek için bu widget'a ihtiyacım var. – CaseyB

+0

sonra çekilebilir dizi deneyin? – Sephy

+0

Modern Android'de OpenGL yoluna gitmek istiyorsanız doku görünümünü kullanabilirsiniz. – Adam

0

Beklentileriniz tuval olmayacak/gerçeklik :) w bıraktığınız şekilde vinç kolu yok böyle yaparız, ama bunun yerine boş. Çizilecek nesnelerden oluşan bir ArrayList (canvas.drawCircle(), canvas.drawBitmap() vb.) Oluşturabilir, ardından OnDraw() 'da ArrayList olsa da yineleyin. Grafik programlamada yeniyim ama bunu küçük çapta kullandım. Belki daha iyi bir yol var.

+0

Tuvali oluşturursanız budur. Böylelikle, üzerinde çizilenler üzerinde tam kontrole sahip olursunuz – CaseyB

+0

Bir Arraylist yerine: Resim kayıtlarını kaydetmek için Resim sınıfını kullanabilirsiniz. –

İlgili konular