2010-11-30 16 views
0

私はAndroidには新しくプログラミングには向いていません。下のコードは、アンドロイドでデフォルトで利用可能なicon.pngを作成し、画面を横切るか、少なくとも想定されています。これは機能しません。誰も助けることができますか?Androidループの問題

> package com.android.test; import 
> android.app.Activity; import 
> android.content.Context; import 
> android.graphics.Bitmap; import 
> android.graphics.BitmapFactory; import 
> android.graphics.Canvas; import 
> android.graphics.Color; import 
> android.os.Bundle; 
> 
> 
> import android.view.View; import 
> android.view.Window; 
> 
> public class Android extends Activity 
> { int x,y=10; 
> 
> @Override public void onCreate(Bundle 
> savedInstanceState) { 
> super.onCreate(savedInstanceState); 
> requestWindowFeature(Window.FEATURE_NO_TITLE); 
> setContentView(new Panel(this)); } 
> 
> class Panel extends View { public 
> Panel(Context context) { 
> super(context); } 
> 
> @Override public void onDraw(Canvas 
> canvas) { Bitmap _scratch = 
> BitmapFactory.decodeResource(getResources(), 
> R.drawable.icon); 
> canvas.drawColor(Color.BLACK); int 
> n=1; while (n==1){ try { 
> Thread.sleep(30); } catch 
> (InterruptedException e) { } 
> canvas.drawBitmap(_scratch, x, y, 
> null); x+=2; y+=2; 
> 
> canvas.drawBitmap(_scratch, x, y, 
> null); } } } } 
+4

「>」文字を取り出してコードを正しくフォーマットできますか? – elevine

答えて

0

私も素人のAndroid Devのだ、と私はその悪い癖が回避策としてのThread.sleep()を呼び出すようにすることを読んで思い出し思います。しかし私は間違っている可能性があります。

2

あなたのonDraw()メソッドは返されません。それは必要です。あなたのアプリは数秒後に強制終了しますか? onDraw()内でループするのではなく、30ミリ秒後に再描画するために、UIスレッドにメッセージをポストする必要があります。私の頭の上から、代わりにこれを試してみてください。もちろん

class Panel extends View { 
    public Panel(Context context) { 
    super(context); 
    } 

    int x = 0; 
    int y = 0; 
    Bitmap _scratch = BitmapFactory.decodeResource(getResources(), R.drawable.icon); 

    @Override public void onDraw(Canvas canvas) { 
    canvas.drawColor(Color.BLACK); 
    canvas.drawBitmap(_scratch, x, y, null); 
    x+=2; y+=2; 
    this.postInvalidateDelayed(30); 
    } 
} 

を使用すると、アイコンはエッジをオフに行った後にループを停止するいくつかのコードを追加する必要があります。

+0

お、ありがとうございます。できます。しかし、あなたは "this.postInvalidateDelayed(30);"ありますか? – efa

+0

アクティビティは、メインスレッド(UIスレッド)によって実行され、このスレッドはメッセージキューの周りをループして何をするかを決定します。 postInvalidateDelayed()は、キューにメッセージを追加します。メッセージは30ミリ秒後に再描画する必要があります。 30 ms後、メインスレッドはこのメッセージを受け取り、onDraw()メソッドを呼び出します。これは、別のメッセージを投稿します。 –

+0

これは、アプリケーションが応答しないというエラーの原因ともなります。メインスレッドがメッセージを処理するのに5秒以上かかる場合、Androidはそれを問題と見なします。そのため、onDraw()の内部でループすることはできません。 –

0

onDrawは、ディスプレイを1回レンダリングするためのものです。 onDrawでこのループを試してみることはおそらく悪い考えです。

ループを使用するのではなく、アニメーションを試してみるとよいでしょう。 "Androidのアニメーションのチュートリアル"または類似のもののgoogle検索を行います。