【问题标题】:Moving Android View and preventing onDraw to be called over and over again移动 Android View 并防止 onDraw 被一遍又一遍地调用
【发布时间】:2012-04-20 17:54:51
【问题描述】:

我将View 类扩展为我所说的MyView。 (我添加了一些属性,这些属性基本上说明了在对象上绘制的内容并处理它)

我每隔几毫秒移动一次此类的对象,这很好用。我正在使用this.layout(left, top, right, bottom); 来移动 MyView。但似乎每次移动视图时,都会重新绘制(调用 onDraw)。这是必要的吗? MyView 的内容在移动时不会改变。事实上,内容永远不会改变 - 它以一种方式创建,四处移动,然后被销毁。

我正在使用onDraw,因为每次创建它时,我都希望它在其上绘制一些文本或一些数字。我曾经扩展ImageView 并使用setImageResource,但我意识到我想要的不仅仅是不同的图像,并且为这个对象可能感觉不对的各种文本和数字内容创建图像。

我的对象可以接收 onTouch 事件也很重要,这在今天可以正常工作。

我的 onDraw 方法目前包含:(这会改变,当我让它不再重绘时)

@Override
public void onDraw(Canvas canvas) {
    Paint p = new Paint();
    p.setARGB(255, 0, 255, 255);
    canvas.drawRect(0, 0, 32, 32, p);
}

所以问题是:我可以有一个在创建时动态绘制的对象,有可能接收触摸事件(我可以用另一种方式解决这个问题,所以它是不是很重要),并且在不重新绘制的情况下移动它(最重要)?

原因是:我将拥有这个类的几个对象(可能超过 100 个),我相信通过一直重新绘制对象会降低应用程序的速度。

编辑: 如果 View 无法实现,是否有我可以使用的替代方案?

【问题讨论】:

    标签: java android view


    【解决方案1】:

    但似乎每次移动视图时都会重新绘制(调用 onDraw)。有必要吗?

    是的。

    View 对象将始终调用 onDraw,因为必须调用 invalidate 方法,以便将在该对象中绘制的文本或任何内容绘制在新位置。

    我可以有一个在创建时动态绘制的对象吗? 接收触摸事件的可能性

    是的,根据您想要实现的目标,您可以覆盖扩展 View 的类上的方法 onTouchEvent 或为您的对象实现 TouchListener

    注意:不建议绘制那么多视图对象(100 多个)我记得有些 Google 人员提到了这一点,我会在找到链接后立即对其进行编辑。

    【讨论】:

    • 触控不是目前最难的部分,正如我所写的那样——今天有效。我可以使用 View 的任何替代方案,它可以解决“在不重新绘制的情况下移动它”的问题,但仍然具有动态内容?
    • 那个链接会很有趣,如果你能找到它:)
    • 我的朋友告诉我在 Reto Meier 的视频中,但我找不到,他们太多了:S 这是他们视频的链接:youtube.com/user/GoogleDevelopers
    • 谢谢。我会看看我能在那里找到什么。我已经接受了您的回答,但如果您能提出任何替代方案,我将不胜感激。虽然我觉得平局问题不会很大。
    【解决方案2】:

    在布局之后,如果视图移动了,onDraw 几乎是肯定的——尽管很难在 Android 源代码中确定发生这种情况的位置(对任何这样做的人的支持)。 相信我,我能感觉到 - 我发布了https://plus.google.com/117549329232493334054/posts/FMf8RfhFceC,因为使用 LayoutTransition 时也会出现同样的问题。

    按照文档here,您可以使用视图属性动画(可能是 ViewPropertyAnimator;我自己也在学习)来移动视图。您可以收听该动画的结尾,然后通过运行布局“巩固”视图的位置。另外,我们应该通过在视图上放置一个新的 LayoutParams 来触发布局,而不是直接调用 layout

    【讨论】:

      猜你喜欢
      • 2011-10-30
      • 1970-01-01
      • 2015-07-15
      • 2011-09-21
      • 1970-01-01
      • 2013-09-10
      • 2019-07-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多