【问题标题】:Android drawing - Background cachingAndroid绘图 - 后台缓存
【发布时间】:2011-01-07 01:49:43
【问题描述】:

快速提问 - 我正在扩展 LinearLayout 的控件,并且我正在覆盖它的 onPaint 方法,就像这样

@覆盖 受保护的无效onDraw(帆布画布){ super.dispatchDraw(画布); _background.draw(画布); _object1.draw(画布); _object2.draw(画布); _object3.draw(画布); // 等等... }

每 40 毫秒,我在后台调用 postInvalidate(),并且在 UI 线程上调用 onPaint。问题是 _background.draw 占用了我 80% 以上的绘图时间。

那么 - 是否有可能以某种方式缓存背景而不是每次都重绘它?

【问题讨论】:

  • 为什么每 40 毫秒就失效一次?对象是否在背景中移动,或者对象本身是否发生变化但保持相同的相对位置?
  • 物体既在移动又在变化(移动动画)......有时它们是站立的,但那是特殊情况(

标签: android


【解决方案1】:

您可以为postInvalidate()指定一个区域来控制重绘的区域。

【讨论】:

  • Uf...当我错过了超载时,我真的是瞎了眼。所以我做对了吗:-我可以在 for(Rect r : region) 中发布多个区域,无论我是否刷新 onDraw 中的所有内容,它都只会绘制这些部分(现在尝试过,它似乎是这样工作的)? - 没有将一个 LinearLayout 放在另一个之上的事情;将背景图片放在底部,使具有透明背景的顶部无效,并看到事情神奇地解决了(Android 让我的正确区域无效)?
  • 另外,还有一件事,如果你知道的话。假设我有 320x480 的屏幕。我用 600x800 的图像调用 canvas.drawBitmap。那个更大的图像是否会像我在编译前裁剪左上角的 320x480 部分(在 Photoshop 中)一样同时绘制?感谢您的帮助!
  • 实际上,我也是新手,但我想尽可能快地跟上进度。我主要是根据我一直在阅读的内容来回答。不过,您可以将 Drawable 放在多个图层上,并使用 LayerDrawable 管理它们。如果是我,我想我会从那里开始。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-03-09
  • 1970-01-01
  • 1970-01-01
  • 2017-11-25
  • 2015-05-25
  • 1970-01-01
  • 2011-03-07
相关资源
最近更新 更多