Android Studio中如何用Java实现Canvas文本居中(不修改XML,适配任意尺寸)
实现思路
要让文本完全居中,不能直接使用Canvas宽高的1/2作为绘制坐标,因为drawText的默认坐标是文本的基线(baseline)位置,需要结合文本自身的尺寸做偏移计算,全程动态获取参数即可适配任意Canvas尺寸。
完整Java实现代码
自定义View核心逻辑
import android.content.Context; import android.graphics.Canvas; import android.graphics.Paint; import android.view.View; public class CenterTextCanvas extends View { // 可自行修改为需要展示的文本 private final String mDrawContent = "居中测试文本"; private final Paint mTextPaint; public CenterTextCanvas(Context context) { super(context); // 初始化画笔配置,可根据需求调整文字大小、颜色 mTextPaint = new Paint(Paint.ANTI_ALIAS_FLAG); mTextPaint.setTextSize(60f); mTextPaint.setColor(0xFF000000); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); // 动态获取Canvas宽高,适配任意尺寸 int canvasWidth = canvas.getWidth(); int canvasHeight = canvas.getHeight(); // 动态测量待绘制文本的实际宽度 float textWidth = mTextPaint.measureText(mDrawContent); // 获取文字度量参数,计算垂直偏移量 Paint.FontMetrics fontMetrics = mTextPaint.getFontMetrics(); float textTotalHeight = fontMetrics.descent - fontMetrics.ascent; // 计算居中坐标 // 水平居中:让文本的水平中心对齐Canvas中心 float centerX = (canvasWidth - textWidth) / 2; // 垂直居中:调整基线位置,让文本的垂直中心对齐Canvas中心 float centerY = canvasHeight / 2 + (textTotalHeight / 2 - fontMetrics.descent); // 绘制文本 canvas.drawText(mDrawContent, centerX, centerY, mTextPaint); } }
无XML调用方式
直接在Activity的onCreate方法中加载自定义View即可,完全不需要编写或修改XML布局:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // 直接将自定义View设为页面内容视图 setContentView(new CenterTextCanvas(this)); }
关键说明
- 所有尺寸动态计算,未写死任何像素值,当屏幕旋转、Canvas尺寸调整时,
onDraw会自动重算坐标,始终保持居中 - 画笔开启了抗锯齿,绘制的文本边缘更清晰
- 可自由修改构造方法中的文字大小、颜色、展示内容,不需要改动居中逻辑
内容的提问来源于stack exchange,提问作者redoc
相关产品推荐
相关产品推荐

