2012-03-26 16 views
0

私は単にこれを動作させていません。 このネットワークは単純なコード修正記事ではないことがわかりました。 しかし、これは良いチュートリアルがありませんでしたので、これは他人の興味にあると思います。Androidキャンバスアップデートの問題

私はキャンバスを呼び出していますが、それはondraw()メソッドで描画できますが、ゲームループから抜け出そうとすると何も描画されません。私もエラーmessasgeを取得していない。

アプリケーション:

public class App extends Activity { 
    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     draw d = new draw(this); 

     requestWindowFeature(Window.FEATURE_NO_TITLE); 
     getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, 
           WindowManager.LayoutParams.FLAG_FULLSCREEN); 


     setContentView(d); 

    } 
    public void end() 
    { 
     App.this.finish(); 
    } 
} 

draw.java:だから

public class draw extends View { 
    Canvas ca; 
    View v; 
    Paint paint; 

    int width; 
    int height; 

    static final int MAX_GAME_SPEED=33; 
    static int fps; 
    boolean running=true; 



    int pw=0,ph=0; 





    public draw(Context context) { 
      super(context); 
     } 

      @Override 
     protected void onDraw(Canvas c){ 
     super.onDraw(c); 
     paint = new Paint(); //Paint paint = new Paint(); 
     paint.setStyle(Paint.Style.FILL); 


     //get screen size 
     WindowManager wm = (WindowManager) this.getContext().getSystemService(Context.WINDOW_SERVICE); 
     Display display = wm.getDefaultDisplay(); 


     width = display.getWidth(); // deprecated 
     height = display.getHeight(); // deprecated 







      // make the entire canvas white 
      paint.setColor(Color.WHITE); 
      c.drawPaint(paint); 


      ca = c; 
      paint.setColor(Color.BLACK); 
      c.drawRect(Math.round(width/3),Math.round(height/3),Math.round((width/3)*2),Math.round((height/3)*2), paint); //position width, position height,width,height 


      paint.setStyle(Paint.Style.FILL); 
      paint.setAntiAlias(true); 
      paint.setTextSize(30); 
      paint.setColor(Color.GREEN); 
      c.drawText(String.valueOf(width)+"x"+String.valueOf(height)+","+Math.round(width/3)+"x"+Math.round(height/3), 30, 200, paint); 
      paint.setColor(Color.GREEN); 
      c.drawText(String.valueOf(width)+"x"+String.valueOf(height)+","+Math.round(width/3)+"x"+Math.round(height/3), 30, 200, paint); 


      Thread myThread = new Thread(new UpdateThread()); 
      myThread.start(); 

    } 
      public void paint(Canvas c) 
      { 

       paint.setColor(Color.GREEN); 
       c.drawRect(20, 5, 50, 100, paint); 

       pw++; 
       ph++; 



       /*if (pw >= width || ph >= height) 
       { 
        pw=0; 
        ph=0; 
       } 
       */ 

      } 
      public Handler updateHandler = new Handler(){ 
       /** Gets called on every message that is received */ 
       // @Override 
       public void handleMessage(Message msg) { 

        paint(ca); 


        super.handleMessage(msg); 
       } 
      }; 



      public class UpdateThread implements Runnable { 

       @Override 
       public void run() { 
        while(true){ 
         draw.this.updateHandler.sendEmptyMessage(0); 

        } 
       } 

      } 

    } 

答えて

2

最初に: 更新メッセージを送信する頻度が高すぎます。私はそれをあなたのメッセージキューにオーバーロードしていると思う。

2番目: onDrawメソッドで保存されたキャンバスインスタンスを使用しています。私はこれが正しいとは思わない。 は代わりに、あなたは無効とあなたのビューを再描画ため、適切なキャンバスを使用してView.onDraw(キャンバス)メソッドを呼び出すためのメッセージを送信します

@Override 
public void run() { 
    while(true){ 
     draw.this.postInvalidate(); 
    } 
} 

これにあなたのUpdateThread.run()メソッドを変更することができます。また

: あなたのビューをレンダリングするために、できるだけ多くをしたい場合は、次のシーケンスを実装する必要があります:

static final int MSG_REDRAW = 1; 

Handler handler = new Handler() { 
    public void handleMessage(Message msg) { 
     switch (msg.what) { 
     case MSG_REDRAW: 
      // This method invoked on UI thread - ok. 
      draw.this.invalidate(); 
      sendEmptyMessage(MSG_REDRAW); 
      break; 

     default: 
      super.handleMessage(msg); 
      break; 
     } 
    } 
} 

、代わりにスケジューリングスレッド(UpdateThread)のあなただけの最初のMSG_REDRAWメッセージを送信する必要があります。

+0

ありがとうそれは私のために働いた – user1293780

0

、あなたはonDraw()を使用すると、描画を行うスレッドを作成しているで表示してありますか?どうして?あなたは、UIスレッド上のすべての描画を行い、他のスレッドにゲームの他の部分を渡す必要があります。

+0

私はこれをビルドしています。私はこれをJava Phone用に同じgmaeを作るのに使っていましたが、どのようにすればいいのですか? – user1293780

+0

あなたがゲームのようなことをしているなら、より良いスピードが可能になるので、実際にSurfaceViewを使用するべきです。ここでそれを行う方法に関するチュートリアルです:http://www.mybringback.com/tutorial-series/3281/android-the-basics-33-review-of-surfaceview-and-thread-setup/ – CaseyB

0

余分なスレッドは必要ありません。

onDrawで最後の文として無効にすると、onDrawが再びスケジュールされます。

0

私はpostInvalidateとthreadにいくつか問題がありました。 まず、setWillNotDraw(false); を追加しようとしましたが、画面の向きが変更されたときに問題が発生しました。この関数を呼び出すためにpostInvalidate()によって再描画するのに多くの時間がかかりました。なぜなら、onDrawが実際に呼び出されるときはわかりませんさあ。 私の解決策とこの外観についての質問はlinkです。