2013-03-15 127 views
1

[更新,添加代碼]的Android canvas.drawBitmap()渲染錯誤

我在與Android的正確渲染一些位圖在我的自定義視圖的OnDraw(一個主要問題)上的一些(的Nexus 7和10方法我知道)但不是所有的設備。它在我用於測試的Android手機上正確渲染。以下是結果摘錄:

/* set up mImagePaint earlier */ 
mImagePaint.setAntiAlias(true); 
mImagePaint.setFilterBitmap(true); 
mImagePaint.setDither(true); 
mImagePaint.setStyle(Paint.Style.FILL_AND_STROKE); 
mImagePaint.setStrokeWidth(0); 
mImagePaint.setColor(Color.WHITE); 

protected void onDraw(Canvas canvas) { 
    final float vw = getWidth(); 
    final float vh = getHeight(); 
    final float bw = mBitmap.getWidth(); 
    final float bh = mBitmap.getHeight(); 
    final float ba = bw/bh; 
    final float va = vw/vh; 
    if (va > ba) { 
     final float top = (bh - ba/va * bh)/2; 
     mSrcRect.set(0, (int) top, (int) bw, (int) (bh - top)); 
    } else { 
     final float left = (bw - va/ba * bw)/2; 
     mSrcRect.set((int) left, 0, (int) (bw - left), (int) bh); 
    } 
    mContentRect.set(0, 0, vw, vh); 
    canvas.drawBitmap(mBitmap, mSrcRect, mContentRect, mImagePaint); 
} 

Nexus 7和10上的結果不正確,並呈現如下所示的寬白色邊框。這是位圖渲染的一部分,但不是原始位圖或矩形的一部分。

Incorrect rendering on Nexus 7

正確(期望的)導致一個三星Galaxy電話上:在以上兩個實施例中所示

Correct rendering on Samsung Galaxy phone

圖像和代碼是完全一樣的。我已經嘗試過使用null paint,null srcRect,甚至使用替代方法drawBitmap(bitmap,0,0,null)的變體,並獲得相同的結果。看看框架代碼,drawBitmap()當然會直接調用其源代碼無法查看的本地方法。

只有少量的圖像似乎表現出這個問題,似乎大多是方形圖像展示它。但這裏只有一個出現此問題的其他非正方形圖片:

incorrect non-square image on Nexus 7

大多數圖像都稍微旋轉的所需自定義視圖,它現在發生,我認爲旋轉可能是部分問題,但也許不是,因爲畫布不旋轉,只是當它被複制到Android的父級畫布位圖時。

任何想法?這太瘋狂了!

+1

你能分享一點點代碼嗎?如果你正在對surfaceViews進行分層,那麼就不能保證你的z排序,但是從你缺乏代碼的角度不清楚你實際上在做什麼 – 2013-03-15 20:17:30

回答

0

你確定圖片足夠大,可以顯示,而不必在這些設備上擴展嗎?

+0

James,好想法和我也想到了,但圖像是320x300和視圖更小。即使它較小,drawBitmap方法也應該放大源以適應視圖(從src到dst的映射),而不是。 – Jackpile 2013-03-16 17:51:42