问题一:在自定义控件绘制文字的时候怎么确定文字的宽度(不是view的宽度),或者其中几个字符的宽度?
下面有两个方法,可以测量指定几个字符的宽度。

    /*** @param text  测量的String* @return      返回测量宽度结果*/public float measureText(String text) {}/*** @param text  要测量的字符串* @param start 起始测量索引* @param end 要测量字符结束索引* @return 返回测量宽度*/public float measureText(CharSequence text, int start, int end) 

了解canvas.drawtext方法是要先指定基准线的位置,不然绘制会出现字体不显示的问题。如下图所示:

最后按照这个位置问题,下了下面的代码:

  public MyTestTextView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);//初始化画五线谱paintlinePaint = new Paint();linePaint.setStyle(Paint.Style.STROKE);linePaint.setColor(Color.RED);linePaint.setStrokeWidth(3.0f);//初始化写字的PainttextPaint = new Paint();textPaint.setColor(Color.BLACK);textPaint.setTextSize(300);//设置文字的旋转角度,官方推荐-0.25//textPaint.setTextSkewX(-0.25f);}@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);/*** 开始绘制文字* @param text  要被画的字体* @param x     x坐标,开始绘制* @param y     y坐标,注意是baseline的y值* @param paint The paint used for the text (e.g. color, size, style)*/float ybase = 600.0f;canvas.drawText("ab思g", 100.0f, ybase, textPaint);//测量字体的高度Paint.FontMetrics fontMetrics = textPaint.getFontMetrics();float top = fontMetrics.top;float ascent = fontMetrics.ascent;float descent = fontMetrics.descent;float leading = fontMetrics.leading;//baseline参考基线float bottom = fontMetrics.bottom;//开始绘制残凹陷,//绘制baselinePath basePath = generatePath(50, 600);basePath.lineTo(1020, 600);canvas.drawPath(basePath, generatePaint(Color.RED));//bottomPath bottomPath = generatePath(50, ybase + bottom);bottomPath.lineTo(1020, ybase + bottom);canvas.drawPath(bottomPath, linePaint);//绘制descentPath descentPath = generatePath(50, ybase + descent);descentPath.lineTo(1020, ybase + descent);canvas.drawPath(descentPath, generatePaint(Color.BLUE));//绘制ascentfloat asentY = ybase + ascent;System.out.println("test 数值 asentY=" + asentY);Path asentPath = generatePath(50, asentY);asentPath.lineTo(1020, asentY);canvas.drawPath(asentPath, generatePaint(Color.DKGRAY));//绘制topPath topPath = generatePath(50, ybase + top);topPath.lineTo(1020, ybase + top);canvas.drawPath(topPath, generatePaint(Color.GREEN));//绘制middlefloat middleY = ybase-((bottom - top) / 2-bottom);Path middlePath = generatePath(0, middleY);middlePath.lineTo(1080,middleY);canvas.drawPath(middlePath,generatePaint(Color.RED));}private Paint generatePaint(int color) {Paint paint = new Paint();paint.setStyle(Paint.Style.STROKE);paint.setColor(color);paint.setStrokeWidth(3.0f);return paint;}private Path generatePath(float moveX, float moveY) {Path path = new Path();path.moveTo(moveX, moveY);return path;}

最终的结果图如下,有些差别。

总结:1.实践出真知
2.top是负数,bottom’是正数,这说明都是相对于baseline而言,baseline是和leading相等的。
float top = fontMetrics.top;
float ascent = fontMetrics.ascent;
float descent = fontMetrics.descent;
float leading = fontMetrics.leading;//baseline参考基线
float bottom = fontMetrics.bottom;

