【问题标题】:reseting the canvas bitmap doesn't work correctly重置画布位图无法正常工作
【发布时间】:2012-03-29 07:26:17
【问题描述】:

我尝试在画布上绘制一个箭头 png,后面有一个 png 位图。所以每次我旋转箭头时,我都必须重置画布的背景位图,否则我会看到旧箭头的重复。

我重置了背景:

bMapLoad.eraseColor(0);

问题是有时它会擦除部分新箭头。让我有时只看到箭头的一部分。我每 10-100 毫秒旋转一次。

有人可以帮我吗?

我也试过了:

bMapLoad=bMapcanvasBack.copy(bMapcanvasBack.getConfig(), true);
canvasLoad.setBitmap(bMapLoad);

这很好用,但需要更多内存。那么有没有更好的方法呢?

编辑:

还有

canvasLoad.drawColor(0, PorterDuff.Mode.CLEAR);

不工作

【问题讨论】:

    标签: android memory user-interface canvas bitmap


    【解决方案1】:

    尝试canvas.drawARGB(0,0,0,0) 或更简洁的canvas.drawColor(0) 清除它,然后重新绘制位图(canvas.drawBitmap(...)

    部分过度绘制可能有不同的原因 - 绘制和显示之间的同步。一种常见的做法是使用双缓冲。这意味着,您将在离屏画布上绘制,然后将底层位图与可见画布交换。

    编辑:关于使用 android 进行双缓冲的一些有用资源:

    example here 加上“开始 android 游戏”一书也有一个关于双缓冲的部分。本书源码可以下载here

    【讨论】:

    • @5w4rley 也许我对 ARGB 的第一个 0 有误 - 请尝试 canvas.drawColor(0)。如果这不起作用,那么您可能正在尝试清除错误的画布 - drawXcalls 确实有效。
    • 我已经尝试过 canvasLoad.drawColor(0, PorterDuff.Mode.CLEAR);但结果与 bMapLoad.eraseColor(0);
    • @5w4rley 清算工作,IIUYC。你似乎需要双重缓冲。或者,在清除之前尝试使视图无效(使用invalidate()
    • 嗯嗯并没有真正的工作。认为我将不得不留在 bMapLoad=bMapcanvasBack.copy(bMapcanvasBack.getConfig(), true); canvasLoad.setBitmap(bMapLoad);
    • @5w4rley - godspeed :) 但如果您决定尝试双缓冲 - 毕竟这并不复杂 - 我编辑了答案以包含一些资源
    猜你喜欢
    • 2012-10-10
    • 2018-09-22
    • 2013-08-11
    • 1970-01-01
    • 1970-01-01
    • 2020-02-26
    • 2013-03-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多