arcanum_jp’s blog

おっさんの日記

android カメラアプリ 中央にビットマップを半透明で描画する

とタイトルは描いたけど任意のビットマップを中央に縮小して半透明で描画する方法です。どのクラスのどのメソッドで以下を書けばいいかなんて書きません。僕のメモなんで。

400×400のビットマップがあったとする。別にbmpだろうがpngだろうがAndroid上ではBitmapなんでそこは察してください・・

Bitmap bmp = BitmapFactory.decodeResource(getResources(), ...); // ビットマップを読み込む

まず半透明、これはPaint#setAlpha(int)を使う。0(透明)〜255(不透明)の値を入れる。

Paint paint = new Paint();
p.setAlpha(30);

拡大縮小は簡単にするにはCanvas#drawBitmap(Bitmap, Rect, Rect, Paint)を使う。ここではビットマップは縦横同じ幅と仮定する。

まず、対象のビットマップがどんぐらいの大きさかを設定する。

Rect orgRect = new Rect(0, 0, bmp.getWidth(), bmp.getHeight());\

次に、画面に対するビットマップの大きさを計算する。たとえば描画先のCanvasの縦に対して50%に描画する場合こんな感じです。作るカメラアプリが横固定だと小さい幅が縦なんでこれでいいですが、縦横どっちも対応する場合は小さい幅に対してと考えてね。

int distWidthHeight = (int)((float)canvas.getHeight() * 0.5);

次に、ビットマップの描画場所を設定する。描画するCanvasに対する描画位置を計算します。先ほど描画するビットマップの大きさを画面に対する半分って計算したdistWidthHeightを使います。

int left = (canvas.getWidth() - distWidthHeight) / 2;
int top  = (canvas.getHeight() - distWidthHeight) / 2;

次に上記で計算した描画位置を使用して、どの位置を開始位置としてどの位置までの矩形範囲で描画するかオブジェクト化します。left, top座標に横幅、縦幅じゃなく、left, top座標に対し、どこまでの座標で描画するか!です。

Rect toRect = new Rect(left, top, left + distWidthHeight, top + distWidthHeight);

最後に描画します。

canvas.drawBitmap(_centerPoint, orgRect, toRect, paint);

イメージ的にはこんな感じ