2011-11-09 20 views
0

ビットマップを正しく回転させるのに問題があります。私はそれに複数のビットマップを持つSurfaceViewを持っています。これらのビットマップは、arraylist内に存在し、forループを使用して、onDrawメソッド内のそれぞれに対してcanvas.drawBitmapを呼び出します。Androidで回転ビットマップを発行する

@Override 
protected void onDraw(Canvas canvas) { 
    super.onDraw(canvas); 
    canvas.drawColor(Color.BLACK); 

    for (int i = 0; i < jumper.size(); i++) { 
     canvas.drawBitmap(jumper.get(i).getGraphic(), jumper.get(i) 
       .getCoordinates().getX(), jumper.get(i).getCoordinates() 
       .getY(), null); 
    } 
} 

私は、ユーザーが特定のビットマップ(多くの1)を選択し、ユーザーは画面上で指をドラッグしている間、ビットマップが回転することを持っていしようとしています。ここに回転コードがあります。今のところ、画面中央付近の任意の位置にあるデフォルトのアンドロイドアイコン(72x72px)を使用しています。

private void rotateJumper(int direction) { 
    Matrix matrix = new Matrix(); 
    Bitmap source = jumper.get(selectedJumperPos).getGraphic(); 
    matrix.postRotate(direction, source.getWidth()/2, 
      source.getHeight()/2); 
    int x = 0; 
    int y = 0; 
    int width = 72; 
    int height = 72; 
    Bitmap tempBitmap = Bitmap.createBitmap(source, x, y, width, height,  
      matrix, true); 
    jumper.get(selectedJumperPos).setGraphic(tempBitmap); 
} 

整数の方向は、指のドラッグの方向によって+1または-1のいずれかです。したがって、MotionEvent.ACTION_MOVEイベントごとにイメージが1度回転するはずです。ここで

問題となっている。

  1. 画像は画像中心の周りを回転しません。 CW回転は、左下隅を中心にしています。 CCWの回転は、右上隅を中心にしています。
  2. 中心を中心に回転していないため、画像は初期範囲外に回転し、最終的には消えます。
  3. 画像が回転するとぼやけます。

私に教えていただけたら助かります。

ありがとうございます!

答えて

0

むしろ新しいビットマップを作成するよりもキャンバスに既存のビットマップを描画するために行列を使用します。

@Override 
protected void onDraw(Canvas canvas) { 
    super.onDraw(canvas); 
    canvas.drawColor(Color.BLACK); 

    for (int i = 0; i < jumper.size(); i++) { 
     canvas.drawBitmap(jumper.get(i).getGraphic(), jumper.get(i).getMatrix(), null); 
    } 
} 

private void rotateJumper(int direction) { 
    Matrix matrix = jumper.get(selectedJumperPos).getMatrix(); 
    if(matrix == null) { 
     matrix = new Matrix(); 
     matrix.setTranslate(jumper.get(...).getCoord...().getX(), jumper.get(..).getCoord...().getY()); 
     jumper.get(selectedJumperPos).setMatrix(matrix); 
    } 
    Bitmap source = jumper.get(selectedJumperPos).getGraphic(); 
    matrix.postRotate(direction, source.getWidth()/2, 
      source.getHeight()/2); 

} 
+0

これは機能しました。かなり大きな再設計をしましたが、うまくいきました。ありがとう! – phoenixfire53

+0

@ FunKTheMonk、あなたのコードを説明してください。 – Manikandan

+0

回転が発生するたびに新しいビットマップを作成するのではなく、マトリックスは保持され、レンダリング中に使用されます。 rotateJumperでは、必要な場合にのみ行列を初期化し、それをビットマップの中心の周りに回転させます。ビットマップを描画するときには、onDrawメソッドのマトリックスを使用します。マトリックスには、キャンバスに描画する場所(翻訳)、描く大きさ(回転)、回転などのデータが含まれます。 – FunkTheMonk

0

私はむしろオフフリックな答えですが、あなたのためにあなたのために私の注意を引いた。それを「より読みやすい」形式で書くことが可能かもしれません。

for (YourJumperItem item : jumper) { 
    canvas.drawBitmap(
     item.getGraphic(), item.getCoordinates().getX(), 
     item.getCoordinates().getY(), null); 
} 

ここで、YourJumperItemは、ジャンパー配列に含まれるクラスの種類です。残念ながら、ビットマップを回転させることについてはあまり言えませんが、この便利な方法で-loopsを書くだけです。

+0

感謝。私はJavaにとってとても新しいので、知っておいてほしい。 – phoenixfire53

関連する問題