【问题标题】:Android: Restored Canvas-based Bitmap Deteriorating?Android:恢复的基于 Canvas 的位图恶化?
【发布时间】:2011-03-02 12:28:42
【问题描述】:

我有一个绘图应用程序,用户可以用手指在屏幕上绘图。绘图发生在屏幕外位图上,然后在 onDraw() 中发布到屏幕上。

当用户通过呼叫或点击主页切换离开应用程序,然后返回应用程序时,绘图屏幕将显示之前的绘图,除了绘图边缘现在有伪影。循环通过多个 home -> resume -> home -> resume 循环会导致工件每次都变得更糟。五个循环后的结果见附图。

有人见过这个吗?知道为什么会这样吗?

谢谢

原图:

5 个周期后:

编辑:更多细节:

当用户触摸屏幕时,我截取触摸并将它们作为路径存储在屏幕外位图 mBitmap 上。路径是使用启用了标志 Paint.ANTI_ALIAS_FLAG 的 Paint 绘制的。在 onDraw() 中,我通过以下方式将它们写入屏幕:

@Override
protected void onDraw(Canvas canvas) {
  // wipe the canvas
  canvas.drawColor(0xffffffff);

  // draw the stored paths
  canvas.drawBitmap(mBitmap, 0, 0, mBitmapPaint);

  // draw any active paths
  if (mStrokePath != null) {
 canvas.drawPath(mStrokePath, mStrokePaint);
  }
}

其中 mBitmapPaint 定义为:

mBitmapPaint = new Paint(Paint.DITHER_FLAG);

编辑 2:好的,明白了

我的问题是,在创建基于 Canvas 的视图的 Activity 的 onResume 中,我将形状重新加载到已恢复位图顶部的画布上,该位图已经具有形状,因此抗锯齿性能下降.

【问题讨论】:

  • 您能否详细介绍一下您的位图显示是如何工作的?您是否多次保存同一个位图?
  • 我不这么认为...当用户绘图时,我将该数据写入屏幕外的 birmap,然后在 onDraw(), canvas.drawBitmap(mBitmap, 0, 0, mBitmapPaint);当活动恢复时,只发生一次对 onDraw 的调用,没有做任何事情来更改 offscrren 位图。

标签: android bitmap


【解决方案1】:

我以前从未为 Android 开发过,所以我不熟悉它的绘图系统,但对我来说,您的示例看起来像是在其自身之上多次绘制了原始图像,突出了抗锯齿边缘。当用户从主屏幕返回时,您是否有任何方法强制清除/擦除画布然后重绘?

【讨论】:

  • 这正是我的想法,但在onDraw开始时,我用纯色填充屏幕以去除旧图......
【解决方案2】:

考虑使用Paint.FILTER_BITMAP_FLAG

【讨论】:

  • 对于路径,对于位图绘制...我应该在哪里使用它?
  • 不幸的是,这并没有什么不同。
  • 如果你的路径不是null 绘制时,你绘制它两次,因此边缘(一次绘制两层)。
【解决方案3】:

根据已发布问题中的 EDIT 2 部分:

我的问题是,在创建基于 Canvas 的视图的 Activity 的 onResume 中,我将形状重新加载到已恢复位图顶部的画布上,该位图已经具有形状,因此抗锯齿性能下降.

所以,恢复的 Canvas 并不是真正的问题,而是我实现加载 Canvas 的方式才是问题所在。准备标记并关闭它。

【讨论】:

    猜你喜欢
    • 2011-10-10
    • 2014-04-20
    • 1970-01-01
    • 2017-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多