androidでのカスタムビューの作り方は他のブログにいっぱい書いてあるので置いといて、文字をcanvasで書く方法やら。

基本的な使い方

Paint paint = new Paint();
		
//anti-Alias!
paint.setAntiAlias(true);
		
//テキストの色
paint.setColor(Color.parseColor("#777777"));
		
//テキストのサイズ
paint.setTextSize(11); 
		
//文字を書く!
canvas.drawText("書きたい文字", 0, 0, paint); 	
 
  Paintで文字の色やらサイズを指定して、onDraw内でcanvas使って書きます。Paintは、円や四角形を書くときなんかも使うので、個人的には解りづらいといえば解りづらい・・・。

canvas.drawText("書きたい文字", 0, 0, paint); 	
drawTextの引数
  • 第一引数は、書きたい文字
  • 第二引数は、x座標の位置
  • 第三引数は、y座標の位置
  • 第四引数は、設定したPaintを渡します 

この例では、xが0でyが0を指定しているので、Paintでalignを指定していないので(後述)左上が文字を書き始める開始位置となります。

ちなみにカスタムビュー内の一番下に書きたい場合は、
canvas.drawText("書きたい文字", 0, getMeasuredHeight(), paint); 	
getMeasuredHeight()でカスタムビューの高さを取ってやればいいのかと。まぁ、これだと、なんでかyとかgとかの文字の下側を考慮してくれないみたいなので、 getMeasuredHeight() - paint.descent()をした方が文字が全部表示されるみたい・・・。



文字の幅を取得する

個人的につまづいたのが、文字の幅の取り方。特定のxy座標が文字の真ん中になるように表示させたかったんですけど、そのためには文字の幅が必要となって、どーやって文字の幅を取るんだと・・・・。setTextSize(12)なんかでフォントのサイズを12にしたからといって、文字の幅は、12dpでは無いみたいです。なにかフォントの法則みたいなのがあって、みんなそのフォントの法則を使って文字列の幅なんかをだしているのかと、答え無きウェブサーチに時間を費やすこと小一時間。答えは、思わぬところにありました。

Paint paint = new Paint();
paint.setAntiAlias(true);
paint.setColor(Color.parseColor("#777777"));
paint.setTextSize(11); 


String str = "知りたい文字";
//文字数分の要素をもった配列を用意
float[] widths = new float[str.length()];
//幅の取得
paint.getTextWidths(str, widths);	
 getTextWidths()メソッドを呼び出すことで、引数に渡したwidthsの配列にそれぞれの文字列の幅を入れてくれるみたいです。文字列全体の幅を知りたい場合は、widthsをまわしてやればいいのかと。
Float total = 0F;
for(int i=0; i<widths.length;i++){
	total= total= + widths[i];
}


特定の場所の真ん中を基準に文字列を表示する

これで文字列の真ん中が計算できるじゃねーか!!!!ハゲ!!!とかうかれてたら、androidさんにはもっと素敵な機能が備わってました。文字書くのは、同じdrawTextメソッド。

canvas.drawText("書きたい文字", 0, 0, paint); 	
 なにも指定してない場合のxとyは、文字列の開始位置なんですけど、このxyを文字列の真ん中とする方法が用意されてたんです・・・。

ただ単純にpaintのTextAlign.CENTERを指定してやるだけっていう・・・。
paint.setTextAlign(Align.CENTER);
このpaintをdrawTextで渡してやればすべて解決。デフォルトは左端なんですけど、Centerを指定した場合のx,yは文字列の真ん中となるみたい。自動で計算してくれるっぽいっす。


drawTextAlign 
イメージとしてはたぶんこんな感じ。赤の点が開始位置というかdrawText()で指定するxとyの位置。