如何在画布上SurfaceView多个绘图,没有绘图同步

时间:2013-10-06 21:28:57

标签: android canvas drawing surfaceview

我正在尝试做一个简单的应用程序,每500毫秒更改画布背景颜色,在画布上我想创建n个圆圈,每个圆圈每隔x毫秒改变一次。

如果我在“run()”方法中的睡眠时间由卡瓦斯颜色变化决定,我该怎么做呢?我应该为每个圈子创建一个新线程并同步所有圈子吗?

Cleary我还需要考虑在画布背景颜色变化之后必须绘制圆圈,因为我会冒着圆圈因为背景层被绘制而无法看到圈子的风险?

对于这种工作,我应该考虑使用opengl吗?

这是我的run():

public void run() {
            int i=0;
            Paint paint= new Paint();
            paint.setColor(Color.RED);

            Log.d("ZR", "in running");
            while(running){
                try {
                    Thread.sleep(500);
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                if(!holder.getSurface().isValid())
                    continue;
                Canvas canvas = holder.lockCanvas();
                canvas.drawRGB(rand.nextInt(255), rand.nextInt(255), rand.nextInt(255));
                canvas.drawCircle(canvas.getWidth()/2, canvas.getHeight()/2, 100, paint);
                holder.unlockCanvasAndPost(canvas);
                Log.d("ZR", "in running: "+i +" count: "+j);
                i++;
                j++;
            }
        }

1 个答案:

答案 0 :(得分:1)

使用Thread.sleep()的另一种方法是实现一个计时器来触发不同的绘图程序。这是一些伪代码:

timeOfLastBackgroundChange = currentSystemTime()
timeOfLastCircleResize = currentSystemTime()
needsCanvasRedraw = false

while(running) {
    if (currentSystemTime() - timeOfLastBackgroundChange > 500) {
        changeBGColor()
        timeOfLastBackgroundChange = currentSystemTime()
        needsCanvasRedraw = true
    }

    if (currentSystemTime() - timeOfLastCircleResize > n) {
        resizeCircle()
        timeOfLastCircleResize = currentSystemTime();
        needsCanvasRedraw = true
    }

    if (needsCanvasRedraw) {
        drawUpdatedObjects()
        needsCanvasRedraw = false
    }

基本上,在循环中,您可以跟踪上次更改背景颜色并调整圆圈大小。在循环的每次迭代中,您检查是否已经过了足够的时间来保证另一个背景更改或循环调整大小。如果有,则进行更改并记录更改的当前时间,以便记录下次更改的已用时间。 needsCanvasRedraw标志允许您仅在事物发生变化时重绘,而不是每次循环迭代。