【问题标题】:Android canvas.drawBitmap() rendering bugAndroid canvas.drawBitmap() 渲染错误
【发布时间】:2013-03-15 20:03:11
【问题描述】:

[使用附加代码更新]

Android 在某些(我知道的 Nexus 7 和 10)但不是所有设备上的自定义视图的 onDraw() 方法中正确渲染一些位图时遇到了一个重大问题。它可以在我用于测试的 Android 手机上正确呈现。这是后果的 sn-p:

/* 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 上的结果不正确,并呈现如下所示的宽白色边框。这是位图渲染的一部分,但不是原始位图或矩形的一部分。

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

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

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

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

有什么想法吗?这太疯狂了!

【问题讨论】:

  • 你能再分享一点代码吗?如果您正在对表面视图进行分层,则无法保证 z 顺序,但由于您缺少代码并不清楚您实际上在做什么

标签: android canvas bitmap rendering


【解决方案1】:

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

【讨论】:

  • James,好主意,我也想到了,但是图像是 320x300 并且视图矩形更小。即使它更小,drawBitmap 方法也应该放大源以适应视图(从 src 映射到 dst)而不是。
猜你喜欢
  • 2020-08-23
  • 2017-09-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多