Android延迟改变颜色?

时间:2014-08-27 20:22:19

标签: java android ondraw

好吧,到目前为止,我一直在寻找解决这个问题的方法,而且我已经在这已经过了5天,所以我会尝试解释它尽可能最好我有这个应用程序工作正常我唯一挣扎的是球的颜色变化。问题是我希望它每5秒钟改变一次,而不是随便随意改变而不等待。例如,当应用程序打开时,应用程序中的球颜色为红色,持续时间为5秒,然后在变为蓝色后等待另外5秒,然后再更改为另一种颜色。我试图在代码中找出onDraw随机改变颜色而不等待的代码?我非常感谢任何帮助或建议,因为我已经有一段时间了。

          @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);

update();

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

invalidate();
}

2 个答案:

答案 0 :(得分:1)

您无法控制onDraw的调用次数,由Android决定。

相反,您可以运行一个单独的线程,它会每5秒更改一次颜色的值,并让onDraw使用此值。

答案 1 :(得分:0)

在大多数情况下,OnDraw将每秒调用多次。它将以潜在的随机时间间隔进行,具体取决于代码的设置方式。

因此,您第一次进入平局时可能会发生时间= 0ms,您的第二次通话可能发生在100ms等等。因此,您可能会获得100ms的蓝色,然后是红色,直到下一次颜色发生变化。您需要重新构建处理程序,以便它们最有可能位于绘制机制之外。

或许在onDraw方法之外的单个处理程序中绘制视图无效。与此类行中的某些内容类似,它会循环并以不同的颜色不断更新视图。 警告,未经过测试,快速伪代码

public MyViewConstructorOrSimilarClass()
{
    Handler handler = new Handler();
    Runnable runnable = new Runnable() {
      @Override 
      public void run() 
      {
         int rnd = (int)(Math.random() * 4);
         switch(rnd)
         {
             case 0:
                globalpaint.setColor(Color.BLUE);
                break;
             case 1:
                globalpaint.setColor(Color.RED);
                break;
             case 2:
                globalpaint.setColor(Color.GREEN);
                break;
             case 3:
                globalpaint.setColor(Color.YELLOW);
                break;
         }
         invalidate();//requestLayout(); Depends on view.
         handler.postDelayed(runnable, 3000);
       }
    };
}

@protected void onDraw(Canvas canvas) 
{
    ballBounds.set(ballX-ballRadius, ballY-ballRadius, ballX+ballRadius,ballY+ballRadius);  
    canvas.drawOval(ballBounds, globalpaint);
}