AndroidのCanvas文字列センタリング
Android Canvas のdrawTextでの位置指定
drawText()にはセンタリングなどの位置指定機能はありません。
利用者がフォントのサイズ、文字列幅から位置を自力で計算する必要があります。
文字列幅
文字列幅(ドット数)はPaint#measureText()に表示したい文字列を与えることによって得られます。
Paint paint=new Paint();
paint.setTextSize(12);
float width= paint.measureText("表示したい文字列");
文字高
文字の高さはpaint#getFontMetrics()で得られるFontMetrics構造体に入っています。 位置は基準位置を0として、上が負、下が正の値となります。単位はドット数です。
Paint paint=new Paint(); paint.setTextSize(162); Paint.FontMetrics fontMetrics = paint_.getFontMetrics(); // fontMetrics.top 文字空間の上限 負 // fontMetrics.ascent 文字の上限 負 // fontMetrics.leading 文字の基準位置 0 // fontMetrics.descent 文字の下限 正 // fontMetrics.bottom 文字空間の下限 正
各位置に線を引くと次のようになります。
参考までにこの表示を行ったプログラムを載せます。
位置決め(センタリングなど)を行う例
例えば、CanvasとPaintが設定されている状態で
U.drawText("文字列",x位置,y位置,canvas,paint
,U.Anchor.CENTER_BASE // 単純センタリング
);
といった形で文字列位置を指定できるようにします。
位置は次のような形で指定します。
プログラムを示します。
package ************************;
import android.graphics.Canvas;
import android.graphics.Paint;
public class U{
public enum Anchor {
// 横位置 縦位置
LEFT_TOP, // 左 上
LEFT_CENTER, // 左 中央
LEFT_BOTTOM, // 左 下
LEFT_BASE, // 左 標準
CENTER_TOP, // 中央 上
CENTER_CENTER,// 中央 中央
CENTER_BOTTOM,// 中央 下
CENTER_BASE, // 中央 標準
RIGHT_TOP, // 右 上
RIGHT_CENTER, // 右 中央
RIGHT_BOTTOM, // 右 下
RIGHT_BASE // 道 標準
};
public final static void drawText(
String text_
,float x_
,float y_
,Canvas canvas_
,Paint paint_
,Anchor anchor_
){
float _width= paint_.measureText(text_);
Paint.FontMetrics _fontMetrics = paint_.getFontMetrics();
switch(anchor_){// 横
case CENTER_TOP: // 中央
case CENTER_CENTER:
case CENTER_BOTTOM:
case CENTER_BASE:
x_-= _width/2;
break;
case RIGHT_TOP: // 右
case RIGHT_CENTER:
case RIGHT_BOTTOM:
case RIGHT_BASE:
x_-= _width;
break;
}
switch(anchor_){// 縦
case LEFT_TOP: // 上
case CENTER_TOP:
case RIGHT_TOP:
y_ -= _fontMetrics.ascent;
break;
case LEFT_CENTER: // 中央
case CENTER_CENTER:
case RIGHT_CENTER:
y_ -= (_fontMetrics.ascent+_fontMetrics.descent) / 2;
break;
case LEFT_BOTTOM: // 底
case CENTER_BOTTOM:
case RIGHT_BOTTOM:
y_ -=_fontMetrics.descent;
break;
}
canvas_.drawText(text_,x_,y_,paint_);
}
}
実際にアプリで使った画面を示します。
| 固定リンク

