Android Canvas的drawText()与文字居中方案详解

作者:biloba 时间:2021-10-20 00:33:32 

自定义View是绘制文本有三类方法


// 第一类
public void drawText (String text, float x, float y, Paint paint)
public void drawText (String text, int start, int end, float x, float y, Paint paint)
public void drawText (CharSequence text, int start, int end, float x, float y, Paint paint)
public void drawText (char[] text, int index, int count, float x, float y, Paint paint)

// 第二类
public void drawPosText (String text, float[] pos, Paint paint)
public void drawPosText (char[] text, int index, int count, float[] pos, Paint paint)

// 第三类
public void drawTextOnPath (String text, Path path, float hOffset, float vOffset, Paint paint)
public void drawTextOnPath (char[] text, int index, int count, Path path, float hOffset, float vOffset, Paint paint)

其中drawText()最常用,drawPosText ()是根据一个个坐标点指定文字位置,drawTextOnPath ()是根据路径绘制。但drawText()的x,y参数是干嘛的呢?

先来测试下


Paint paint=new Paint();
paint.setStyle(Paint.Style.FILL);
paint.setStrokeWidth(12);
paint.setTextSize(100);

String text="测试:my text";
canvas.drawText(text, 200, 400, paint);

//画两条线标记位置
paint.setStrokeWidth(4);
paint.setColor(Color.RED);
canvas.drawLine(0, 400, 2000, 400, paint);
paint.setColor(Color.BLUE);
canvas.drawLine(200, 0, 200, 2000, paint);

Android Canvas的drawText()与文字居中方案详解

左对齐-left

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

Android Canvas的drawText()与文字居中方案详解

居中对齐-center

Android Canvas的drawText()与文字居中方案详解

右对齐-right

(为了使文字完整,上面调整了下x,y的值)

从上面三种情况得出结论,x所对应的竖线:

  • 左对齐 — 文字的左边界

  • 居中对齐 — 文字的中心位置

  • 右对齐 — 文字的左边界

y对应的横线并不是文字的下边界,而是基准线Baseline

看下面这张图

Android Canvas的drawText()与文字居中方案详解

红色的Baseline是基准线,紫色的Top是文字的最顶部,也就是在drawText()中指定的x所对应,橙色的Bottom是文字的底部。

拿这些值如何获取呢?


Paint.FontMetrics fontMetrics=paint.getFontMetrics();
fontMetrics.top
fontMetrics.ascent
fontMetrics.descent
fontMetrics.bottom

记得要在设置完Paint的文字大小,宽度之类属性后再获取FontMetrics,
baseline对应对应值为0,在它下面的descent和bottom值为正,top和ascent为负。那文字的高度为bottom - top

Android Canvas的drawText()与文字居中方案详解

所以,实际绘制的时候取决于基线上一个点来绘制文字,而这个点有三种分别对应为left,center,right

Android Canvas的drawText()与文字居中方案详解

好啦,把drawText()中x,y参数讲清楚后实现文字居中就很容易了

直接上代码


//矩形背景
Paint bgRect=new Paint();
bgRect.setStyle(Paint.Style.FILL);
bgRect.setColor(Color.YELLOW);
RectF rectF=new RectF(200, 200, 800, 600);
canvas.drawRect(rectF, bgRect);

Paint textPaint=new Paint();
textPaint.setStyle(Paint.Style.FILL);
textPaint.setStrokeWidth(8);
textPaint.setTextSize(50);
textPaint.setTextAlign(Paint.Align.CENTER);

String text="测试:my text";
//计算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);

效果

Android Canvas的drawText()与文字居中方案详解

将对齐方式设置为center,那要让文字居中显示,x值就为矩形中心x值,y值也就是baseline的计算看下图

Android Canvas的drawText()与文字居中方案详解

y = 矩形中心y值 + 矩形中心与基线的距离


距离 = 文字高度的一半 - 基线到文字底部的距离(也就是bottom)
= (fontMetrics.bottom - fontMetrics.top)/2 - fontMetrics.bottom

来源:https://www.jianshu.com/p/8b97627b21c4

标签:android,canvas,drawtext()
0
投稿

猜你喜欢

  • Java多线程编程中使用Condition类操作锁的方法详解

    2023-10-19 13:30:55
  • c# 基于GMap.NET实现电子围栏功能(WPF版)

    2023-01-28 05:13:01
  • flyway实现java 自动升级SQL脚本的问题及解决方法

    2021-10-14 00:23:19
  • SpringBoot整合ES解析搜索返回字段问题

    2023-01-26 21:39:53
  • C# 数组删除元素的实现示例

    2022-03-02 08:55:04
  • C#中foreach语句深入研究

    2022-11-15 00:30:17
  • c语言switch反汇编的实现

    2023-06-29 03:38:17
  • spring异步service中处理线程数限制详解

    2021-09-02 23:20:12
  • Android实现手势滑动多点触摸放大缩小图片效果

    2022-02-13 09:26:28
  • c#打印预览控件中实现用鼠标移动页面功能代码分享

    2021-09-30 16:08:56
  • HashSet如何保证元素不重复(面试必问)

    2023-04-12 02:16:24
  • Android巧用XListView实现万能下拉刷新控件

    2023-07-25 00:33:03
  • emoji表情与unicode编码互转的实现(JS,JAVA,C#)

    2023-02-07 06:07:48
  • C#实现GZip压缩和解压缩入门实例

    2021-05-29 08:20:45
  • Java获取文件的类型和扩展名的实现方法

    2021-09-24 08:56:56
  • C#集合之并发集合的用法

    2023-12-24 09:30:21
  • Java如何有效避免SQL注入漏洞的方法总结

    2021-11-22 07:01:54
  • VsCode配置java环境的详细图文教程

    2022-03-29 00:56:32
  • Windows中使用C#为文件夹和文件编写密码锁的示例分享

    2023-09-27 06:27:23
  • spring依赖注入知识点分享

    2023-11-26 15:32:32
  • asp之家 软件编程 m.aspxhome.com