画文字是canvas.drawText(String text, float x, float y, Paint paint) 温馨提示参数y是文字的基线BaseLine.看下图

上面的top,ascent等,可以通过下面方法求出.
Paint.FontMetricsInt fontMetricsInt = mPaint.getFontMetricsInt();
fontMetricsInt.top;
fontMetricsInt.ascent;
fontMetricsInt.descent;
fontMetricsInt.bottom;
上面是所有值都是以基线BaseLine为基准计算的.在BaseLine上面的为负值.在BaseLine下面的为正值.
指定左上角的顶点坐标,绘制文本
公式: float baseLineY = Y - top
下面告诉你这公式是如果求得的.

@Override
protected void onDraw(Canvas canvas) {
Paint.FontMetricsInt fontMetricsInt = mPaint.getFontMetricsInt();
int y = 100;
mPaint.setColor(Color.GREEN);
canvas.drawLine(0,y,2000,y,mPaint);
//指定左上顶点坐标,绘制文本
int baseLine = y - fontMetricsInt.top;
mPaint.setColor(Color.RED);
canvas.drawText(mMyText, 0, baseLine, mPaint);
}

指定中间位置,绘制文本
公式: BaseLineY = centerY +(bottom - top)/2 - bottom
推导过程如下:

效果:
@Override
protected void onDraw(Canvas canvas) {
Paint.FontMetricsInt fontMetricsInt = mPaint.getFontMetricsInt();
int y = 100;
mPaint.setColor(Color.GREEN);
canvas.drawLine(0, y, 2000, y, mPaint);
//指定中间位置,绘制文本
int baseLine = y + (fontMetricsInt.bottom - fontMetricsInt.top) / 2 - fontMetricsInt.bottom;
mPaint.setColor(Color.BLUE);
canvas.drawText(mMyText, 0, baseLine, mPaint);
}

网友评论