2013-03-15 125 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