この何日か、スプライトの制御コマンドを作っているよ。
で、その流れで、回転コマンドを作ってみることにした。
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 上でやってたんで、作り直しだよ…。(-_-;