~ To be, or not to be, or to take a lunch anyway. ~ null-i.net |
AndroidJava/文章を縦書き、横書きする | |
Canvasに文字列を縦書きする(2023-07-09) 縦書きは、やってやれないことはない、けど、わりと大変かもしれません。 static void drawTateText(Canvas canvas, String text){ Paint paint = new Paint(); float size = canvas.getWidth()/20f; // 画面に20行くらい入る大きさ paint.setTextSize(size); float start_x = canvas.getWidth()-size*5f; // 開始位置 x 座標(てきとう) float start_y = size*5f; // 開始位置 y 座標(おなじく) float x = start_x; float y = start_y; for(int i=1; i<=text.length(); i++){ String c = text.substring(i-1, i); // 1文字ずつ取り出す float w = paint.measureText(c); // 文字の横幅 switch(c){ // 文字ごとに処理を変える必要がある // 詳細については後述 case "\n": // 改行の場合 x -= size; // 左に行送りして、 y = start_y; // 先頭に戻す。 continue; } canvas.drawText(c, x - w/2f, y, paint); // 横軸を中央ぞろえ y += size; // 縦位置を次の文字位置へ移動 } }
public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //setContentView(R.layout.activity_main); // 使わない MyView view = new MyView(this); setContentView(view); } static class MyView extends View { public MyView(Context context){ super(context); } protected void onDraw(Canvas canvas){ canvas.drawColor(Color.WHITE); // 背景色は白にする drawTateText(canvas, "古池や\n岩に染み入る\n蝉の声"); // ここ } } その結果は以下、 ポイントとして、一文字ごとの縦幅は一定です。
そして、文字の横幅は可変です。 drawTateText(canvas, "「すたーと」\n(Start)\nlong sample!"); これを出力した結果は以下。 記号がそのままでは使えないのはひと目で分かりますが、
まず、英語から縦書き。†英語にせよ記号にせよ前述の例、
こんなふうに文字の種類ごとに移動する量を微調整すれば、 つぎに、記号†結論から言えば、右に90度回転させて、 static void draw4lines(Canvas canvas){ // 合計4本、線を引きます Paint[] paint = new Paint[4]; for(int i=0; i<paint.length; i++){ paint[i] = new Paint(); paint[i].setTextSize(canvas.getWidth()/20f); paint[i].setStrokeWidth(canvas.getWidth()/200f); } Path[] path = new Path[4]; for(int i=0; i<path.length; i++){ path[i] = new Path(); } float MAX = 1000; // 適当な数字 // 黒い線を左上から右上まで引く paint[0].setColor(Color.BLACK); path[0].moveTo(200, 100); path[0].lineTo(MAX-100, 100); // 赤い線を、右上から右下まで引く paint[1].setColor(Color.RED); path[1].moveTo(MAX-100, 200); path[1].lineTo(MAX-100, MAX-100); // 緑の線を、右下から左下まで引く paint[2].setColor(Color.GREEN); path[2].moveTo(MAX-200, MAX-100); path[2].lineTo(100, MAX-100); // 青の線を、左下から左上まで引く paint[3].setColor(Color.BLUE); path[3].moveTo(100, MAX-200); path[3].lineTo(100, 100); for(int i=0; i<path.length; i++){ // 線を引く paint[i].setStyle(Paint.Style.STROKE); canvas.drawPath(path[i], paint[i]); // その線の上に、文字を重ねる paint[i].setStyle(Paint.Style.FILL); canvas.drawTextOnPath(i + ".文字列onPath", path[i], 0, 0, paint[i]); } } さきほどの drawTateText と 今回の draw4lines に置き換えて、 色ごとの文字列に注目してください。 |
|