2012-03-21 16 views
0

ビットマップに基づいてメニューを作成しようとしています。メニュー自体は、screentouchの移動イベントを通して移動可能でなければなりません。基本的には、ビュー上でボタンをドラッグします。ボタンには衝突検出も含まれているため、タッチするたびに互いから跳ね返ります。Androidでキャンバスでビットマップを描画するときにちらつく

しかし、ビットマップの描画にはいくつか問題があります。現在、デバイスのウィンドウに合わせてビットマップのサイズを変更するために四角形を使用しています。私が欲しいと思っているのは、現時点では私のビットマップを滑らかに動かすことはできません。 glを開くために移動する唯一のオプションはありますか?それとも私のコードで何か大きなものを逃したことがありますか?

これは、各ボタンを描画するための私のサーフェスビューです。ここでMenuButtonはビットマップを保持し、タッチおよびドラッグの移動に従ってその位置を更新するクラスです。

protected void onDraw(Canvas canvas) { 
    canvas.drawColor(Color.WHITE); 

    for(MenuButton menuButton : menuButtonSprites) { 
     menuButton.onDraw(canvas); 
    } 
} 

私は、ビットマップは、各デバイスの幅に拡張したいと、そのために私がで収まるようにビットマップ用の四角形を使用しています。

public MenuButton(MenuView v, Bitmap bmp, int yPosition){ 
    this.menuView = v; 
    this.menuButton = bmp; 
    this.xMax = v.getWidth(); 
    this.yPosistion = yPosition; 
    menuButtonRectangle = new Rect(xMin, this.yPosistion-yMin, xMax, this.yPosistion+yMax); 
} 

public void update(int y){ 
    if(menuButtonPressed) 
    { 
     this.yPosistion = y; 
     menuButtonRectangle.set(xMin, yPosistion-yMin, xMax, yPosistion+yMax); 
    } 
} 

public void onDraw(Canvas canvas){ 
    canvas.drawBitmap(menuButton, null, menuButtonRectangle, null); 
} 

私も引き分けを更新したスレッドを持っています

public void run() { 
    long ticksPS = 1000/FPS; 
    long startTime; 
    long sleepTime; 
    Canvas c = null; 

    while (running) { 
     startTime = System.currentTimeMillis(); 
     try { 
      c = view.getHolder().lockCanvas(); 
      synchronized (view.getHolder()) { 
       view.onDraw(c); 
      } 
     } 
     finally { 
      if (c != null) { 
       view.getHolder().unlockCanvasAndPost(c); 
      } 
     } 

     sleepTime = ticksPS - (System.currentTimeMillis() - startTime); 
     try { 
      if (sleepTime > 0) 
       sleep(sleepTime); 
      else 
       sleep(10); 
     } 
     catch (Exception e) { 
     } 
    } 
} 

私は本当に私が間違ってやっているのか分かりませんなぜ私は自分のボタンの動きを滑らかにすることができないのか。キャンバスを使用することは欠点ですか、それとも本当に重要なことを忘れてしまったのですか?

答えて

0

通常この問題は、ペイント中に同期の問題が存在する場合に発生します。これは、フレームレートが高いために、またはフレームレートが低い場合もあります。このような問題は、ダブルバッファリングやフレームレートの調整によって解決できます。

ダブルバッファリングとは、イメージをメインキャンバスに直接描画するのではなく、画面サイズの空のビットマップを作成してグラフィックスオブジェクトを取得することです。すべてのものをビットマップに描画し、このビットマップをメインキャンバスに直接描画します。

+0

Thxでは、フレームレートを調整するテストが行​​われていますが、成功することはありません。私はダブルバッファリングを試み、あなたに戻ってきます! – Ghostcloud

+0

これは、キャンバスをロックして描画し、後でunlockCanvasAndPost(c)でキャンバスをアンロックすると、次のフレームを描画しているようです。 [ダブルバッファリング](http://stackoverflow.com/questions/6538423/double-buffering-in-java-on-android-with-canvas-and-surfaceview) – Ghostcloud

+0

Ohh Thats fine。情報をありがとう。この問題について再考する。 – Pavandroid

関連する問題