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