Canvas drawText文字垂直居中方案

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Canvas drawText文字垂直居中方案相关的知识,希望对你有一定的参考价值。

参考技术A 最近绘制自定义view时,用到画笔绘制文本,针对drawText的绘制做一些总结。

Canvas.drawText的方法定义如下:

其中,x坐标比较好理解,是文本起始绘制位置的x坐标。但是y是指文本绘制的baseline的y坐标。

要理解上图中的绘制效果,让我们再认识下FontMetrics类,该类是Paint的内部类。

在设置好字体尺寸后,通过Paint.getFontMetricsInt()方法来获得一个FontMetrics对象。FontMetrics定义了几个绘制时要用到的关键坐标位置,各位置含义和图示如下。注意,这四个字段的值是相对于baseline的相对值。

即已知Top值,则baseline = top - fontMetrics.top.

1、已知a段(bottom和baseline之间距离)高度:a = fontMetrics.bottom
2、计算b段(bottom和中线的距离)高度:b = (fontMetrics.bottom - fontMetrics.top)/2
3、计算c段(baseline和中线的距离)高度:c=b-a
4、计算baseline = centerY + c = centerY + b -a = centerY - (fontMetrics.bottom + fontMetrics.top) /2

实际计算时,也可以用decent和asent,即baseline = centerY - (fontMetrics.ascent + fontMetrics.descent) /2

原理和场景2一致,此时centerY=(rect.bottom+rect.top)/2。
最终baseLine = (rect.bottom+rect.top)/2 - (fontMetrics.top + fontMetrics.bottom) /2

参考文档:
android 图解Canvas drawText文字居中的那些事
drawText方法的baseline计算
Android Canvas drawText实现中文垂直居中

多行文字或者单行文字的垂直居中解决方案

做项目的时候经常会遇到多行文字的垂直居中,如果是单行文字直接:height:40px;line-height:40px;就可以了。如果是多行文字,用这个方法,只能看见第一行文字,基于这种情况,找到了一中比较好的方法。

<!doctype Html>
<Html>
	<Head>
		<Meta Charset="Utf-8">
		<Title>文字垂直居中</Title>
		<Style>
			Div{
				Width:160px;
				Height:60px;
				Background:#e4393c;
				Display:table;
			}
			Div Span{
				Display: Table-cell;
				Vertical-align: Middle;
				Overflow: Hidden;
				Text-align: Center;
			}
		</Style>
	</Head>
	<Body>
		<Div><Span>文字垂直居中文字垂直居中文字垂直居中</Span></Div>
		<Br><Br><Br><Br>
		<Div><Span>文字垂直居中文</Span></Div>
	</Body>
</Html>

  样式如下:

 

这样就可以做到垂直居中,这个是最基本的样式,如果有需要可以进行进一步的修饰。

 

以上是关于Canvas drawText文字垂直居中方案的主要内容,如果未能解决你的问题,请参考以下文章

android canvas drawText()文字居中

android canvas drawText()文字居中

Android绘制文字时垂直居中

Android Canvas drawText实现中文垂直居中

Android Canvas drawText实现中文垂直居中

Android drawText 做到文字绝对居中