Android - 尝试每3-5秒更改一次弹跳球的颜色?

时间:2014-08-25 05:31:55

标签: java android

我是Android编程的新手,现在正在练习我正试图制作一个应用程序,这个球在屏幕上反弹,同时改变各种颜色,如红色,绿色,蓝色和黄色。到目前为止,我已经设法让球反弹,但我现在正在努力的问题是球每三到五秒换一次颜色,这是我迄今为止所拥有的。这似乎有效,但只是在你第一次开始活动之后,它会回到随机变化的颜色,而不必等待三秒钟来改变,谢谢,并希望得到任何帮助。

@Override
protected void onDraw(Canvas canvas) {
    // TODO Auto-generated method stub
    ballBounds.set(ballX-ballRadius, ballY-ballRadius, ballX+ballRadius,ballY+ballRadius);
    Handler handler = new Handler();        
    int rnd = (int)(Math.random() * 4);
    switch(rnd){
    case 0:handler.postDelayed(new Runnable(){
        public void run(){
        paint.setColor(Color.BLUE);
        }
    }, 3000);
        break;
    case 1: handler.postDelayed(new Runnable(){
        public void run(){
        paint.setColor(Color.RED);
        }
    }, 3000);
        break;
    case 2: handler.postDelayed(new Runnable(){
        public void run(){
        paint.setColor(Color.GREEN);
        }
    }, 3000);
        break;
    case 3:handler.postDelayed(new Runnable(){
            public void run(){
            paint.setColor(Color.YELLOW);
            }
        }, 3000);
        break;
    }

    canvas.drawOval(ballBounds, paint);

2 个答案:

答案 0 :(得分:1)

您的问题是,您在onDraw中开始换色。每次重绘球时,都会将新的Runnable添加到消息队列中。每个Runnable只会在3秒后执行,因为它已添加到队列中,但不会在执行之前的消息中执行。

这就是为什么你得到延迟,当你开始活动,但后来看到更快的变化。

您可以创建颜色更改线程,但每次新颜色计算之间都有延迟构建。这样你就得到了你想要的延迟。

答案 1 :(得分:0)

尝试这样的事情:

@Override
protected void onDraw(Canvas canvas) {
    // TODO Auto-generated method stub
    ballBounds.set(ballX-ballRadius, ballY-ballRadius, ballX+ballRadius,ballY+ballRadius);

canvas.drawOval(ballBounds, paint);
}

public void startLoading(){
    task = new TimerTask() {

        @Override
        public void run() {

            int rnd = (int)(Math.random() * 4);
            switch(rnd){
            case 0:
                paint.setColor(Color.BLUE);
                break;
            case 1: 
                paint.setColor(Color.RED);
                break;
            case 2: 
                paint.setColor(Color.GREEN);
                break;
            case 3:
                paint.setColor(Color.YELLOW);
                break;
            }
            postInvalidate();
        }

    };
    timer = new Timer();
    timer.schedule(task, 0, 3000);

}