2014年5月28日水曜日

【アプリ開発】アイコンに多言語のテキスト追加

アイコン等の画像を用意するとき、テキスト付きのアイコンを用意する場合があると思います。

以前にも【アプリ開発】画像への描画について書きましたが、今回はボタン用のアイコンに
多言語のテキストを描画してわざわざ多言語用のアイコンを用意せずにアプリで利用しようという
方法になります(^^)

自分もよくテキスト付きのアイコンを使っていたのですが、
日本語以外の言語に対応する場合、他の言語用のアイコンを用意する必要が出てしまい、
とても面倒でした(´・ω・`)

なので、テキストなしのアイコンのみ用意して、
プログラム内で画像にテキストを描画したものをBitmapとして使う方法がとても便利でしたので、
紹介していきます♪




用意するアイコン

最近データフォルダで追加したアイコンになりますが、
データフォルダで複数選択時、画面下に表示するテキスト無しのアイコンになります。


データフォルダでの複数選択時

 


アイコンにテキストを描画してBitmapとして使用しています。
最初に用意したテキスト無しのアイコンだけで他言語用のアイコンを作成できるため、
個別に各言語用のアイコンを用意する必要がありません。




描画処理

以下の関数に読み込んだアイコンのBitmapと書き込みたいテキストを渡して、
テキストの色とサイズを指定すれば、画像の下部にテキストを追加できます。


 /*************************************
  * 画像の下部に文字列を書き込み
  *
  * @param csBmp  テキストを描画する画像
  * @param strText  画像に描画する文字列
  * @param nTextColor 描画する文字列の色
  * @param nTextSize    描画する文字列のサイズ
  * @return none
  **************************************/
 public static Bitmap DrawUnderTextOnBitmap(Bitmap csBmp, String strText, int nTextColor, int nTextSize)
 {
  Bitmap csTempBmp = csBmp.copy(csBmp.getConfig(), true);
  Canvas csHisCanvas = new Canvas(csTempBmp);
  Paint sTextPaint = new Paint();
  sTextPaint.setColor(nTextColor);
  sTextPaint.setTextSize(nTextSize);
  int nW = 10;
  int nH = csBmp.getHeight()-nTextSize-5;
  csHisCanvas.drawText(strText, nW, nH, sTextPaint);

  return csTempBmp;
 }

テキストの描画位置は画面下部で固定していますが、そのあたりは変更してアレンジ可能かと思いますので、
ご活用ください。

また、画像をコピーして使用しているため、メモリを画像1つ分余計に消費します。
引数として渡された画像がimmutable(不変)な場合、Canvasに直接渡すとエラーとなります。
画像がmutableな場合には問題ないのですが、ここではmutableな画像をコピーして作成して、
その画像にテキストを追加するようにしています。


API Level 11(3.0) 以上であれば、引数で渡すBitmapを

BitmapFactory.Options options = new  BitmapFactory.Options();
options.inMutable = true;
Bitmap csBmp = BitmapFactory.decodeResource(getResources(), R.drawable.z9, options);


上記のようにオプションで指定してmutableな画像として生成すれば余計なメモリ消費はおされられます。
(データフォルダではAPI Level 8で使用しているため、これは未使用です^^;)

色々と活用できるシーンがあるかと思いますので、
他のアプリでも活用した場合には紹介していきます(^O^)

0 件のコメント:

コメントを投稿