Android精确测量文本宽高及基线位置的方法-创新互联

前言

创新互联服务项目包括香格里拉网站建设、香格里拉网站制作、香格里拉网页制作以及香格里拉网络营销策划等。多年来,我们专注于互联网行业,利用自身积累的技术优势、行业经验、深度合作伙伴关系等,向广大中小型企业、政府机构等提供互联网行业的解决方案,香格里拉网站推广取得了明显的社会效益与经济效益。目前,我们服务的客户以成都为中心已经辐射到香格里拉省份的部分城市,未来相信会继续扩大服务区域并继续获得客户的支持与信任!

笔者最近在做一款弹幕控件,里面涉及到绘制文本,以及文本边框。而绘制文本边框需要知道文本的左边位置,上边位置,以及文本的宽高。


通常来说,使用 Canvas 绘制文本,可以通过画笔 Paint 来设置文字的大小。但是画笔的大小与文字的宽高并无直接关系。
大家应该能说上几种测量文字宽高的方法,如:


方案1. 通过 Paint 的 measureText 方法,可以测量文字的宽度


方案2. 通过获取 Paint 的 FontMetrics, 根据 FontMetrics 的 leading, ascent, 和 descent可以获取文字的高度。


方案3. 通过 Paint 的 getTextBounds 获取文本的边界矩形 Rect,根据 Rect 可以计算出文字的宽高。


方案4. 通过 Paint 获取文字的 Path, 根据 Path 获取文本的边界矩形 Rect, 根据 Rect 可以计算出文字的宽高。


表面上看,我们有以上四种方案可以获取文字的宽或高。但是不幸的,这四种方案里,有些方法获取到的数值不是真实的文字宽高。


我们通过以下测试代码,分别测试字母 "e" 和 "j"。


private void measureText(String str) {
 if (str == null) {
  return;
 }
 float width2 = mPaint.measureText(str);
 Log.i("lxc", "width2 ---> " + width2);

 Paint.FontMetrics fontMetrics = mPaint.getFontMetrics();
 float height1 = Math.abs(fontMetrics.leading + fontMetrics.ascent) + fontMetrics.descent;
 Log.i("lxc", "height1 ---> " + height1);

 Rect rect = new Rect();
 mPaint.getTextBounds(str, 0, str.length(), rect);
 float width3 = rect.width();
 float height2 = rect.height();
 Log.i("lxc", "width3 ---> " + width3);
 Log.i("lxc", "height2 ---> " + height2);


 Path textPath = new Path();
 mPaint.getTextPath(str, 0, str.length(), 0.0f, 0.0f, textPath);
 RectF boundsPath = new RectF();
 textPath.computeBounds(boundsPath, true);
 float width4 = boundsPath.width();
 float height3 = boundsPath.height();
 Log.i("lxc", "width4 ---> " + width4);
 Log.i("lxc", "height3 ---> " + height3);
}

文章题目:Android精确测量文本宽高及基线位置的方法-创新互联
链接地址:http://myzitong.com/article/cesijo.html