【问题标题】:Android: How do I circumvent invalidation / redraw of not effected layers?Android:如何规避无效图层的无效/重绘?
【发布时间】:2012-01-01 21:53:40
【问题描述】:

我有一个相对布局,其中有几个 ImageView(带有透明区域)在彼此之上。问题是:如果我使其中一个无效,那么所有其他的 onDraw() 方法也会被调用。这是正常的吗? 我不希望重绘所有图层(视图),因为这是一个很大的性能问题——我只希望重绘无效的视图..

有什么想法吗?

【问题讨论】:

    标签: android


    【解决方案1】:

    假设您在View 上使用invalidate(),也许您可​​以尝试使用other 之一?理论上这只会重绘受影响的(脏)区域。

    void invalidate(Rect dirty)
    void invalidate(int l, int t, int r, int b)
    void invalidateDrawable(Drawable drawable)
    

    另请参阅 this 视频(大约 34:07 分)。他们有一个很好的小演示,详细描述了这一点。

    【讨论】:

      【解决方案2】:

      这正常吗?

      是的。

      因为这是一个很大的性能问题

      使用Traceview 确定性能瓶颈所在。

      或者,可能,真的使用layers

      或者,如果您正在创建游戏或其他东西,请不要使用小部件框架,而是直接绘制到Canvas(或使用OpenGL)。

      【讨论】:

      • 对不起,只是为了确保:你说的是例如如果我在一个布局/视图中有一个动画按钮,与图形布局/视图重叠(在 onDraw() 中绘制),然后我按下按钮(它动画......),整个底层图形必须再次绘制?对我来说听起来很奇怪 - 为什么每个视图都有一个无效方法呢? ...
      • @stoefln:“整个底层图形必须重新绘制?” -- 重绘的范围将是 Android 认为可能需要重绘的任何内容,并且 Android 倾向于认为可能需要重绘的东西您自己可能不这么认为。
      • "使用 Traceview 确定性能瓶颈所在。" -> 瓶颈是路径的绘制。我不能让它更快,我需要的只是缓存视图的可能性,因为它只需要绘制一次(假设应用程序启动时)。 “或者,可能,真的使用图层。” -> android 2.1 不支持“...而不是直接绘制到画布” -> 这就是我所做的。我在视图的 onDraw() 中绘制到画布,但正如我所说,这需要一些处理,每次重绘另一个视图上的某些组件时我都负担不起。
      • @stoefln:“在所有版本的 Android 中,视图都可以通过使用视图的绘图缓存或使用 Canvas.saveLayer() 渲染到屏幕外缓冲区。”
      • @stoefln:我自己没用过。请参阅stackoverflow.com/questions/5121302/… -- AFAIK,绘制到您自己的位图似乎更受欢迎 (stackoverflow.com/questions/2423327/…)
      猜你喜欢
      • 2016-03-12
      • 1970-01-01
      • 2014-03-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多