ウィジェットで独自フォントを頑張って使う方法

ネットの情報をかき集めてAndroidプログラミングしています、ぐるぽです。

ウィジェットで常駐する時計アプリを制作していました。
そこで、通常のフォントではなく独自のフォントを使おうとしていたのですが、ウィジェットを調べていくと普通の方法では使えない事が判明…
(ウィジェットのアイテムのフォント指定部分には最初から用意されている3つのフォントしか選べない)

どうにかフォント利用できないかと調べていたら、

1.フォントをCanvasに描画
2.画像として保存
3・ウィジェットで画像表示

という方法を見つけました。

私の制作したアプリでは、設定画面(PreferenceActivity)でサイズと色を変更>設定画面終了時に画像生成 としました。

キモである設定画面のコード(必要な部分以外はカットしています)

/**
 * 設定画面
 * @author ぐるぽ
 */
public class SettingMenuActivity extends PreferenceActivity {

	@Override
	protected void onDestroy() {
		super.onDestroy();

		// 指定された設定で画像を生成してローカルフォルダに保存
		for (int i = 0; i < TokikakeClockWidgetProvider.IMG_NAMES.length; i++) {
			Bitmap bmp = createCharacterBitmap(
					TokikakeClockWidgetProvider.IMG_NAMES[i], size);
			saveBitmapToPng(String.valueOf(i), bmp);
		}
	}

	/**
	 * 指定された文字・フォントサイズで画像を生成する
	 * @param chara 文字
	 * @param size フォントサイズ
	 * @return Bitmap形式の画像
	 */
	private Bitmap createCharacterBitmap(char chara, int size) {
		// フォントを指定
		Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
		paint.setTypeface(Typeface.createFromAsset(getAssets(), "timeleap100.ttf"));
		paint.setTextSize(size);

		// フォントサイズに合った大きさの画像を生成する
		FontMetrics fm = paint.getFontMetrics();
		int height = (int) (fm.bottom - fm.top);

		float[] widths = new float[1];
		paint.getTextWidths(String.valueOf(chara), widths);
		int width = (int) widths[0];

		Bitmap bmp = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_4444);
		Canvas canvas = new Canvas(bmp);
		canvas.drawColor(Color.argb(0, 0, 0, 0));

		canvas.drawText(String.valueOf(chara), 0.0f, -fm.ascent, paint);

		return bmp;
	}

	/**
	 * BitmapをローカルフォルダにPNG形式で保存する
	 * @param fileName ファイル名
	 * @param bmp Bitmap形式の画像
	 */
	private void saveBitmapToPng(String fileName, Bitmap bmp) {
		try {
			OutputStream out = openFileOutput(fileName + ".png",MODE_PRIVATE);
			bmp.compress(CompressFormat.PNG, 100, out);
			out.flush();
			out.close();
			Log.i("list", fileName + ".png" + " create success!");
		} catch (IOException e) {
			e.printStackTrace();
			Log.i("list", fileName + ".png" + " can't create");
		}
	}
}

・PreferenceActivityのonDestroy()
設定画面を閉じた時に画像を生成したいので、PreferenceActivityのonDestroy()内で画像生成処理を呼び出します。

・createCharacterBitmap()
ここで独自フォントの画像をBitmap形式で生成しています。
(フォントを関数内で指定していますが、引数に与える形の方がいいですね…)
独自フォントはAssetsフォルダに置いています。

・saveBitmapToPng()
生成した画像をpng形式でアプリのローカルフォルダに保存します。
ローカルフォルダの読み込み・保存は簡単なので便利^^

ローカルフォルダ読込:InputStream is = context.openFileInput(“ファイル名”);
ローカルフォルダ保存:OutputStream out = context.openFileOutput(“ファイル名”,モード);

以上です。
Assetsフォルダとローカルフォルダを利用すれば、結構なんでもいけそうですね。

3 Responses

Leave a Reply