2011-01-10 17 views
11

ile tuval temizleniyor Bazı özel Görünüm'ün arka plan resmini biraz başarı ile değiştirmeye çalışıyorum. görüntü değişecek ama problem şu ki eski görüntünün izlerini hala görüyorum. Yeni resmi çizmeden önce tuvali temizlemeye çalışırken, işe yaramıyor. Resmi saklamak için bir bitmap oluşturuyorum. görüntüyü değiştirirken, yeni görüntüyü çizmeden önce Canvas.drawColor() öğesini çağırıyorum, ancak eski görüntü hala devam ediyor. drawColor (0), drawColor (Color.BLACK), c.drawColor (0, PorterDuff.Mode.CLEAR) ve yukarıdaki çalışmaların hiçbirini denemedim. Bu yüzden, bunu benim için daha deneyimli akıllardan gözden geçirmek zorunda kaldım.Canvas.drawColor()

private int bgnd; 
private boolean switching; 

public void setBgnd(int incoming){ 
    switching = true; 
    switch (incoming){ 

    case R.drawable.image1: 
     bgnd = incoming; 
     this.invalidate(); 
     break; 

    case R.drawable.image2: 
     bgnd = incoming; 
     this.invalidate(); 
     break; 

    } 
} 



protected void onDraw(Canvas c){ 
    if(switching == true){ 
     Bitmap b = BitmapFactory.decodeResource(getResources(), bgnd); 
     c.drawColor(0, PorterDuff.Mode.CLEAR); 
     c.drawBitmap(b, 0, 0, null); 
     switching = false; 

    }else{ 
     Bitmap b = BitmapFactory.decodeResource(getResources(), bgnd); 
     c.drawBitmap(b, 0, 0, null); 
    } 
} 

cevap

30

Tıpkı sizin gibi, çok katmanlı/yüzey görünümü uygulamamdaki bir üst katman/yüzey görünümünü nasıl temizleyeceğimi düşündüm. Arama ve kodlamadan 2 gün sonra, kendi yolumu buldum ve çizmeden önce bir tuvali temizledim, birden çok katman/yüzey görünümü aldığınızda bunu kullanabilirsiniz. Arka plan katmanı siyahla kaplanmayacak, bu hile.

Paint paint = new Paint(); 
paint.setXfermode(new PorterDuffXfermode(Mode.CLEAR)); 
canvas.drawPaint(paint); 
paint.setXfermode(new PorterDuffXfermode(Mode.SRC)); 
// start your own drawing 
+0

Sanırım 2 saatten daha uzun süredir beni buraya götürmek için 2 dakika sürdü. Thx strangeInAStrangerLand + longdooooo –

2

ayrıca onDraw yöntemi içinde invalidate() aramaya gerek yok o onDraw'da yapılan değişiklikler ekranda güncellenir, böylece şu şekildedir:

gerçek kod nedir?

Anahtarınızdaki invalidate(), setBgnd'i çağırdıktan sonra onDraw'unuzu çağırır, ancak Tuvalde değişiklikler yaptıktan sonra yeniden çizilecek bir şey yoktur.

+1

invalidate() yönteminin, onDraw() işlevini çağırmak ve kendi kendine çizmek için bir görünüm söyleyeceği izlenimi altındayım. Bu çağrıyı yönteme koymanız durumun örnekte görüldüğü gibi sonsuza kadar döngü yapmasına neden olur: http://www.anddev.org/basic_and_simple_2d_drawing_-_animation-t3085.html – Prmths

+0

Ah haklısınız. Bak git, http://developer.android.com/guide/topics/graphics/index.html. Üzgünüm anlayışım doğru değildi. – C0deAttack

+0

Ben de başlangıçta bunu düşündüm. Bana göre, invalidate() kendisini yeniden görüntülemeye yönelik bir görüş belirtiyorsa, neden bu görüntü bir animasyonda daha sonra taşınana kadar kendini tamamen yeniden çizmez? Nesnenin alt yarısı doğru görünüyor ama diğer yarısı hala eski yüzey. – Prmths

2

Kanvas yöntemini drawRGB kullanabilirsiniz.

+0

drawRGB() alfa kanalı temizlemez ve bitmap opak olur, bu nedenle yalnızca bitmap tek katman veya arka plan katmanı olduğunda kullanılabilir. Alfa kanalını da tedavi etmeyi sağlayan bir yöntem drawARGB() vardır. Yine de işe yaramadı. –

+1

DrawRGB sadece drawColor (Color.rgb (r, g, b)) 'yi kullandığını unutmayın. – TameHog