Android canvas.drawBitmap()呈现错误

时间:2013-03-15 20:03:12

标签: android canvas bitmap rendering

[更新附加代码]

我遇到的一个主要问题是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

Samsung 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 个答案:

答案 0 :(得分:0)

你确定这些照片足够大,无需放大这些设备吗?