Android Canvas奇怪的转移

时间:2014-02-11 00:48:44

标签: java android canvas

我有一个问题,我试图解决将近2天。 (最后切换到OpenGL:D) 无论如何......我有Canvas,我正在尝试做一个简单的蛇游戏。只是为了这个问题想象我们的蛇是由5x5像素的矩形组成的,他正在离开小道(没有空地)并从0,50位置向右移动......这里是代码:

public class Snake extends AnimationWallpaper {

    @Override
    public Engine onCreateEngine() {
        return new SnakeEngine();
    }

    class SnakeEngine extends AnimationEngine {
        int i = 0;
        Paint paint = new Paint();

        @Override
        public void onCreate(SurfaceHolder surfaceHolder) {
            super.onCreate(surfaceHolder);

            // By default we don't get touch events, so enable them.
            setTouchEventsEnabled(true);
        }

        @Override
        public void onSurfaceChanged(SurfaceHolder holder, int format,
                                     int width, int height) {
            super.onSurfaceChanged(holder, format, width, height);
        }

        @Override
        public void onOffsetsChanged(float xOffset, float yOffset,
                                     float xOffsetStep, float yOffsetStep, int xPixelOffset,
                                     int yPixelOffset) {

            super.onOffsetsChanged(xOffset, yOffset, xOffsetStep, yOffsetStep,
                    xPixelOffset, yPixelOffset);
        }

        @Override
        public Bundle onCommand(String action, int x, int y, int z,
                                Bundle extras, boolean resultRequested) {
            if ("android.wallpaper.tap".equals(action)) {
            }
            return super.onCommand(action, x, y, z, extras, resultRequested);
        }

        @Override
        protected void drawFrame() {
            SurfaceHolder holder = getSurfaceHolder();

            Canvas c = null;
            try {
                c = holder.lockCanvas();
                if (c != null) {
                    draw(c);
                }
            } finally {
                if (c != null)
                    holder.unlockCanvasAndPost(c);
            }
        }

        void draw(Canvas c) {
            //c.save();
            //c.drawColor(0xff000000);

            paint.setAntiAlias(true);

            // paint the fill
            paint.setColor(Color.RED);
            paint.setStyle(Paint.Style.FILL_AND_STROKE);
            c.drawRect(i*5, 50, (i+1)*5, 55, paint);

            //c.restore();
        }

        @Override
        protected void iteration() {
            i++;

            super.iteration();
        }

    }

}

这是输出: output

并不是全部,当它有点移动时...意味着你所看到的是向右侧移动所以它实际上不会站在同一个地方......

如果您知道为什么会这样,请告诉我!

1 个答案:

答案 0 :(得分:0)

在画布中,有一个可重用的功能,实际上只是在画布中的任何内容上添加新的绘图,因此如果你当时正在绘制1个方格,下次你将拥有+1之前的任何东西,如果你不喜欢不想这样,你想要从头开始完全操纵每一个画,只需在开始画之前添加这行代码

canvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR);

它将清除您在画布的先前状态中所拥有的任何内容,并且您可以再次开始绘制您想要的任何内容......

希望它有帮助!

问候!