スポンサーサイト
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
新しい記事を書く事で広告が消せます。
Androidアプリ開発(描画編)
おはようございます。ふぃぶです。
Bitmap描画における移動、回転、画像切り出しの話。
AndroidでBitmap描画を行う際、CanvasのdrawBitmapを使うんですが
今回やりたいのは画像ファイルを任意の位置から切り出し、回転を加えて描画するってこと。
で、うまい方法はないかと詰まりました。
①画像切り出し表示の場合
Canvas.drawBitmap( bmp, src,dst,paint) ;
srcの部分に切り出しする位置とサイズ情報を持ったRectオブジェクトを渡すことで可能。
②回転をかけて表示する場合
Canvas.drawBitmap( bmp, matrix, paint);
matrixの部分に回転角情報を持たせたMatrixオブジェクトを渡すことで可能。
で、こいつの機能両方をもったものが欲しいんだがどうにもなさそうなので困ってます。
回転をかける際どうしても ②のメソッドを使用してしまうが、
このメソッド画像の切り出し情報を持たせる場所がないのです。
Translate(画面表示位置情報)はできるんだけど・・・。
一応考えた実装方法としては、
①テクスチャから画像を切り出し新たにBitmapを生成する
②Matrixに回転角と移動値情報を設定
③上記①で生成したテクスチャと②のMatrix情報を使用して表示。
以下コーディング例
----------------------------------------------------------
//描画するメソッド (私が勝手につくった)
public void doDraw(Canvas canvas){
//①テクスチャから画像を切り出し新たにBitmapを生成する
// mTextureには既に読み込んであるBitmapデータがあるよ
// 今回は画像上の(10,10)の位置から(20,20)の大きさで切り出します。
Bitmap tex = Bitmap.createBitmap(mTexture,10,10,20,20);
//②画像描画情報の設定
//Matrixに設定されいる情報を初期化します
mMatrix.reset();
//回転角を設定します.
// mAngleには回転角が数値で入ってるよ(1~360)
// tex.getWidth() / 2で画像の中央を指定。
// tex.getHeight() / 2で画像の中央を指定。
// 画像の中央を中心にmAngleの角度で回転させます
mMatrix.setRotate(mAngle,tex.getWidth()/2,tex.getHeight()/2);
//mPosXは画面上の表示位置が設定されてるよ
//mPosYは画面上の表示位置が設定されてるよ
mMatrix.postTranslate(mPosX, mPosY);
//①で生成した切り出し済み画像情報(tex)を
//②で設定したMatrix情報を使用して表示します。
canvas.drawBitmap( tex , mMatrix,null );
}
一応これで実現可能なんですけど、問題が。
そう、毎回newしてるので絶対重いよね!
1フレームにつき1回はnewが発生します。
しかもオブジェクトの数だけ発生します。
fps60だと考えたら秒間60*オブジェクト数回だけnewが発生する!
絶対重いでしょこれ・・・・
もっとうまい方法ないのかしら。
Bitmap描画における移動、回転、画像切り出しの話。
AndroidでBitmap描画を行う際、CanvasのdrawBitmapを使うんですが
今回やりたいのは画像ファイルを任意の位置から切り出し、回転を加えて描画するってこと。
で、うまい方法はないかと詰まりました。
①画像切り出し表示の場合
Canvas.drawBitmap( bmp, src,dst,paint) ;
srcの部分に切り出しする位置とサイズ情報を持ったRectオブジェクトを渡すことで可能。
②回転をかけて表示する場合
Canvas.drawBitmap( bmp, matrix, paint);
matrixの部分に回転角情報を持たせたMatrixオブジェクトを渡すことで可能。
で、こいつの機能両方をもったものが欲しいんだがどうにもなさそうなので困ってます。
回転をかける際どうしても ②のメソッドを使用してしまうが、
このメソッド画像の切り出し情報を持たせる場所がないのです。
Translate(画面表示位置情報)はできるんだけど・・・。
一応考えた実装方法としては、
①テクスチャから画像を切り出し新たにBitmapを生成する
②Matrixに回転角と移動値情報を設定
③上記①で生成したテクスチャと②のMatrix情報を使用して表示。
以下コーディング例
----------------------------------------------------------
//描画するメソッド (私が勝手につくった)
public void doDraw(Canvas canvas){
//①テクスチャから画像を切り出し新たにBitmapを生成する
// mTextureには既に読み込んであるBitmapデータがあるよ
// 今回は画像上の(10,10)の位置から(20,20)の大きさで切り出します。
Bitmap tex = Bitmap.createBitmap(mTexture,10,10,20,20);
//②画像描画情報の設定
//Matrixに設定されいる情報を初期化します
mMatrix.reset();
//回転角を設定します.
// mAngleには回転角が数値で入ってるよ(1~360)
// tex.getWidth() / 2で画像の中央を指定。
// tex.getHeight() / 2で画像の中央を指定。
// 画像の中央を中心にmAngleの角度で回転させます
mMatrix.setRotate(mAngle,tex.getWidth()/2,tex.getHeight()/2);
//mPosXは画面上の表示位置が設定されてるよ
//mPosYは画面上の表示位置が設定されてるよ
mMatrix.postTranslate(mPosX, mPosY);
//①で生成した切り出し済み画像情報(tex)を
//②で設定したMatrix情報を使用して表示します。
canvas.drawBitmap( tex , mMatrix,null );
}
一応これで実現可能なんですけど、問題が。
そう、毎回newしてるので絶対重いよね!
1フレームにつき1回はnewが発生します。
しかもオブジェクトの数だけ発生します。
fps60だと考えたら秒間60*オブジェクト数回だけnewが発生する!
絶対重いでしょこれ・・・・
もっとうまい方法ないのかしら。
コメント
コメントの投稿