2011-06-28 14 views
0

私は画面にイメージを置き、5秒ごとにそれを変更しようとしています。これはActivityクラスにはありません。申し訳ありませんが、愚かな質問です。これは私にとって大きな学習曲線です。アンドロイドのハンドラーを使って一連のpngを作成する

public class Panel extends SurfaceView implements SurfaceHolder.Callback { 
    private Handler mHandler = new Handler(); 
    //stuff 

    public void doDraw(Canvas canvas) { 
     int counter = 0; 
     canvas.drawColor(Color.BLACK); 
     dot1.doDraw(getResources(), canvas, counter); 
      mHandler.removeCallbacks(panelDraw); 
       mHandler.postDelayed(panelDraw, 5000); 
} 

private Runnable panelDraw = new Runnable() { 
     public void run() { 

     } 
}; 

(パネル - >)別のクラスのmPanel.doDraw(canvas)は、PanelにリストされているdoDrawを呼び出します。これはループしている。

私が知る限り、最初の画像は5秒間停止せず、他のコードのために、猫の写真が画面全体に点滅します。私は何もしないで立ち去ることができますか?私はそこにdot1.doDraw(getResources()、canvas、counter)を入れたいと思いましたが、void run()パラメータやRunnableのpanelDrawリソース、canvas、counterパラメータを与えることができませんでした。

何か助けていただければ幸いです。コードをもっと与える必要があるかどうかを教えてください。


私のゲームについてもう少しです:子猫の写真は、画面上のランダムな場所に表示されます。割り当てられた時間の現在のキティ画像をクリックしないと、ゲームは終了します。これらの写真は最後に<の1秒後に表示されます(テスト目的では今すぐです)。その時間帯にキティをクリックしないと、ゲームは終了します。

多くの描画が必要な場合は、チュートリアルのようにSurfaceViewを使用する方がよいと聞いています。http://www.droidnova.com/2d-tutorial-series-part-v,848.html My Activityクラス(Scene1)にsetContentView(新しいPanel(this)だから私はすべてがPanelクラスに入っているときに、Activityクラスに物を入れる方法を知らない。アクティビティスレッドが実際にあまり効果を上げず、Panelにすべて渡すとImageViewコードはどこに置かれますか?私は、実行中の処理ViewThread(publicクラスViewThreadがスレッドを拡張する)持っている場合にも:

public void firstRing(Resources res, Canvas canvas, int counter){ 
    Random rand = new Random(); 
     switch(counter) { 
      case 0: mBitmap = BitmapFactory.decodeResource(res,  
         R.drawable.cat1_m); 
       break; 
      case 1: mBitmap = BitmapFactory.decodeResource(res, 
         R.drawable.cat2_m); 
       break; 
      case 2: mBitmap = BitmapFactory.decodeResource(res,     
         R.drawable.cat2_m); 
       break; 
      case 3: mBitmap = BitmapFactory.decodeResource(res, 
         R.drawable.cat2_m); 
       break; 
      case 4: mBitmap = BitmapFactory.decodeResource(res,       
         R.drawable.cat2_m); 
          break; 
      case 5: mBitmap = BitmapFactory.decodeResource(res, 
         R.drawable.cat1_m); 
       break; 
     } 
     mX = rand.nextInt((int)(Panel.mWidth - mBitmap.getWidth())); 
     mY = rand.nextInt((int)(Panel.mHeight - mBitmap.getHeight())); 
    canvas.drawBitmap(mBitmap, mX, mY, null); 

public void doDraw(Resources res, Canvas canvas, int counter) { 
     firstRing(res, canvas, counter); 
} 

public void run() { 
    Canvas canvas = null; 
    while (mRun1) { 
    do { 
     canvas = mHolder.lockCanvas(); 
      if (canvas != null) { 
       mPanel.doDraw(canvas); 
       mRun1 = true; 
       mRun1 = mPanel.get_run(); 
       mHolder.unlockCanvasAndPost(canvas); 
      } 
    } while (mRun1 == true); 

をドットクラスのような何かを持っています情報をありがとう、バリー、私は少し混乱していますが。私はそれを使用する方法がわからなくてもImageViewを試すか、Handler()を使用して固定しますか?現在動作していませんか?私はpublic void run()で何か必要ですか?

+0

rochdevが指摘したように、あなたは基本的にあなたが作成したスレッドである非UIスレッド(で見ると協力することはありませんので、私は私の元の答えを削除あなた自身)。 簡単な答えは、ImageViewとハンドラを使用することです。私は以下の新しい答えで説明しようとします。 –

答えて

0

このコードは私の最後の答えよりもうまくいくはずですが、コンパイルしたりテストしたりしていません。それが動作しなくても、正しい方向にあなたを指し示します。アクティビティのサブクラスをどこかに持っていると仮定して、あなたのアクティビティに自分のコードをコピーします。あなたのレイアウトはどこかに<ImageView>タグを持っているはずです。

以下のコードは、UIスレッドで実行されるActivity.onCreate()のハンドラを作成し、ハンドラへのすべての呼び出しがUIスレッドでも実行されることを保証します。その後、showNextKittyImage()を呼び出して最初のイメージを表示します。 showNextKittyImage()は、ImageViewのDrawableリソースIDを設定してから、Handler.sendEmptyMessageDelayed()を呼び出して5秒後にハンドラを呼び出します。ハンドラはshowNextKittyImage()を呼び出し、サイクルが繰り返されます。

画像を表示するように設計されているため、ImageViewはSurfaceViewよりも優れています。あなたがする必要があるのは、ビットマップを使いこなす代わりにDrawableリソースIDを渡すことだけです。あなたが本当にSurfaceViewでそれをやりたいのであれば、私はあなたを助けません。

このコードでは、子猫がランダムに表示されることはありません。最初に1つの場所で作業してから、ImageViewをランダムに画面の周りに移動するコードを追加します。その時点で助けが必要な場合は、1つの投稿に対してたくさん質問したので、新しい質問を投稿することを強くお勧めします。

幸運、

バリー

public class KittyActivity extends Activity { 

    Handler mHandler; 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     // Inflate your view 
     setContentView(R.layout.YOUR_LAYOUT); 

     // Create a handler ON THE UI THREAD 
     mHandler = new Handler(Message result) { 
      public void handleMessage(Message result) { 
       showNextKittyImage(); 
      } 
     }; 

     // Show the first kitty 
     showNextKittyImage(); 
    } 

    public void showNextKittyImage() { 
     int kitty = getNextKitty(); 
     ImageView iv = findViewById(R.id.YOUR_IMAGE_VIEW_ID); 
     iv.setImageResource(kitty); 

     // OPTIONAL: Move the ImageView to a new random location 

     mHandler.sendEmptyMessageDelayed(0, 5000); 
    } 


    private int getNextKitty() { 
     // Your code to get the next kitty drawable id 
    } 
} 
+0

ワーカースレッド上でImageViewを操作しないでください。 「これはUIのシングルスレッドモデルに違反しています。Android UIツールキットはスレッドセーフではなく、常にUIスレッドで操作する必要があります」 - http://developer.android.com/resources/articles/painless-threading html。代わりに、postDelayed(Runnable r、long delayMillis)でHandlerを使用してください。 – rochdev

+0

rochdevあなたは絶対に正しいです。私の悪い。 ハンドラがonCreate()のUIスレッドで作成されるため、上記の新しいコードはUIスレッドモデルに違反してはいけません。 –

関連する問題