Android延迟变色



好吧,到目前为止,我一直在寻找解决这个问题的方法,我已经做了大约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();
}

您无法控制调用onDraw的次数,这取决于Android。

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

OnDraw在大多数情况下每秒会被调用多次。它将在潜在的随机时间间隔内这样做,这取决于代码的设置方式

因此,你的第一次调用可能发生在时间=0ms,第二次调用可能出现在100ms,等等。因此,你可能会在100ms内得到一个蓝色,然后是一个红色,直到下一次颜色发生变化。你需要重组你的处理程序,使它们很可能在你的绘图机制之外

也许会使onDraw方法之外的单个处理程序中的draw视图无效。类似于这条线上的东西,它会循环并用不同的颜色不断更新视图警告,未测试,快速伪代码

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

最新更新