2014-03-04 56 views
0

通過使用SurfaceView,我試圖對在畫布中移動的對象執行淡入淡出效果。然後我有一個背景,在每個框架上它將被繪製到畫布上,並帶有一個alpha值(因此之前繪製的所有內容都將被淡化),然後繪製對象的下一個位置。Android繪製透明位圖獲取離散顏色

但我的問題是,當背景多次繪製一個alpha值時,顏色變得不連貫。一些圖像;第一個是連續顏色的第一個幀,而第二個幀的底部是相同但是很多幀(〜50),其中顏色是離散的。

enter image description hereenter image description here

我把我的一些代碼。初始化部分:

// Inited somewhere in the start of the app 
Bitmap bmp = Bitmap.createBitmap(width, height, Config.ARGB_8888); 
Canvas bmpCanvas = new Canvas(bmp); 

Paint backgroundPaint = new Paint(); 

Bitmap background = Bitmap.createBitmap(width, height, Config.ARGB_8888); 
// Draw the background image into background 
bmpCanvas.drawBitmap(background, 0, 0, backgroundPaint); 
backgroundPaint.setAlpha(0x10); 

然後,我有一個線程,在他的run方法它設置幀率爲30,並調用doDraw(Canvas c)方法來繪製所有的東西在bmpCanvas。然後它繪製其位圖(bmp)進入現場畫布(如果我不這樣做,這樣,然後我得到的,因爲SurfaceView的雙緩衝抖動)

private void doDraw(Canvas c){ 
    c.drawBitmap(background, 0, 0, backgroundPaint); 

    // Draw all the objects 
} 

我試圖通過改變解決它的backgroundPaint的Xfermode通過嘗試所有的PorterDuffXFermode,但似乎沒有人爲我工作。

============== SOLUTION =========================

靈感來自Lorne Laliberte回答我做的是一個雙緩衝區,以使其更快。

基本上我創建背景爲位圖。然後我設置了2個與背景寬度和高度相同的空白位圖,併爲它創建2個畫布。我還保留一個索引,告訴我應該畫什麼畫布(稱之爲iCanvas)。

現在不需要另一個位圖來避免SurfaceView的雙緩衝區了,因爲我將再次繪製所有的東西(所以沒有閃爍)。

那麼我要做的就是在每幀中,清除actual畫布,用一些阿爾法(取0xE0例如)一Paint繪製previous,並在這個畫布繪製的對象。 然後,只需畫出SurfaceView的畫布背景,然後畫上畫布即可。最後只需切換索引iCanvas

我認爲這樣比記得對象的所有以前的位置並用不同的alpha再次繪製它們要快得多。而且這個效果是100%,因爲在每一幀中,繪製的對象都會消失,而且我們不會在同一背景上重繪半透明背景。

回答

2

您正在積累繪畫 - 在前一個畫布頂部重新繪製位圖,使用半透明效果,會導致您看到的效果。如果你想讓它保持平滑,你需要畫一個純色清除前面的位圖,例如,你可以,如果你呈現在透明畫布使用:

private void doDraw(Canvas c) { 
    // fill the canvas with transparency first 
    c.drawColor(0, PorterDuff.Mode.CLEAR); 

    c.drawBitmap(background, 0, 0, backgroundPaint); 

    // Draw all the objects 
} 

如果畫布是不透明的,但你只需要c.drawColor(0);


編輯:它只是發生在我身上,你可能會嘗試畫了此前繪製的對象在畫布上,積累了他們一個位圖的半透明,以「淡出」的對象了 - 如果這是所以,那麼簡短的答案是我不認爲這種方法沒有你所看到的各種工件。您需要採取不同的方法,例如重繪場景,每個框架以逐漸減少的alpha值繪製每個可見對象 - 或者將對象繪製到一個緩衝區中,然後在繪製每個幀之前將每個幀從該緩衝區複製到畫布中與你半透明的背景。

(這也可能是可能實現作爲一種DrawFilter你想要的效果...)

+0

完美!這就是我真正需要的!太多了!我編輯了問題,告訴我最終做了什麼。 – olivarra1