Bitmap の回転

 この何日か、スプライトの制御コマンドを作っているよ。
 で、その流れで、回転コマンドを作ってみることにした。

 Android での画像の回転は、Bitmap にかけるものらしい。
 BitmapDrawable には、回転に相当するものが見当たらない。
 これにはちょっと面食らっちゃったよ。
 スプライトは半透明を使うことを想定して、BitmapDrawable を描画するようにしてたから。

 仕方ないので、回転角を変更するたびに、Bitmap からBitmapDrawable を生成しなおすことにしてみたよ。
 処理落ちが気になるところだけど、やってみないことにはわからないね。

Matrix

 Bitmap の回転には、Matrix クラスを使う。
「Matrix に回転設定をして、Bitmap に適用する」みたいな感じ。
 Matrix クラスは回転の他にも、サイズ変更なんかもあって、色々と多彩なことができるみたい。

 で。回転は、postRotate method を使って、角度を設定する。
 ↓こんなテストmethod を作ってみた。

	protected Bitmap bitmap = null;
	protected pos_X = 0;
	protected pos_Y = 0;
	protected width = 0;
	protected height = 0;
	protected BitmapDrawable img = null;
	//--

	protected float roll = 0.0f;
	protected void rotate(){
		Matrix matrix = new Matrix();
		roll += 5.0f;
		matrix.postRotate( roll );  // 角度設定
		
		Bitmap _bitmap = Bitmap.createBitmap( bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true);
		img = new BitmapDrawable( _bitmap );	// Drawable変換
		
		int w = _bitmap.getWidth();
		int h = _bitmap.getHeight();
		
		pos_X = pos_X +( ( width - w ) /2 );
		pos_Y = pos_Y +( ( height - h ) /2 );
		
		width = w;
		height = h;	
	}
	//--

 このmethod は、実行するたびに、bitmapを5度ずつ右回転させて、BitmapDrawable を作り出している。
 bitmap とimg は、別method であらかじめ読み込んでいて、表示位置やサイズ等もその時に設定している。
 実描画も別method で行っている。
 ちなみに、実描画でBitmap を描画するなら、BitmapDrawable にする必要はないね。

 実行すると、こんな感じ。

 実行速度は、まぁ、こんなモンかな…って感じ。
 エミュレータ上なのでハッキリいえないけど、サイズを考慮すると遅いのは仕方ないやね。

by the way…

 18行目からの処理は、表示位置と幅の更新。

 位置更新をしないと、Bitmap のセンターで回転されず、宇宙遊泳してるみたいになってしまう。
 ソレはソレでおもしろかったけどね。(^_^;

 幅の更新は、描画をDrawable で行っているため。
 更新しないと、↓な感じに変形してしまう。(^_^;

 なぜDrawable で描画しているのかというと、半透明表示を行いたいから。
 いまわかっている時点では、半透明表示には、Drawable を使うしかないみたいなんだ。
 Bitmap のpaint にalpha マスクをかければいいような気もするけど…まだ試してない。
 拡縮もDrawable 上でやってたんで、作り直しだよ…。(-_-;

Comments are closed.