私は1日以上この問題の解決策を探していましたが、何の助けもありません。ここの答えも。ドキュメンテーションも何も説明しません。
別のオブジェクトの方向に回転を取得しようとしています。問題は、ビットマップが固定点を中心に回転するのではなく、ビットマップ(0,0)を中心に回転することです。
ここに私が問題を抱えているコードがあります:
Matrix mtx = new Matrix();
mtx.reset();
mtx.preTranslate(-centerX, -centerY);
mtx.setRotate((float)direction, -centerX, -centerY);
mtx.postTranslate(pivotX, pivotY);
Bitmap rotatedBMP = Bitmap.createBitmap(bitmap, 0, 0, spriteWidth, spriteHeight, mtx, true);
this.bitmap = rotatedBMP;
奇妙な部分は、pre
/postTranslate()
内の値とsetRotation()
内のfloat引数をどのように変更してもかまいません。誰かが助けてくれて正しい方向に押してくれますか? :)
次のコードシーケンスが役立つことを願っています。
Bitmap targetBitmap = Bitmap.createBitmap(targetWidth, targetHeight, config);
Canvas canvas = new Canvas(targetBitmap);
Matrix matrix = new Matrix();
matrix.setRotate(mRotation,source.getWidth()/2,source.getHeight()/2);
canvas.drawBitmap(source, matrix, new Paint());
~frameworks\base\graphics\Java\Android\graphics\Bitmap.Java
から次のメソッドをチェックする場合
public static Bitmap createBitmap(Bitmap source, int x, int y, int width, int height,
Matrix m, boolean filter)
これは、回転と平行移動で何をするかを説明します。
編集済み:最適化されたコード。
public static Bitmap RotateBitmap(Bitmap source, float angle)
{
Matrix matrix = new Matrix();
matrix.postRotate(angle);
return Bitmap.createBitmap(source, 0, 0, source.getWidth(), source.getHeight(), matrix, true);
}
リソースからビットマップを取得するには:
Bitmap source = BitmapFactory.decodeResource(this.getResources(), R.drawable.your_img);
ゲームを仕上げているので、この問題に戻りました。自分に合ったものを投稿したいと思いました。
これは、マトリックスを回転させる方法です。
this.matrix.reset();
this.matrix.setTranslate(this.floatXpos, this.floatYpos);
this.matrix.postRotate((float)this.direction, this.getCenterX(), this.getCenterY());
(this.getCenterX()
は基本的にビットマップのX位置+ビットマップの幅/ 2です)
そして、ビットマップを描画するためのメソッド(RenderManager
クラスを介して呼び出されます):
canvas.drawBitmap(this.bitmap, this.matrix, null);
だから、それは簡単なことですが、setRotate
に続いてpostTranslate
で動作させることができなかったのは少し奇妙です。なぜこれが機能しないのか知っている人もいるかもしれません。これで、すべてのビットマップが適切に回転しますが、ビットマップの品質が多少低下するわけではありません:/
とにかく、あなたの助けに感謝します!
ImageView
を使用してRotateAnimation
を回転させることもできます。
RotateAnimation rotateAnimation = new RotateAnimation(from, to,
Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF,
0.5f);
rotateAnimation.setInterpolator(new LinearInterpolator());
rotateAnimation.setDuration(ANIMATION_DURATION);
rotateAnimation.setFillAfter(true);
imageView.startAnimation(rotateAnimation);
次のようなものを使用できます。
Matrix matrix = new Matrix();
matrix.setRotate(mRotation,source.getWidth()/2,source.getHeight()/2);
RectF rectF = new RectF(0, 0, source.getWidth(), source.getHeight());
matrix.mapRect(rectF);
Bitmap targetBitmap = Bitmap.createBitmap(rectF.width(), rectF.height(), config);
Canvas canvas = new Canvas(targetBitmap);
canvas.drawBitmap(source, matrix, new Paint());
GoogleのLunar Landerというサンプルを見てください。そこにある船の画像は動的に回転しています。
私はこの構成を使用しましたが、まだピクセル化の問題があります:
Bitmap bmpOriginal = BitmapFactory.decodeResource(this.getResources(), R.drawable.map_pin);
Bitmap targetBitmap = Bitmap.createBitmap((bmpOriginal.getWidth()),
(bmpOriginal.getHeight()),
Bitmap.Config.ARGB_8888);
Paint p = new Paint();
p.setAntiAlias(true);
Matrix matrix = new Matrix();
matrix.setRotate((float) lock.getDirection(),(float) (bmpOriginal.getWidth()/2),
(float)(bmpOriginal.getHeight()/2));
RectF rectF = new RectF(0, 0, bmpOriginal.getWidth(), bmpOriginal.getHeight());
matrix.mapRect(rectF);
targetBitmap = Bitmap.createBitmap((int)rectF.width(), (int)rectF.height(), Bitmap.Config.ARGB_8888);
Canvas tempCanvas = new Canvas(targetBitmap);
tempCanvas.drawBitmap(bmpOriginal, matrix, p);
matrix.reset();
matrix.setTranslate( anchor.x, anchor.y );
matrix.postRotate((float) rotation , 0,0);
matrix.postTranslate(positionOfAnchor.x, positionOfAnchor.x);
c.drawBitmap(bitmap, matrix, null);