« 備忘録:macパブリックフォルダどこ? | トップページ | ◆聴覚における音の方位の重要性(につながる雑談) »

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_);
      }
   }

実際にアプリで使った画面を示します。

|

« 備忘録:macパブリックフォルダどこ? | トップページ | ◆聴覚における音の方位の重要性(につながる雑談) »

トラックバック


この記事へのトラックバック一覧です: AndroidのCanvas文字列センタリング:

« 備忘録:macパブリックフォルダどこ? | トップページ | ◆聴覚における音の方位の重要性(につながる雑談) »