2017-08-26 3 views
2

Je veux générer des cercles toutes les 2 secondes, dans ce cas 5 mais je ne peux pas l'obtenir. Au lieu de créer un cercle toutes les 2 secondes, l'application attend 10 secondes et dessine les 5 cercles ensemble. Qu'est-ce que je fais mal? Je vous remercie.Comment générer des cercles toutes les 2 secondes

public class Juego extends SurfaceView{ 

boolean isItOK = false; 

Paint paint; 
int CantidadDeEsferas = 5; 
int radio, alto, ancho; 

public Juego(Context context, @Nullable AttributeSet attrs) { 
    super(context, attrs); 

    paint = new Paint(); 
} 

public void onDraw(Canvas canvas){ 

    paint.setColor(Color.WHITE); 
    canvas.drawRect(0, 0, getWidth(), getHeight(), paint); 

    paint.setColor(Color.BLACK); 

    for (int i=0; i<CantidadDeEsferas; i++) { 

     Random r = new Random(); 
     alto = r.nextInt(canvas.getHeight()); 
     ancho = r.nextInt(canvas.getWidth()); 
     radio = r.nextInt(101 - 50) + 50; 
     canvas.drawCircle(ancho, alto, radio, paint); 
     run(); 
     isItOK = true; 
    } 
} 

public void run(){ 
    while (isItOK){ 
     try 
     { 
      Thread.sleep(2000); 
      isItOK = false; 
     } catch (InterruptedException e) { 

      e.printStackTrace(); 
     } 

    } 
} 

}

Répondre

0

En appelant à l'exécution onDraw vous arrêtant le thread principal. Les dessins ne s'affichent que lorsque le thread principal revient à la boucle d'événements dans le framework. Vous ne devriez JAMAIS appeler le sommeil ou d'autres fonctions de blocage sur le thread principal à cause de cela (au fond, votre application semblera se bloquer). Si vous voulez faire quelque chose en 2 secondes, créez un gestionnaire et utilisez postDelayed() pour lui envoyer un message. Ensuite, le runnable du message augmente le nombre de cercles que la vue est configurée pour dessiner, puis invalide la vue et affiche un autre message pendant les 2 secondes suivantes. La vue devrait ensuite se dessiner dans son onDraw, en vérifiant la variable pour le nombre de cercles à dessiner.

0

Qu'en est-ce que

for (int i=0; i<CantidadDeEsferas; i++) { 

    Random r = new Random(); 
    alto = r.nextInt(canvas.getHeight()); 
    ancho = r.nextInt(canvas.getWidth()); 
    radio = r.nextInt(101 - 50) + 50; 
    canvas.drawCircle(ancho, alto, radio, paint); 
    run(); 
    while(isItOK); 
    isItOk = true; 
} 

Run méthode

public void run(){ 
    try 
    { 
     Thread.sleep(2000); 
     isItOK = false; 
    } catch (InterruptedException e) { 

     e.printStackTrace(); 
    } 
} 

mais je ne aime pas de cette façon que vous avez utilisé

(). REMARQUE: Cette classe doit fonctionner par un autre thread (en arrière-plan)

0
public class MyView extends View { 

private Paint paint; 
private List<Point> points; 
private Handler handler; 
private Random random; 


public MyView(Context context) { 
    super(context); 
    init(); 
} 

public MyView(Context context, AttributeSet attrs) { 
    super(context, attrs); 
    init(); 
} 

public MyView(Context context, AttributeSet attrs, int defStyleAttr) { 
    super(context, attrs, defStyleAttr); 
    init(); 
} 

private void init() { 
    paint = new Paint(); 
    paint.setColor(Color.BLACK); 
    handler = new Handler(); 
    points = new ArrayList<>(); 
    random = new Random(); 
    drawCircles(); 
} 

@Override 
protected void onDraw(Canvas canvas) { 
    super.onDraw(canvas); 
    for (Point point : points) { 
     canvas.drawCircle(point.x, point.y, 10, paint); 
    } 
} 

private void drawCircles() { 
    handler.postDelayed(new Runnable() { 
     @Override 
     public void run() { 
      for (int i = 0; i < 5; i++) { 
       Point point = new Point(); 
       point.set(random.nextInt(getHeight()), random.nextInt(getWidth())); 
       points.add(point); 
      } 
      invalidate(); 
      handler.postDelayed(this, 2000); 
     } 
    }, 2000); 
}}