移动Android视图并阻止onDraw反复调用

时间:2012-04-20 17:54:51

标签: java android view

我正在将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无法实现,是否可以使用

2 个答案:

答案 0 :(得分:3)

  

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

View对象在移动时始终会调用onDraw,因为必须调用invalidate方法,因此在该对象中绘制的文本或任何内容都将被绘制在新位置。

  

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

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

注意:不建议绘制那么多视图对象(100+)我记得有些谷歌人提到这个,我会在找到它后立即用链接编辑它。

答案 1 :(得分:0)

布局onDraw在移动视图时非常肯定 - 虽然很难在Android源中查明这种情况(对任何人来说都是道具)。 相信我,我觉得你 - 我发布了https://plus.google.com/117549329232493334054/posts/FMf8RfhFceC,因为使用LayoutTransition时会出现同样的问题。

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