|
~ To be, or not to be, or to ask someone to be. ~ 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 に置き換えて、
色ごとの文字列に注目してください。 |
|