2012-01-11 16 views
0

Viewクラスを拡張するクラスで、onDraw(Canvas canvas)メソッドを使用してカスタムビューを作成しました.2秒ごとにビューを更新するinvalidate()メソッドを使用しています。時間は120秒後に言う。無効化()メソッドを停止する方法は?どんな提案や助けも高く評価されます。カスタムビューの更新を停止する方法はありますか?

EDIT

はここに私のコードです: - あなただけのカウンタ(例えばint型myCounter)を使用し、各サイクルで2によって、その値を大きくする必要が

public GameView(Context context){ 
super(context); 

Display display = ((WindowManager)context.getSystemService(
      Context.WINDOW_SERVICE)).getDefaultDisplay(); 
} 

@Override 
    public void draw(Canvas canvas) { 
     // TODO Auto-generated method stub 
     super.draw(canvas); 

     int x = 0; 
     int y = 0; 

     bmp = BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher); 
     int imageWidth = bmp.getWidth(); 
     int imageHeight = bmp.getHeight(); 

     int width = display.getWidth(); 
     System.out.println("Width = " +width); 
     int height = display.getHeight(); 
     System.out.println("Height = " +height); 
     Random randomX,randomY; 
     randomX = new Random(); 
     randomY = new Random(); 

     x = randomX.nextInt(width - imageWidth); 
     System.out.println("X = " +x); 
     y = randomY.nextInt(height - imageHeight); 
     System.out.println("Y = " +y); 

     Rect dst = new Rect(x , y , x + imageWidth , y + imageHeight); 
     canvas.drawBitmap(bmp, null , dst , null); 
     System.out.println("dst = " +dst); 
     try{ 
     Thread.sleep(1000) 
     } 
     catch(Exception e){ 

     } 
     invalidate(); 

    } 
+0

どこからinvalidate()を呼び出しますか? – Flo

+0

サンプルコードを投稿できますか? – nik431

+0

編集した内容をご覧ください。 – himanshu

答えて

0

。変数myCounterが120より小さい場合にのみ、このプログラムブロックを実行できるように、スレッドを呼び出すコードとinvalidate()をチェック命令の中に入れておくことができます。

0

まあ、私は個人的にブロックしません私の描画メソッド内でThread.sleep(1000)を呼び出すことによってUIスレッド。代わりに、Handlerオブジェクトを使用して、繰り返しのinvalidate()呼び出しをスケジュールするために、再帰的なpostDelayed呼び出しを呼び出します。最後に、私は "アニメーション"を開始し、必要に応じてそれを中断する2つの特別な関数をコーディングしたいと考えています(コードはテストされていません...私のポイントを説明するために数秒で書きました。上記のようにUIスレッドのブロッキングの問題は解決されませんが、Aderito Brincaによって記述されたものは正確です。

private Handler mHandler = new Handler(); 
private boolean isAnimStarted=false; 
final private long refreshIntervalMsec = 2000;  //2 seconds refresh rate 
final private long maxRefreshTimeMsec = 120000; //120 seconds deadline 
private long systemTimeMillisOnStart = -1L; 
private Display display = null; //within a local variable declared in GameView 
//constructor this variable was useless. Now that it is a private 
//class member, it can be used by overridden onDraw or Draw methods. 

public GameView(Context context){ 
    super(context); 
    display = ((WindowManager)context.getSystemService(
      Context.WINDOW_SERVICE)).getDefaultDisplay(); 
    //INSERT THE REST OF YOUR CONSTRUCTOR CODE HERE 
} 

public boolean isGameViewAnimStarted(){ //CALL this in order to check for running anim 
    return isAnimStarted; 
} 

public void startGameViewAnim(){ //CALL this to start your anim thing 
    isAnimStarted=true; 
    systemTimeMillisOnStart = SystemClock.uptimeMillis(); 
    refreshAnim(); 
} 

private void refreshAnim(){ 
    invalidate(); 
    if( (SystemClock.uptimeMillis() - systemTimeMillisOnStart) < maxRefreshTimeMsec){ 
     mHandler.postDelayed(new Runnable(){ 
      public void run(){    
       refreshAnim(); 
      } 
     }, refreshIntervalMsec); 
    } 
    else{ 
     stopGameViewAnim(); 
    } 
} 

public void stopGameViewAnim(){ //CALL this to interrupt your anim thing 
    mHandler.removeCallbacksAndMessages(null); 
    isAnimStarted=false; 
} 



@Override 
public void draw(Canvas canvas) { 
    // TODO Auto-generated method stub 
    super.draw(canvas); 
    //INSERT YOUR CODE HERE 

} 
関連する問題