Android:Canvas从头开始

时间:2012-11-10 03:30:51

标签: android android-canvas

我正在尝试构建一个基于标准Canvas绘图的自定义游戏引擎,类似于Android View类,因为drawable对象具有onDraw方法。我们的想法是给游戏元素一个Canvas,在其上绘制自己,然后将其合并到主视图中。我假设标准的Android视图幕后有类似的东西。

如何创建一个“主视图”,可以将小画布传递给子对象,然后将这些画布合并到它自己的绘图中?

注意:子对象不是View的子类,但“master”视图可以是View

1 个答案:

答案 0 :(得分:2)

在阅读ViewViewGroup的{​​{3}}后,我发现了这是如何完成的。当系统将视图绘制到屏幕时,它会生成一个Canvas,它是整个屏幕的rastor。 Canvas不会被“剪切”并被赋予子视图以进行绘制,而是将其翻译并剪切以适应每个视图。

在绘制特定视图之前,其父级将Canvas转换为子级的位置,将Canvas剪辑为子级的大小,然后在该视图上调用.draw(Canvas)。视图不知道画布已被更改,每个视图都绘制为(0,0)。在孩子完成绘制之后,Canvas被翻译回其先前的位置。抽象地说,每个视图都认为它是唯一的视图,而实际上每个父视图都会重新定位并调整画布的大小。

所以对于我的情况,我需要做的就是迭代我的每个子对象:

for(MyObject mob : mobjects) {
   final int restoreTo = canvas.save();

   canvas.translate(mob.getX(), mob.getY());
   canvas.clipRect(0, 0, mob.getWidth(), mob.getHeight());
   mob.onDraw(canvas);

   canvas.restoreToCount(restoreTo);
}