2

我正在将View-class 扩展到我所说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+),并且我相信通过一直重新绘制对象会减慢应用程序的速度。

编辑:如果视图不可能,我可以使用任何替代方法吗?

4

2 回答 2

3

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

是的。

一个View对象总是会onDraw在其移动时调用,因为必须调用 invalidate 方法,以便将在该对象中绘制的文本或任何内容绘制在新位置。

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

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

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

于 2012-04-20T18:20:25.623 回答
0

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

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

于 2016-09-20T01:45:41.623 回答