Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

delaye canvas update using Timer Class

I created a view type-class in which onDraw() method i am drawing some boxes. The thing in which i am not getting succeed is that, i want to disappear these boxes after 3-5 second. For this i am using timer and timerTask. In TimerTask i am overriding the method run() which changes the color of Paint object to white. The background color is also white so it will give the effect that boxes are erased. Can you guys help me out??

 public class PlayView extends View
{
private float width,height;
private int touchatX, touchatY;
private boolean isanyBox, clearCanvas;
private Point  points[];
private Paint  box;
Timer timer;
TimerTask task;


  //  Set the number of points to be generated so we print that number of boxes on the board
public void nPoints(int n)
{
    points = new Point[n];
    box = new Paint();
    box.setColor(Color.BLUE);
}

public void init()
{
        isanyBox = false;
        clearCanvas = true;
        timer = new Timer();
        task = new TimerTask()
        {
            @Override
            public void run()
            {
                box.setColor(Color.WHITE);
            }
        };
}


      @Override
     protected void onSizeChanged(int w, int h, int oldw, int oldh) 
 {
// TODO Auto-generated method stub

   width = w/6f;
   height = h/6f;

   Log.d("playview", getWidth()+" "+getHeight());
    super.onSizeChanged(w, h, oldw, oldh);
}

public PlayView(Context context)
   {
       super(context);
       setFocusable(true);
       setFocusableInTouchMode(true);
       init();
   }


// Randomly generate the points and draw boxes on these points
public void generatePoints(int np)
{
    Time sec = new Time();

    Random random_Xpoints = new Random();
    Random random_Ypoints = new Random();

    random_Xpoints.setSeed(sec.second);
    random_Ypoints.setSeed(sec.second);
    nPoints(np); // set the number of points to be generated

    for(int i=0; i<np; i++)
    {
        points[i] = new Point();

        points[i].setX( ((random_Xpoints.nextInt(getWidth())/(int)width)*(int)width));
        points[i].setY( ((random_Ypoints.nextInt(getHeight())/(int)height)*(int)height));

        Log.d("Point "+1, points[i].getX()+" "+points[i].getY());
    }
}




     @Override
    public boolean onTouchEvent(MotionEvent event) 
     {
      // TODO Auto-generated method stub

   invalidate();
   isanyBox = true;
   touchatX = (int) ((int) (event.getX()/width)*width);
   touchatY = (int) ((int) (event.getY()/height)*height);
   Log.d("onTouchEvent", event.getX()+" "+event.getY()+" "+touchatX+" "+touchatY);
      invalidate(); 
    return super.onTouchEvent(event);
}


    public void onDraw(Canvas canvas)
  {
   Paint lineColor = new Paint();
   lineColor.setColor(Color.BLACK);

   //Box property
   Paint boxColor = new Paint();
   boxColor.setColor(Color.BLUE);

   //Draw horizontal lines
   for(int i=0; i<6; i++)
   {
      canvas.drawLine(0, i*height, getWidth(), i*height, lineColor);
   }

   //Draw vertical lines
   for(int j=0; j<6; j++)
   {
       canvas.drawLine(j*width, 0, j*width, getHeight(), lineColor);
   }

   if(isanyBox)
   {
   canvas.drawRect(touchatX+2, touchatY+2, touchatX+width-1, touchatY+height-2, boxColor);
   }


       generatePoints(5);
       for(int j=0; j<5; j++)
       {
           canvas.drawRect(points[j].getX()+2, points[j].getY()+2, points[j].getX()+width-1, points[j].getY()+height-2, box);
           Log.d("BoxColor", ""+box);
       }

       if(clearCanvas)
       {

           timer.schedule(task, 3000);
           clearCanvas = false;
           invalidate();
       }

   }
 }
like image 328
umerk44 Avatar asked Nov 26 '25 19:11

umerk44


1 Answers

call invalidate(); after changing the color. This will force the system to call onDraw() again.

        @Override
        public void run()
        {
            box.setColor(Color.WHITE);
            invalidate();
        }

edit:

I've never liked timers and now I now why, that's why and also for some reason the Android team suggests people not to use them as it can be read here: http://developer.android.com/reference/java/util/Timer.html

because you're on a class that extends View, you should just call postDelayed();

  if(clearCanvas)
   {
       clearCanvas = false;
       postDelayed(new Runnable{
        @Override
        public void run(){
            box.setColor(Color.WHITE);
            invalidate();
        }
       }, 3000);
   }
like image 102
Budius Avatar answered Nov 28 '25 09:11

Budius