Как сделать паузу на 5 секунд, прежде чем рисовать следующую вещь на Android? - PullRequest
5 голосов
/ 12 июля 2011

Скажем, я хочу нарисовать линию, затем подождать пять секунд, а затем нарисовать еще одну линию.У меня есть такой метод:

    public void onDraw(Canvas canvas) {
        int w = canvas.getWidth();
        int h = canvas.getHeight();
        canvas.drawLine(w/2, 0, w/2, h-1, paint);
        // PAUSE FIVE SECONDS
        canvas.drawLine(0, h/2, w-1, h/2, paint);
    }

Как мне сделать паузу?

Ответы [ 4 ]

6 голосов
/ 12 июля 2011

вы можете использовать CountDownTimer следующим образом:

public void onDraw(Canvas canvas) {
        int w = canvas.getWidth();
        int h = canvas.getHeight();
        canvas.drawLine(w/2, 0, w/2, h-1, paint);
        // PAUSE FIVE SECONDS
        new CountDownTimer(5000,1000){

            @Override
            public void onTick(long miliseconds){}

            @Override
            public void onFinish(){
               //after 5 seconds draw the second line
               canvas.drawLine(0, h/2, w-1, h/2, paint);
            }
        }.start();

    }

С уважением,

2 голосов
/ 12 июля 2011

Не ждите метода onDraw, который вызывается в потоке пользовательского интерфейса, и вы заблокируете его.Используйте флаги, чтобы определить, какая линия будет нарисована

boolean shouldDrawSecondLine = false;

public void setDrawSecondLine(boolean flag) {
    shouldDrawSecondLine = flag;
}

public void onDraw(Canvas canvas) {
    int w = canvas.getWidth();
    int h = canvas.getHeight();
    canvas.drawLine(w/2, 0, w/2, h-1, paint);
    if (shouldDrawSecondLine) {
        canvas.drawLine(0, h/2, w-1, h/2, paint);
    }
}

Чем использовать ее в вашем коде, как этот

final View view;
// initialize the instance to your view
// when it's drawn the second line will not be drawn

// start async task to wait for 5 second that update the view
AsyncTask<Void, Void, Void> task = new AsyncTask<Void, Void, Void>() {
    @Override
    protected Void doInBackground(Void... params) {
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
        }
        return null;
    }

    @Override
    protected void onPostExecute(Void result) {
        view.setDrawSecondLine(true);
        view.invalidate();
        // invalidate cause your view to be redrawn it should be called in the UI thread        
    }
};
task.execute((Void[])null);
1 голос
/ 12 июля 2011

Ну ... вы могли бы установить флаг в (который был бы в каком-то другом методе) и в пределах вашего onDraw() в зависимости от значения этого флага нарисовать эту линию.

т.е. может быть что-то вроде (хотя я не уверен, зачем вам нужна пауза)

invalidate();
pause/sleep();
//set flag
invalidate();
0 голосов
/ 12 июля 2011

Используйте Thread.sleep(5000), это должно сделать.

...