Android绘图顺序为位图,drawables和文本?

时间:2012-10-14 10:05:52

标签: java android

我在android中创建了一个小游戏。任何需要在屏幕上绘制的东西扩展了我的VisibleObject类,然后我有一个Manager类,我可以将所有可见的游戏对象添加到每个框架中,我告诉管理者调用绘制函数其中的一切。

此处的对象已初始化并添加到管理器中:

@Override
    public void surfaceCreated(SurfaceHolder holder) {

        fps = new TextDrawable(Color.BLACK, 14, 100, 40, 40);
        player = new Player();
        map = new Map();
        leftTouch = new TouchCircle(Color.GRAY);

        manager.add("fpsText", fps);
        manager.add("leftTouch", leftTouch);
        manager.add("player", player);
        manager.add("map", map);

        gameloop = new GameLoop(getHolder(), this, fps);            
        gameloop.setRunning(true);
        gameloop.start();

    }

现在我遇到的问题是绘制顺序,如果你查看对象被添加到管理器的顺序以供参考..

  • 我可以肯定地告诉你,玩家是被吸引到的 地图!这些都是通过使用drawBitmap(..)绘制各自的位图来绘制的。
  • 然而,fpsText和leftTouch正在地图下方绘制!这些是分别使用drawText(..)drawOval(..)绘制的。

即使他们实现了不同的Canvas.draw..函数,我希望它们都是按顺序绘制的,因为我只是将画布对象传递给我的经理类,然后让管理器遍历每个传递它的对象。用画布绘制。

任何人都可以为我清理为什么位图似乎被绘制在顶部以及解决方案应该是什么让我的fps和触摸区域绘制在播放器上方并映射位图?我很感激。

编辑:我在我的经理中使用private ConcurrentSkipListMap<String, VisibleObject> objectMap;来存储对象和绘图,如此...

public void draw(Canvas c){
        for (Map.Entry<String, VisibleObject> object : objectMap.entrySet()){
            synchronized(object){
                object.getValue().draw(c);
            }
        }
    }

1 个答案:

答案 0 :(得分:2)

除非在绘制文本(和位置重叠)之后绘制位图,否则不会在文本顶部绘制位图。

您还没有透露onDraw方法,所以我无法确定,但我怀疑您没有按正确的顺序调用绘图方法。 您如何管理存储添加到其中的值?也许您使用的Map实现不会维护添加元素的顺序(大多数实现都没有,LinkedHashmap会这样做。)