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_); } }
実際にアプリで使った画面を示します。

| 固定リンク