Invalidate()没有调用onDraw

时间:2017-07-10 19:07:34

标签: android ondraw android-view-invalidate

昨天我问了一个关于Android图形的问题,现在我已经启动并运行了基础,我在自定义视图类中创建了一个渲染循环。

protected void render() {
    long startTime = System.nanoTime();
    long elapsedTime;
    while (Main.running) {
        Bitmap image = Bitmap.createBitmap(Main.WIDTH, Main.HEIGHT, null); //creates new Bitmap to draw onto
        Canvas canvas = new Canvas(image); //new Canvas with the attached blank Bitmap
        long newTime = System.nanoTime();
        elapsedTime = newTime - startTime;
        if (elapsedTime >= 1000000000/60) { //if enough time has passed for it to update
            startTime = newTime;
            Main.player.render(canvas); //this renders a test object, see below
        }
        display = Bitmap.createBitmap(image); //this writes to the display Bitmap that is drawn in onDraw, see below
        invalidate(); //invoke onDraw()
    }
}

以下是绘制我的播放器图像的代码(如果我绘制一次而不是循环播放,它会起作用。)

public void render(Canvas c) {
        int xp = (int) x;
        int yp = (int) y;
        c.drawBitmap(Images.box, xp, yp, null);
    }

在onDraw内部:

@Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        canvas.drawBitmap(display, 0, 0, null);
    }

如果我只渲染播放器并调用invalidate()一次,而不是多次循环播放,则显示正常(花花公子)。但是,当我把它放在循环块中时,它不会渲染。

根据我的日志记录,循环功能正常并调用invalidate(),但它在循环期间实际上从未进入onDraw方法。

如果有人能够解释为什么会发生这种情况会非常盛大,如果您需要更多信息,请告诉我,我会提供。

修改 在我的主Activity类中,我有一个游戏逻辑线程,然后在启动逻辑线程后进入主线程的渲染循环。

Thread update = new Thread() { //game logic thread
            public void run() {
                loop(); //game logic loop
            }
        };
        update.start(); //start logic thread
        surface.render(); //start render loop (surface is the name of my custom view)

我尝试使用我的主线程创建一个单独的线程来渲染和进入游戏循环,但是仍然无效。

0 个答案:

没有答案