Canvas 文字对齐方式

672 阅读1分钟

Canvas 文字对齐方式

常用的画文字的方法

public void drawText (String text, float x, float y, Paint paint)

x,y 并不是指定文字的中点位置,并且x,y与文字对齐方式有关(通过setTextAlign()指定,默认为left)

测试


import android.graphics.Bitmap;

import android.graphics.Canvas;

import android.graphics.Color;

import android.graphics.Paint;

import android.graphics.Rect;

import android.graphics.RectF;

/**

* Created by talon on 2021/3/10

* note: 根据对象绘制图片

* 参考:https://www.jianshu.com/p/8b97627b21c4

*/

public class DrawBitmapManager4 {

private final String TAG = "DrawImageManager";

public static Bitmap createBitmap() {

// 创建一个画布

Bitmap bitmap = Bitmap.createBitmap(800, 1000, Bitmap.Config.ARGB_8888);

Canvas canvas = new Canvas(bitmap);

canvas.drawBitmap(bitmap, 0, 0, null);

// 给画布加个边框

Rect rect = new Rect(0, 0, canvas.getWidth(), canvas.getHeight());

Paint paint = new Paint();

paint.setColor(Color.BLACK);

paint.setStyle(Paint.Style.STROKE);

paint.setStrokeWidth(2);

canvas.drawRect(rect, paint);

// 开始测试数据

// todo 证明: setStrokeWidth这个方法,并不是往canvas内侧填充,而是往外侧增加一半,往内侧增加一半。

// testStrokeWidth(canvas);

// todo 证明:文字居中方案

setTextCenter(canvas); // 居中

setTextLeft(canvas); // 左对齐

setTextRight(canvas); // 右对齐

return bitmap;

}

private static void testStrokeWidth(Canvas canvas) {

// 划粗400px的线,只填充了200px

Paint paint = new Paint();

paint.setColor(Color.BLACK);

paint.setStyle(Paint.Style.STROKE);

paint.setStrokeWidth(400);

canvas.drawLine(0, 0, 0, canvas.getHeight(), paint);

// 划线

paint.setColor(Color.RED);

paint.setStrokeWidth(5);

canvas.drawLine(210, 0, 210, canvas.getHeight(), paint);

}

private static void setTextCenter(Canvas canvas) {

//矩形背景

Paint bgRect = new Paint();

bgRect.setStyle(Paint.Style.FILL);

bgRect.setColor(Color.TRANSPARENT);

RectF rectF = new RectF(0, 0, canvas.getWidth(), canvas.getHeight());

canvas.drawRect(rectF, bgRect);

Paint textPaint = new Paint();

textPaint.setStyle(Paint.Style.FILL);

textPaint.setTextSize(100);

textPaint.setTextAlign(Paint.Align.CENTER);

String text = "测Zz试";

//计算baseline ;

Paint.FontMetrics fontMetrics = textPaint.getFontMetrics();

float distance = (fontMetrics.bottom - fontMetrics.top) / 2 - fontMetrics.bottom;

float baseline = rectF.centerY() + distance;

canvas.drawText(text, rectF.centerX(), baseline, textPaint);

// 划线标记中间位置

textPaint.setColor(Color.RED);

textPaint.setStrokeWidth(5);

canvas.drawLine(0, canvas.getHeight() / 2, canvas.getWidth(), canvas.getHeight() / 2, textPaint);

}

private static void setTextLeft(Canvas canvas) {

//矩形背景

Paint bgRect = new Paint();

bgRect.setStyle(Paint.Style.FILL);

bgRect.setColor(Color.TRANSPARENT);

RectF rectF = new RectF(0, 0, canvas.getWidth(), canvas.getHeight());

canvas.drawRect(rectF, bgRect);

Paint textPaint = new Paint();

textPaint.setStyle(Paint.Style.FILL);

textPaint.setTextSize(100);

textPaint.setTextAlign(Paint.Align.LEFT);

String text = "测Zz试";

//计算baseline ;

Paint.FontMetrics fontMetrics = textPaint.getFontMetrics();

float distance = (fontMetrics.bottom - fontMetrics.top) / 2 - fontMetrics.bottom;

float baseline = rectF.centerY() + distance;

canvas.drawText(text, rectF.left, baseline, textPaint);

// 划线标记中间位置

textPaint.setColor(Color.RED);

textPaint.setStrokeWidth(5);

canvas.drawLine(0, canvas.getHeight() / 2, canvas.getWidth(), canvas.getHeight() / 2, textPaint);

}

private static void setTextRight(Canvas canvas) {

//矩形背景

Paint bgRect = new Paint();

bgRect.setStyle(Paint.Style.FILL);

bgRect.setColor(Color.TRANSPARENT);

RectF rectF = new RectF(0, 0, canvas.getWidth(), canvas.getHeight());

canvas.drawRect(rectF, bgRect);

Paint textPaint = new Paint();

textPaint.setStyle(Paint.Style.FILL);

textPaint.setTextSize(100);

textPaint.setTextAlign(Paint.Align.RIGHT);

String text = "测Zz试";

//计算baseline ;

Paint.FontMetrics fontMetrics = textPaint.getFontMetrics();

float distance = (fontMetrics.bottom - fontMetrics.top) / 2 - fontMetrics.bottom;

float baseline = rectF.centerY() + distance;

canvas.drawText(text, rectF.right, baseline, textPaint);

// 划线标记中间位置

textPaint.setColor(Color.RED);

textPaint.setStrokeWidth(5);

canvas.drawLine(0, canvas.getHeight() / 2, canvas.getWidth(), canvas.getHeight() / 2, textPaint);

}

}