2017-08-26 10 views
2

2秒ごとに円を生成したいのですが、この場合は5ですが、それを得ることはできません。 2秒ごとにサークルを作成する代わりに、アプリは10秒待って5つのサークルをまとめて描画します。私は間違って何をしていますか?ありがとうございました。あなたがメインスレッドを一時停止しているonDrawで実行を呼び出すことにより、2秒ごとに円を生成する方法

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

    } 
} 

}

答えて

0

。メインスレッドがフレームワーク内のイベントループに戻るまで、ドローは表示されません。そのため、メインスレッドでスリープや他のブロック機能を呼び出すべきではありません(基本的に、あなたのアプリケーションはフリーズしているように見えます)。 2秒以内に何かをしたい場合は、ハンドラを作成し、postDelayed()を使ってメッセージを送ります。次に、メッセージの実行可能ファイルにビューが描画するように設定されているサークルの数を増やしてから、ビューを無効にして次の2秒間別のメッセージを投稿します。ビューは、描画する円の数を変数でチェックして、onDrawに描画されます。

0

その

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()メソッド

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

     e.printStackTrace(); 
    } 
} 

についての何が、私はあなたが

NOTE使用されている方法のようにしないでください。このクラスは、別のスレッドで実行する必要があります(中背景)

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); 
}} 
関連する問題