1

[使用附加代码更新]

我在某些(我知道的 Nexus 7 和 10)但不是所有设备上的自定义视图的 onDraw() 方法中正确渲染一些位图时遇到了一个重大问题。它可以在我用于测试的 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 上的结果不正确,并呈现如下所示的宽白色边框。这是位图渲染的一部分,但不是原始位图或矩形的一部分。

Nexus 7 上的渲染不正确

三星 Galaxy 手机上的正确(期望)结果:

三星 Galaxy 手机上的正确渲染

上面两个示例中显示的图像和代码完全相同。我已经尝试过使用 null paint、null srcRect 甚至使用替代方法 drawBitmap(bitmap, 0, 0, null) 并获得相同结果的变体。查看框架代码,当然 drawBitmap() 直接调用我无法查看其源代码的本地方法。

只有少数图像似乎表现出这个问题,而且似乎大多数方形图像都表现出这个问题。但这里只有另一个非方形图像表现出这个问题:

Nexus 7 上的非方形图像不正确

鉴于所需的自定义视图,这些图像中的大多数都略微旋转,现在我发现旋转可能是问题的一部分,但可能不是因为画布没有旋转,只是当它被复制到父画布位图支持时安卓。

有任何想法吗?这是疯了!

4

1 回答 1

0

您确定图片足够大而无需在这些设备上放大即可显示吗?

于 2013-03-16T07:45:39.823 回答