2011-02-04 11 views
3

私は、Androidに新しいですし、私が概念を理解するトラブルを抱えていますので、基本的に、これは私はそれをよりよく理解するために何をしたいのか..ですAndroidのOnDraw()

  • 私はビューを拡張行うdrawShapeクラスを作成しました。 OnDraw()のこのクラスでは、円を作成して色で塗りつぶしています。

  • 私はアプリケーションを呼び出しています。 //この時点まで私はうまくやっています。今

、私は再塗装サークルを複数回する必要があります(ブルー、レッド、イエローなど。)

だから私は読んでいたし、最善の方法は、スレッドを使用することです。私も読んでpostInvalidate()を使って再描画する必要があります(私はこれを呼び出す必要がある場所からまだ理解していません)、これはアクティビティから呼び出されますか?、またはOnDraw()内で呼び出されますか?

うまくいけば、私が達成したいことを理解しておいてほしい、ちょうど私はこれを示す良いチュートリアルを見いだして、x倍の時間を再描画する方法です。Thread.sleep()を実行すると、私のアプリ..しかし、今なぜ私はメインのスレッドで遊んでいるので、理解しています。

私はこのことを理解して助けてください..

は、私は、あなたがあなたの活動の内部でタイマーとTimerTaskをを使用してこれを行うことができると思い、あなたに

答えて

0

ありがとうございます。 TimerTaskは指定した遅延で実行されます。実行するタイミングは、yourDrawShapeInstance.postInvalidate()です。

メカニズムはこれです.uiエンジンがpostInvalidate()を呼び出すと、uiエンジンが以前に呼び出した遅延無効化を選択したときにinvalidateを呼び出して、自動的にonDrawメソッドを呼び出します。 DrawShapeビューとビューが再描画されます。

描画

TimerTask task = new TimerTask(){ 
    public void run(){ 
    myDrawShapeInstance.postInvalidate(); 
    } 
} 
0

は、常にスレッドが終了した後に大部分が(無効常にメインスレッドから離れて糸を使用し、(私がここに書くテストこれをドント) - に描画による現在の結果を表示)。おそらく、ユーザー関連のイベントから描画関数を呼び出すので、その描画プロセスに別のスレッドを作成していることを確認してください。それらの規則に従えば、あなたは大丈夫でしょう。

void drawCircleToCanvas(int color) 
{ 
final Handler handler = new Handler() { 
      public void handleMessage(Message msg) { 
       myDrawShapeInstance.postInvalidate(); 
       } 
      }; 
     Thread updateUI = new Thread() { 
      public void run() { 

      //************draw something here*************** 

       handler.sendEmptyMessage(0); 
       } 
      }; 
      updateUI.start(); 
} 
+0

グレート私はランで、その後円を再描画する必要がある場合は、()i)はキャンバスC =新しいキャンバスのようなものを(置くことができます。ペイントペイント=新しいペイント();私はここからこれをすることができますか?何をお勧めしますか?また、ビューを拡張するクラスがある場合は、myClass.OnDraw()のようなことをすることはできますか? ? – earm

+0

ここではいくつかのことがあります:スレッドは、キャンバスに影響を与える値を更新するために使用する必要があります。ゲーム中のキャラクターの位置を動かすこと++ x(キャラクターを水平にある位置に動かす)。スレッドを使用して描画する円の数の値を変更し、変更する色を変更することができます。 postInvalidate()を呼び出すと、canvas onDraw()関数も呼び出されるため、onDraw()を直接呼び出す必要はありません。このリンクのコードは、あなたが行っているのと非常に似ています:http://blog.goltergaul.de/2010/03/android-game-project-basics-of-threads-and-canvas/ – ice911

3

私はこの

animcolor() 
{ 
Timer timer = new Timer(); 
int delay = ...; 
int period = ...; 
timer.schedule(new TimerTask(){ 
    run() { 
     setColor(randomint());) 
     customview.postInvalidate(); 
    } 
}, delay, period); 

スレッドのような何かをしましたか?それらを作成する必要はありません。タイマーは同時実行性に優れています。

...とコードは多少似ています....

res/layout/file.xml

<org.customviewlayout a:id="@+id/customlayout"/> 



src/org.MyActivity.java 


class MyActivity 
{ 
    onCreate() 
    { 
    customlayout = findViewById(R.id.customlayout); 
    customlayout.animcolor(); 
    } 
} 

src/org.customlayout.java

import org.customview; 
class customlayout 
{ 
    customview; 

    customlayout(context, attrs) 
    { 
    customview = new customview(); 
    addview(customview); // so it's onDraw() method will be called 
    } 

    onlayout(...) 
    { 
    customview.layout(...); 
    } 

    animcolor() 
    { 
    Timer timer = new Timer(); 
    int delay = ...; 
    int period = ...; 
    timer.schedule(new TimerTask(){ 
     run() { 
      setColor(randomint());) 
      customview.postInvalidate(); 
     } 
    }, delay, period); 

    } 

    setcolor(int) 
    { 
    .... 
    } 
} 
関連する問題