在Android的Canvas上一个接一个地绘制形状

时间:2015-08-21 11:09:58

标签: java android canvas

很抱歉,如果之前有人问这个问题,但我环顾四周,无法找到答案。

所以我使用线程将事物绘制到SurfaceView上以更新对屏幕所做的任何更改,并且我还有一个矩形数组。如何一个接一个地绘制矩形,并在结束时将所有这些矩形放在屏幕上?我认为在run()方法中有一个for循环,其中绘制的所有东西都可以工作,但它最终会立即全部绘制它们(我可以理解为什么)。然后,我尝试在for循环中的每次绘制之后放置一个Thread.sleep,但它只是等到绘制到画布之前绘制所有rects之后。 (再次,因为画布直到for循环之后才解锁)才有意义。如果我想要,比如说,在绘制rects之间暂停两秒钟,我该怎么办呢?

由于

编辑:这是SurfaceView。 pause()和resume()方法在作为视图的活动的onPause和onResume方法中调用。

类TestView扩展了SurfaceView实现的Runnable {

SurfaceHolder holder;
Thread t;
Rect[] rectArray;

public TestView(Context context) {
    super(context);
    holder = getHolder();
    rectArray = shapes.getRectArray();
}

@Override
public void run() {
    while(true){
        if(!holder.getSurface().isValid())
            continue;

        Paint p = new Paint();
        p.setColor(Color.BLACK);
        p.setStrokeWidth(10)

        Canvas c = holder.lockCanvas(null);
        c.drawARGB(255, 255, 255, 255);

        for(int i = 0; i<rectArray.length; i++){
            c.drawRect(i,p);
        }

        holder.unlockCanvasAndPost(c);

    }
}

public void pause(){

}

public void resume(){
    t = new Thread(this);
    t.start();
}

}

1 个答案:

答案 0 :(得分:1)

我可能会抽象线程和SurfaceView并做一个基本的#34;游戏循环&#34;所以我可以完全控制什么时候画出来。

以下是游戏循环部分:

public class GameLoopThread extends Thread
{
private TestView view;

private boolean running = false;

public GameLoopThread(TestView view)
{
    this.view = view;
}

public void setRunning(boolean run)
{
running = run;
}

@SuppressLint("WrongCall")
@Override
public void run()
{
    long startTime = System.currentTimeMillis();

    while (running)
    {
        Canvas c = null;

        //call update with the number of milliseconds that have passed since the last loop iteration
        view.update(System.currentTimeMillis() - startTime);

        startTime = System.currentTimeMillis();

        try
        {
            c = view.getHolder().lockCanvas();

            synchronized (view.getHolder())
            {
                //call onDraw so my surface draws the rectangles
                view.onDraw(c);
            }
        }
        finally
        {
            if (c != null)
            {
                view.getHolder().unlockCanvasAndPost(c);
            }
        }
    }
}
}

以下是我的新表面视图:

public class TestView extends SurfaceView
{
     private long totalElapsedTime = 0;
    private Rect[] rectArray;
    private int rectCount = 0;
    private Paint p;
    private GameLoopThread gameLoopThread;

    public TestView(Context context)
    {
        super(context);

       rectArray = shapes.getRectArray();

        p = new Paint();
        p.setColor(Color.BLACK);
        p.setStrokeWidth(10)

       gameLoopThread = new GameLoopThread(this);
       holder = getHolder();
       holder.addCallback(new SurfaceHolder.Callback()
       {

           @Override
            public void surfaceDestroyed(SurfaceHolder holder)
           {
                boolean retry = true;
                gameLoopThread.setRunning(false);
               while (retry)
               {
                  try
                  {
                     gameLoopThread.join();
                     retry = false;
                  }
                  catch (InterruptedException e)
                 {
                 }
              }
          }

          @Override
           public void surfaceCreated(SurfaceHolder holder)
           {
              gameLoopThread.setRunning(true);
              gameLoopThread.start();
           }

           @Override
           public void surfaceChanged(SurfaceHolder holder, int format, int width, int height)
           {
           }
    }



    public void update(long elapsedTime)
    {
        totalElapsedTime += elapsedTime;

        //increase the rectCount every second
        rectCount = totalElapsedTime / 1000;

       if(rectCount > rectArray.length)
       {
          rectCount = rectArray.length;
       }
    }


     @Override
     public void onDraw(Canvas canvas)
     {
        canvas.drawARGB(255, 255, 255, 255);

        //draw my rectangles here
        for(int i = 0; i < rectCount; i++)
        {
            canvas.drawRect(i,p);
        }
     }