本文跟大家分享下我关于drawText()文字居中的方法。
先附上drawText()的方法说明
说实话当时看了这个,我也没明白这个x,y坐标到底表达的啥意思,还一直以为是绘制文字中心的坐标,后来发现这个理解是错误的
要想理解这个首先看张图
像图上这样安卓的文字绘制是相对于基线绘制的,也就是图中的红线,而top+bottom的长度就等于字体高度.即等于|top|+|bottom|绝对值
实际绘制的时候取决于基线上一个点来绘制文字,而这个点有三种分别对应为left,center,right如下图
而drawText()方法中x,y坐标所指的点就是上图基线上三个点中的一个,具体是哪一个根据paint的setTextAlign()方法设置,默认为left
示例代码如下
Rect rect = new Rect(100,100,500,500);//画一个矩形 Paint rectPaint = new Paint(); rectPaint.setColor(Color.BLUE); rectPaint.setStyle(Paint.Style.FILL); canvas.drawRect(rect, rectPaint); Paint textPaint = new Paint(); textPaint.setColor(Color.WHITE); textPaint.setTextSize(50); textPaint.setStyle(Paint.Style.FILL); //该方法即为设置基线上那个点究竟是left,center,还是right 这里我设置为center textPaint.setTextAlign(Paint.Align.CENTER); Paint.FontMetrics fontMetrics = textPaint.getFontMetrics(); float top = fontMetrics.top;//为基线到字体上边框的距离,即上图中的top float bottom = fontMetrics.bottom;//为基线到字体下边框的距离,即上图中的bottom int baseLineY = (int) (rect.centerY() - top/2 - bottom/2);//基线中间点的y轴计算公式 canvas.drawText("你好世界",rect.centerX(),baseLineY,textPaint);
这里有点要注意textPaint.getFontMetrics()这个方法一定要在设置字体大小或者样式等等一系列会影响字体的方法后在调用,不然获取到的top和bottom值不准.
效果如下
正好是在中间的,即证明等式是没有问题的,再来分析这个等式是如何计算的
之所以drawText()方法中x,y指的是基线中间的那个点,是因为setTextAlign(Paint.Align.Center)
那么要想在正中间显示文字,x只要为矩形的中点x坐标即可 x = rect.centerX()
要计算的就是基线中间图上红色点的y坐标了,看图可以发现红色点的y为矩形中点黑色点的y坐标+图中黑色点和红色点之间的距离
矩形y坐标为 rect.centerY()
黑色点和红色点之间的距离为相对于基线的(top+bottom)/2 - bottom
而 top是相对于基线的所以为负数,所以公式为 (-top+bottom)/2 - bottom简化下为-top/2 - bottom/2
所以最后计算为rect.centerY - top/2 - bottom/2.
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持小牛知识库。
问题内容: 我有一个div 。其内容水平和垂直居中。 当div中的内容太长时,内容将自动换行。但是在这种情况下,对齐方式会中断。请参阅摘要。 如果我添加正确显示。但是,为什么没有中心呢? 问题答案: flex容器的HTML结构具有三个级别: 容器 该项目 内容 每个级别代表一个独立的独立元素。 该属性是在flex容器上设置的,用于控制flex项目。它不能直接控制项目的子项(在这种情况下为文本)。
问题内容: 我想知道xhtml 1.0中有哪些严格选项可以在像这样的文本两边都创建一行: 我曾想过要做一些花哨的事情,例如: 或者,因为上述方法在对齐方面存在问题(垂直和水平对齐): 这也有对齐问题,我可以用这个烂摊子解决: 除了对齐问题之外,这两个选项都让人感到“前途未卜”,如果您碰巧曾经见过这一点并且知道一种优雅的解决方案,我将非常感激。 问题答案: 我不知道这是否已经解决,但是flexbox
本文向大家介绍bootstrap模态框垂直居中效果,包括了bootstrap模态框垂直居中效果的使用技巧和注意事项,需要的朋友参考一下 本文实例效果其实就是一个点击弹窗效果,供大家参考,具体内容如下 先上jquery代码 html代码 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持呐喊教程。
问题内容: 该属性是使用CSS居中图像的好方法吗? 问题答案: 这将无效,因为该属性适用于块容器,而不适用于内联元素,而是内联元素。请参阅W3C规范。 使用此代替:
我知道这个问题已经问过,但我看到的解决方案对我不起作用。我有下面的代码,但正如你所看到的,文本不在圆圈的中间 null null
可以对文字执行各种操作以更改其外观 例如,可以使文字变形、将文字转换为形状或向文字添加投影。创建文字效果的最简单的方法之一是在文字图层上播放 Photoshop 附带的默认的“文本效果”动作。可以通过从“动作”面板菜单选取“文本效果”访问这些效果。 沿路径或在路径内创建文字 您可以输入沿着用钢笔或形状工具创建的工作路径的边缘排列的文字。当您沿着路径输入文字时,文字将沿着锚点被添加到路径的方向排列。