0

这里存在一个类似的问题,但似乎不适用于我的问题: Android SurfaceHolder.unlockCanvasAndPost() does not cause redraw

问题描述见最后,但首先...

我的代码

我有一个非常简单的活动:

...
void onCreate(...) {
    setContentView(new MySurfaceView(this))
}
...

MySurfaceView.java:

public class MySurfaceView extends SurfaceView implements SurfaceHolder.Callback {

    private MySurfaceViewThread task = null;
    private SurfaceHolder holder = null;

    public MySurfaceView(Context ctx) {
        super(ctx);
        holder = getHolder();
        holder.addCallback(this);
    }

    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
        this.holder = holder; // EDIT per user2635653's answer
    }

    public void surfaceCreated(SurfaceHolder holder) {
        this.holder = holder; // EDIT per user2635653's answer
        task = new MySurfaceViewThread(holder);
        task.run();
    }

    public void surfaceDestroyed(SurfaceHolder holder) {
        if (task != null)
            task.postStop();
    }
}

MySurfaceViewThread.java:

public class MySurfaceViewThread extends Thread {
    private SurfaceHolder holder = null;
    private int blue = 235;
    private volatile boolean run = true;

    public MySurfaceViewThread(SurfaceHolder h) {
        holder = h;
    }

    @Override
    public void run() {
        while(run) {
            if (holder.getSurface().isValid()) {
                Canvas c = holder.lockCanvas();
                if ((blue += 10) > 255)
                    blue = 0;
                c.drawColor(Color.argb(255, 0, 0, blue));
                holder.unlockCanvasAndPost(c);

                try {
                    Thread.sleep(2000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    public void postStop() {
        run = false;
    }
}

问题

表面视图永远不会更新,即使 idrawColor反复。不抛出异常,并且lockCanvas调用 and unlockCanvasAndPost。但是,启动应用程序后,活动仍然是黑色的。

我注意到一些有趣的行为:如果我限制while循环运行的次数,那么在线程完成后,表面视图将最终绘制。

我知道我可以复制并粘贴一些工作代码,但我提出这个问题的目的是更好地理解为什么不起作用,并了解一些有关 Android 的知识SurfaceView

4

2 回答 2

1

尝试holder = getHolder();从您的构造函数中删除。并添加this.holder = holder;到您的public void surfaceCreated(SurfaceHolder holder)方法中。

于 2013-07-30T20:00:33.607 回答
-1

我不敢相信:它归结为一行(不是一直都是这样吗?):

task.run(); // NO!...runs the code synchronously

相对:

task.start(); // starts running the code in a separate thread, as expected.
于 2013-07-30T21:42:46.200 回答