2010年6月25日金曜日

[Android]文字列描画

Viewへの文字列の描画は下のような書き方で出来ました。

private class SampleView extends View {

Private Paint mPaint;

public SampleView(Context context) {
super(context);
mPaint = new Paint();
}

@Override
protected void onDraw(Canvas canvas) {

FontMetrics fm = null;
// 背景は白
canvas.drawColor(Color.WHITE);
// アンチエイリアス有り
mPaint.setAntiAlias(true);
// 描画色は黒
mPaint.setColor(Color.BLACK);

// フォントサイズの指定
mPaint.setTextSize(64);
fm = mPaint.getFontMetrics();
// 文字列リソースから取得する場合
canvas.drawText(getResources().getString(R.string.test), 100, 80, mPaint);
// 直接記述する場合
canvas.drawText("Abcdefg", 100, 160, mPaint);
// 座標位置(Y軸)はフォントのベースラインの値になるので
// 実際の描画位置は少し上になる。
// 座標位値(Y軸)をフォントの上限(Ascent)に合わせたい時は
// 下のように書く。
canvas.drawText("hijkLMN", 100, 240 + fm.ascent, mPaint);
}

FontMetricsのメンバ変数 ascent はフォントのベースラインから上限までの値(負の値)が入っているので、Y座標 + FontMetrics.ascentがフォントの上の部分の座標値になります。
文字列の幅はどうやって取ればいいのだろうと思っていたら、mPaint.getTextWidths(String str, float[] float)なるメソッドが。
これだ!と思ったら戻り値のintに入ったのは文字数・・・。
どうやら2番目の引数の中に各文字の幅が1文字ずつ入るメソッドのようなので、

String str = "Abcdefg";
float[] fl = new float[length];
int width = 0;

mPaint.getTextWidths(str, fl);
for(int i=0; i<length-1; i++) {
width += fl[i];
}

としました。
かっこ悪い気がするけど、他にどうやったら取れるかしら。
mPaintは上のコードのPaintクラスの変数です。

0 件のコメント:

コメントを投稿