关于Paint了解text绘制时的基线位置关系/测量字符的宽度相关推荐

  1. android字体图形绘制,android paint api drawText 绘制字体字形

    android paint 的里面有很多属性设置的方法,我们来了解一下: Paint paint = new Paint(); // 设置字体颜色 paint.setColor(Color.RED); ...

  2. mapbox-gl-draw改造,支持绘制时实时显示面积

    在Mapbox的开发过程中,需要使用mapbox-gl-draw来进行多边形的绘制.编辑与状态控制,用起来还是非常方便的.最近有需求,需要再绘制时实时显示绘制的面积,这个确实比较麻烦,因为绘制都是这个 ...

  3. HTML画正方形钟表,html5 canvas绘制时钟表时间

    特效描述:html5 canvas绘制 时钟表时间.用canvas精灵绘制器绘制的时钟 代码结构 1. 引入JS 2. HTML代码 var Sprite=function(name,painter, ...

  4. R语言使用compareGroups包绘制分组患者基线信息表实战:基于survival包lung数据集

    R语言使用compareGroups包绘制分组患者基线信息表实战:基于survival包lung数据集 目录 R语言使

  5. Easyui validatebox修改——1.当text发生变化时在校验,2.取消校验,3扩展自定义验证

    1.当text发生变化时在校验: Easyui validatebox个人感觉还是比较好用的,但是发现他不是只有text改变并离开编辑框的时候才验证,而是不停的做验证:如果是js脚本的本地验证还好,如 ...

  6. 在Paint事件中绘制控件(边框)

    在Paint事件中绘制控件(边框) 单纯的自己记录,将来会继续添加,侥幸被大家发现了的话请不要太鄙视... private void panel4_Paint(object sender, Paint ...

  7. 【Unity3D修改Text创建时的默认字体】

    Unity3D修改Text创建时的默认字体 首先定位Text创建时的字体加载逻辑 我使用的是Unity2019.3.2+win10系统 定位到Text的脚本在 Unity\Editor\Data\Re ...

  8. android 涂鸦 卡顿,涂鸦框架的优化——解决绘制时的卡顿问题,纵享丝滑

    前言 V5.5: 增加优化绘制的选项,可优化绘制速度和性能,纵享丝滑. boolean optimizeDrawing = true; // 是否优化绘制,建议开启,可优化绘制速度和性能. Doodl ...

  9. Graphics.MeasureString用指定的字体绘制时测量指定的字符串

    Graphics的MeasureString方法,只要指定了字体和字符串后,用这个方法就能获得一个矩形的区域,这个区域是Graphics对象用DrawString方法在空间表面绘制字符串时所要的区域. ...

最新文章

  1. python【数据结构与算法】分治算法之大整数乘法
  2. java回顾之继承 二
  3. 第一篇随笔,通常都是内容空洞的。
  4. XenApp增加输出画面的帧率,提高类视频应用体验
  5. 基于.NET Framework 4.0的解决方案部署
  6. 太赞了:《Spring Framework 4.x 参考文档》最新中文版开放下载!
  7. java堆栈类在哪个包里_Java堆栈Stack类的使用
  8. 理解K8S的编排和网络
  9. 反向索引(Inverted Index)
  10. vue.js之过渡效果-css
  11. 埃森哲:AI成新生产要素,2035年将中国经济增速提高1.6% | 附下载
  12. go语言--正则表达式过滤数据--通过文件获取数据
  13. 静态NAT、动态NAT、PAT(端口多路复用)的配置
  14. 什么是运行时Runtime、运行时库Runtime Library、运行时环境Runtime environment
  15. 理解Android中的MeasureSpec
  16. “甲骨文”的传奇故事
  17. 周末作业-循环练习题(1)
  18. x264源码解析:码率控制之能量函数
  19. 雷电html代码,基于HTML5的游戏制作(雷电飞机设计游戏)
  20. 音视频之AudioTrack的使用

热门文章

  1. 计算机音乐谱大全有点甜,《有点甜》原创歌曲简谱,汪苏泷作词 汪苏泷作曲 汪苏泷演唱 BY2演唱 - 歌曲简谱 - 声乐谱 - 词曲网...
  2. 思科防火墙5510打开端口_输入验证问题打开了思科防火墙漏洞
  3. Mad Libs游戏
  4. autoit3转换php,AutoIt3处理字符串和数组
  5. 基于深度学习特征的植物病虫害检测
  6. POI 图表中加入文本框
  7. Power Pivot中“父行汇总百分比”的度量值写法
  8. Unity打包exe后美术资源变粉以及黑屏
  9. 金字塔原理-基本概念
  10. 手把手带你清理电脑版微信冗余资源