Android Canvas的drawText()与文字居中方案详解
自定义View是绘制文本有三类方法
//第一类 publicvoiddrawText(Stringtext,floatx,floaty,Paintpaint) publicvoiddrawText(Stringtext,intstart,intend,floatx,floaty,Paintpaint) publicvoiddrawText(CharSequencetext,intstart,intend,floatx,floaty,Paintpaint) publicvoiddrawText(char[]text,intindex,intcount,floatx,floaty,Paintpaint) //第二类 publicvoiddrawPosText(Stringtext,float[]pos,Paintpaint) publicvoiddrawPosText(char[]text,intindex,intcount,float[]pos,Paintpaint) //第三类 publicvoiddrawTextOnPath(Stringtext,Pathpath,floathOffset,floatvOffset,Paintpaint) publicvoiddrawTextOnPath(char[]text,intindex,intcount,Pathpath,floathOffset,floatvOffset,Paintpaint)
其中drawText()最常用,drawPosText()是根据一个个坐标点指定文字位置,drawTextOnPath()是根据路径绘制。但drawText()的x,y参数是干嘛的呢?
先来测试下
Paintpaint=newPaint(); paint.setStyle(Paint.Style.FILL); paint.setStrokeWidth(12); paint.setTextSize(100); Stringtext="测试:mytext"; 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);
可以看到,x,y并不是指定文字的中点位置,并且x,y与文字对齐方式有关(通过setTextAlign()指定,默认为left)
(为了使文字完整,上面调整了下x,y的值)
从上面三种情况得出结论,x所对应的竖线:
- 左对齐—文字的左边界
- 居中对齐—文字的中心位置
- 右对齐—文字的左边界
y对应的横线并不是文字的下边界,而是基准线Baseline
看下面这张图
红色的Baseline是基准线,紫色的Top是文字的最顶部,也就是在drawText()中指定的x所对应,橙色的Bottom是文字的底部。
拿这些值如何获取呢?
Paint.FontMetricsfontMetrics=paint.getFontMetrics(); fontMetrics.top fontMetrics.ascent fontMetrics.descent fontMetrics.bottom
记得要在设置完Paint的文字大小,宽度之类属性后再获取FontMetrics,
baseline对应对应值为0,在它下面的descent和bottom值为正,top和ascent为负。那文字的高度为bottom-top
所以,实际绘制的时候取决于基线上一个点来绘制文字,而这个点有三种分别对应为left,center,right
好啦,把drawText()中x,y参数讲清楚后实现文字居中就很容易了
直接上代码
//矩形背景 PaintbgRect=newPaint(); bgRect.setStyle(Paint.Style.FILL); bgRect.setColor(Color.YELLOW); RectFrectF=newRectF(200,200,800,600); canvas.drawRect(rectF,bgRect); PainttextPaint=newPaint(); textPaint.setStyle(Paint.Style.FILL); textPaint.setStrokeWidth(8); textPaint.setTextSize(50); textPaint.setTextAlign(Paint.Align.CENTER); Stringtext="测试:mytext"; //计算baseline Paint.FontMetricsfontMetrics=textPaint.getFontMetrics(); floatdistance=(fontMetrics.bottom-fontMetrics.top)/2-fontMetrics.bottom; floatbaseline=rectF.centerY()+distance; canvas.drawText(text,rectF.centerX(),baseline,textPaint);
效果
将对齐方式设置为center,那要让文字居中显示,x值就为矩形中心x值,y值也就是baseline的计算看下图
y=矩形中心y值+矩形中心与基线的距离
距离=文字高度的一半-基线到文字底部的距离(也就是bottom) =(fontMetrics.bottom-fontMetrics.top)/2-fontMetrics.bottom
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对毛票票的支持。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。