FC2ブログ
BS blog Ranking

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

アプリ開発 ブログランキングへ
にほんブログ村 IT技術ブログ Androidアプリ開発へ
にほんブログ村
BS blog Ranking

Bitmapを端末の画面サイズに合わせてリサイズするぜ!

今回よりガシガシ、コーディングを行っていきます。
まずは共通処理から。

Androidでは端末ごとに画面サイズと解像度が異なります。
そのため、画像の表示は一つのバイナリで対応させる必要があります。

画面レイアウトを定義するXMLファイルにdip指定でサイズを指定することもできますが、今回はプログラムで動的に画像の大きさを変更することにします。
ちなみにdipという単位は〝端末に依存しないピクセル〟です。具体的には160dpi(解像度)の1ピクセルの物理的な大きさを1dipと定義しています。つまり、320dpiのディスプレイを持つ端末では、1dip=2ピクセルという計算になります。

ではまず、端末のディスプレイ情報を格納しておくコンテナであるDTOを用意します。
ここではDisplayDtoとしました。定義する変数は以下となります。

/** density */
private float density;

/** densityDpi */
private int densityDpi;

/** scaledDensity 1pxに対する1dpの倍率 */
private float scaledDensity;

/** widthPixels 幅 */
private int widthPixels;

/** heightPixels 高さ */
private int heightPixels;

/** xdpi */
private float xdpi;

/** ydpi */
private float ydpi;

もちろんGetter/Setterの用意もお願いします。

次にUtilityクラスに端末のディスプレイ情報を取得するメソッドを用意します。

/**
* ディスプレイDTOを取得する
*
* @param displayMetrics
* @return displayDto ディスプレイDTO
*/

public static final DisplayDto getDisplayDto(DisplayMetrics displayMetrics) {

  DisplayDto displayDto = new DisplayDto();
  displayDto.setDensity(displayMetrics.density);
  displayDto.setDensityDpi(displayMetrics.densityDpi);
  displayDto.setScaledDensity(displayMetrics.scaledDensity);
  displayDto.setWidthPixels(displayMetrics.widthPixels);
  displayDto.setHeightPixels(displayMetrics.heightPixels);
  displayDto.setXdpi(displayMetrics.xdpi);
  displayDto.setYdpi(displayMetrics.ydpi);
  return displayDto;
}

最後にディスプレイ情報を格納したDTOを引数に持つ、動的に画像の大きさを変更するメソッドを用意します。
こちらもUtilityクラスです。

/**
* Bitmapを端末の画面サイズに合わせてリサイズする
*
* @param src 元画像
* @param displayDto
* @return dst リサイズした画像
*/

public static final Bitmap resizeBitmap(Bitmap src, DisplayDto displayDto) {

  // 画面サイズを取得
  float displayWidth = displayDto.getWidthPixels();
  float displayHeight = displayDto.getHeightPixels();

  // 拡大比率
  float widthScale = displayWidth / Const.DISPLAY_WIDTH;
  float heightScale = displayHeight / Const.DISPLAY_HEIGHT;
  // 比率をMatrixに設定
  Matrix matrix = new Matrix();
  matrix.postScale(widthScale, heightScale);

  int srcWidth = src.getWidth();   // 元画像の幅
  int srcHeight = src.getHeight();  // 元画像の高さ

  // リサイズ
  Bitmap dst = Bitmap.createBitmap(
      src, 0, 0, srcWidth, srcHeight, matrix, true);
  src = null;
  return dst;
}

DISPLAY_WIDTHとDISPLAY_HEIGHTですが、こちらはConstクラスに定義している定数となります。
画像はすべて480×854をベースとしますので、DISPLAY_WIDTH=480、DISPLAY_HEIGHT=854となります。

コメントに書いてある通りですが、処理の流れとしては、端末の画面サイズをベースとなる画面サイズで割り、拡大比率を出しています。そこから元画像のリサイズ処理をMatrixクラスを用いて行っています。
最終的に書き出されたBitmapであるdstを返し、元画像のBitmapであるsrcはメモリリーク防止のため、nullを代入しておきます。

以上で、元画像であるBitmapとディスプレイDTOを渡してやれば、リサイズされたBitmapが返ってくるメソッドの完成です!
スポンサーサイト

アプリ開発 ブログランキングへ
にほんブログ村 IT技術ブログ Androidアプリ開発へ
にほんブログ村

コメントの投稿

非公開コメント

プロフィール

samahiko

Author:samahiko
Androidアプリ開発の備忘録へようこそ!
開発環境→仕様→コーディング→ローンチという流れをリアルタイムで記録していきますので応援よろしくです!

最新記事
最新コメント
最新トラックバック
月別アーカイブ
カテゴリ
検索フォーム
RSSリンクの表示
リンク
ブロとも申請フォーム

この人とブロともになる

QRコード
QR
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。