drawText实现文字居中绘制

方法参数解读

/**
 * Draw the text, with origin at (x,y), using the specified paint. The
 * origin is interpreted based on the Align setting in the paint.
 *
 * @param text  The text to be drawn
 * @param x     The x-coordinate of the origin of the text being drawn
 * @param y     The y-coordinate of the origin of the text being drawn
 * @param paint The paint used for the text (e.g. color, size, style)
 */
第二个参数:baseLine 的 x值
第三个参数:baseLine 的 y值
public void drawText(@NonNull String text, float x, float y, @NonNull Paint paint) {} 参数解读

方法一

首先自己动手做实验,自己定一个baseline,然后把文字画上去,再画上FontMetrics的几条线。FontMetrics里是字体图样的信息,有float型int型的版本,都可以从Paint中获取。它的每个成员数值都是以baseline为基准计算的,所以负值表示在baseline之上。

Rect targetRect = new Rect(0, 0, getMeasuredWidth(), getMeasuredHeight());  //文字在 targetRect 居中
Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
paint.setStrokeWidth(3);
paint.setTextSize(80);
String testString = "测试:ijkJQKA:1234";
paint.setColor(Color.BLACK);
canvas.drawRect(targetRect, paint);
paint.setColor(Color.RED);
Paint.FontMetricsInt fontMetrics = paint.getFontMetricsInt();
// 转载请注明出处:http://blog.csdn.net/hursing
//int baseline = targetRect.centerY() - (fontMetrics.bottom + fontMetrics.top) / 2;一样
int baseline = (targetRect.bottom + targetRect.top - fontMetrics.bottom - fontMetrics.top) / 2;
paint.setTextAlign(Paint.Align.CENTER); //注意,drawText 对应改为传入targetRect.centerX()
canvas.drawText(testString, targetRect.centerX(), baseline, paint);

核心代码:

*写法1
    paint.setTextAlign(Paint.Align.CENTER); //注意,drawText对应改为传入targetRect.centerX()
    canvas.drawText(testString, targetRect.centerX(), baseline, paint);
*写法2
    Rect mTextRect = new Rect();
    paint.getTextBounds(testString, 0, testString.length(), mTextRect);
    int x = targetRect.centerX() - mTextRect.centerX();
    canvas.drawText(testString, x, baseline, paint);

方法二

  1. init 中通过制定的 Paint 对象计算 mTextBound
mBackPaint.setStyle(Style.FILL);
mBackPaint.setTextScaleX(2f);
mBackPaint.setColor(Color.BLACK);   // 绘画字体的颜色
mBackPaint.setTextSize(30);
mBackPaint.getTextBounds(mText, 0, mText.length(), mTextBound);
  1. 在 onDraw 中
//控制好+-号, 计算width时: 计算height时:
canvas.drawText(mText, (getWidth() - mTextBound.width()) / 2
    ,(getHeight() + mTextBound.height()) / 2, mBackPaint);

参考资料

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 一、概述 1. 四线格与基线 小时候,我们在刚开始学习写字母时,用的本子是四线格的,我们必须把字母按照规则写在四线...
    addapp阅读 7,782评论 2 17
  • Android - Canvas 简单总结: http://www.cnblogs.com/hwgt/p/5416...
    zhangdong0921阅读 466评论 0 0
  • 婚姻对一个女生意味着什么? 一个人生最好的归宿,爱情的最完美的终站点 身边那一对 曾经的幸福的只有对方,令我惊叹爱...
    颜定阅读 220评论 0 0
  • 我是谁(二) 生命的旅程一直向前行驶,回眸过去,我们可以看到自己曾经轻舞飞扬,看到自己曾经热泪盈眶,看到自己曾经跌...
    许敏雅兰阅读 392评论 0 1
  • 感谢天,感谢地,感谢在玫瑰花开的季节下的那场玫瑰雨。 淅淅沥沥的小雨终于停了,我漫步走进公园看到樱桃花开了,粉红粉...
    敕勒川云海峰阅读 401评论 2 3