十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
前言
创新互联服务项目包括香格里拉网站建设、香格里拉网站制作、香格里拉网页制作以及香格里拉网络营销策划等。多年来,我们专注于互联网行业,利用自身积累的技术优势、行业经验、深度合作伙伴关系等,向广大中小型企业、政府机构等提供互联网行业的解决方案,香格里拉网站推广取得了明显的社会效益与经济效益。目前,我们服务的客户以成都为中心已经辐射到香格里拉省份的部分城市,未来相信会继续扩大服务区域并继续获得客户的支持与信任!笔者最近在做一款弹幕控件,里面涉及到绘制文本,以及文本边框。而绘制文本边框需要知道文本的左边位置,上边位置,以及文本的宽高。
通常来说,使用 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); }