【问题标题】:Do all Android games use a single canvas?所有安卓游戏都使用一个画布吗?
【发布时间】:2026-01-13 00:05:02
【问题描述】:

是否应该在每个 onDraw() 过程中重绘所有 View 对象?

我来自 Flash 背景,所以我最初的想法是在一个图层/画布上绘制静态背景图像,然后在其上创建另一个图层以处理更活跃的动画,但这似乎不太实用设置。我在 Android 的 View.onDraw() 背后的思路是否在这里被误导了,这是我什至不应该担心的事情吗?

编辑:为了进一步详细说明我试图用 onDraw() 的概念弄清楚的内容 - 有没有办法在 SurfaceView/View 上使用多个画布作为图层,以便我可以手动绘制在每个单独的画布上(以尽量减少需要“重绘”的内容),而不必“重绘”其他画布上的图形,或者 SurfaceView/View 的 onDraw() 对于更新任何视觉更改是绝对必要的(在这种情况下 一切都“重绘”到屏幕上)?

【问题讨论】:

    标签: java android view android-canvas


    【解决方案1】:

    问:是否应该在每个 onDraw() 过程中重绘所有 View 对象?

    答:不——不一定

    另外:一定要看看 SurfaceViews:

    http://developer.android.com/reference/android/view/SurfaceView.html

    【讨论】:

    • 谢谢保罗,这似乎是我需要的方向。然而,在经历了涉及 SurfaceView 的this tutorial 之后,它仍然提出了一些问题,因为看起来他们在 SurfaceView 上使用单个 onDraw() 来调用其他对象的 onDraw() 并同时有效地重绘所有内容。这只是“刷新”应用程序图形的正常过程,还是有办法让多个“分层”表面可以单独绘制?
    【解决方案2】:

    好吧,也许不是全部,但Canvas 可以被视为一个场景。我使用Toon 类,包含XY 坐标、Rect 命中框和Drawable。这个类Toon也有一个方法:

    public draw(Canvas c) {
        mDrawable.setBounds(mHitBox);
        mDrawable.draw(c);
    }
    

    然后,在游戏循环中的onDraw(Canvas c) 方法中,我只是遍历我所有的Toon 对象,并在它们上调用draw(c) 方法。尽量不要操作onDraw 中的对象,理想情况下它们应该被绘制。

    【讨论】: