通過使用SurfaceView,我試圖對在畫布中移動的對象執行淡入淡出效果。然後我有一個背景,在每個框架上它將被繪製到畫布上,並帶有一個alpha值(因此之前繪製的所有內容都將被淡化),然後繪製對象的下一個位置。Android繪製透明位圖獲取離散顏色
但我的問題是,當背景多次繪製一個alpha值時,顏色變得不連貫。一些圖像;第一個是連續顏色的第一個幀,而第二個幀的底部是相同但是很多幀(〜50),其中顏色是離散的。
我把我的一些代碼。初始化部分:
// 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%,因爲在每一幀中,繪製的對象都會消失,而且我們不會在同一背景上重繪半透明背景。
完美!這就是我真正需要的!太多了!我編輯了問題,告訴我最終做了什麼。 – olivarra1