`

如何“任性”使用Android的drawText()

 
阅读更多

Android的canvas上可以画很多基本形状,诸如:圆,矩形,线条等等,其中当属文字即drawText()较难理解和使用(额,这只是就个人感受),下面将慢慢介绍下如何简单使用drawText()。

FontMetrics

FontMetrics是Paint的一个内部类,主要定义了Paint绘图时的一些关键坐标位置,具体如下图(1)所示:

图(1):
Base

其中:

ascent:该距离是从所绘字符的baseline之上至该字符所绘制的最高点。这个距离是系统推荐。
descent:该距离是从所绘字符的baseline之下至该字符所绘制的最低点。这个距离是系统推荐的。
top:该距离是从所绘字符的baseline之上至可绘制区域的最高点。
bottom:该距离是从所绘字符的baseline之下至可绘制区域的最低点。
leading:为文本的线之间添加额外的空间,这是官方文档直译,debug时发现一般都为0.0,该值也是系统推荐的。
特别注意: ascenttop都是负值,而descentbottom:都是正值。

drawText()参数

理解好一个函数所需参数的具体含义,是用好一个函数的关键。canvas.drawText(String text, float x, float y, Paint paint)中有四个参数,这四个参数都是表示其相对于所在View中的坐标,和屏幕坐标无关。其中text和paint较容易理解,下面重点介绍x和y的具体含义。

float x:根据官方API上的解释,该参数表示text被画的起始x坐标。其实text被画的起始位置还与Paint有关,Paint的TextAlign属性决定了text相对于起始坐标x的相对位置。例如,TextAlign的默认属性为Paint.Align.LEFT,这是text就是从起始坐标x的右侧开始画起。

图(2):
Left
图(3):
Center

float y: 根据官方API上的解释,该参数表示text被画的起始y坐标。这个解释是比较抽象的,其实起始y坐标所代表是text的baseline在Y轴方向的位置。

drawText()居中显示

推导前提:Paint的TextAlign属性值为Paint.Align.LEFT,即为默认属性。

然后根据上面的参数介绍,drawText()的水平起始坐标x很容易确定。

float x = getWidht() >> 1 - paint.measureText(String text) >> 1

比较棘手的是drawText()的垂直起始坐标y,即baseline到底怎么确定。其实我们可以由上图(1)中各基准线间的相对位置关系推算出来。

假设我们所求的baseline的值为baseY;

text的bottom距离:
①bottomY = baseY + fontMetrics.bottom;
text的字体高度:
②fontHeight = fontMetrics.descent- fontMetrics.ascent
因为我们要让text垂直居中,所以此时text的bottom距离应该为:
③bottomY=1/2 * height + 1/2 * fontHeight

所以由上述①②③公式就可以推得:④baseY = 1/2 * height + 1/2 * (fontMetrics.descent- fontMetrics.ascent) - fontmetrics.bottom
此时求得baseline的值,即cavans.drawText()里的y的坐标。

推论:任意位置
其实由上述公式④可知,在paint的size属性不变情况下,只有height是变量,所以控制好height的值就可以把drawText()画在View的任意的位置,公式就大家自己推导下把,我就不累述了。

作者:XycZero
查看原文:http://www.xyczero.com/blog/article/20/.

分享到:
评论

相关推荐

    Android DrawText字符串的绘制

    在 Android 平台上,DrawText 字符串的绘制是通过使用 Canvas 和 Paint 对象来实现的。 在上面的代码中,我们可以看到,TextUtil 类是用于绘制字符串的工具类。该类中包含了多个变量,用于存储字符串的绘制信息,...

    android利用Paint在Canvas上实现竖排写字

    - 使用`canvas.drawText()`方法绘制文本,传入文本内容、x坐标(初始时为0,每绘制一行后减去文本宽度)、y坐标(初始时为0,每绘制一行后增加文本高度)。 - 使用`canvas.restore()`恢复Canvas的状态,结束竖排...

    源码

    在Android图形系统中,理解和熟练使用`drawText()`是创建自定义UI和视觉效果的关键步骤。通过调整Paint对象的属性和巧妙地操纵Canvas,开发者可以创建出极具吸引力的用户界面,提供独特的用户体验。 总的来说,...

    Android Canvas的drawText()与文字居中方案详解

    在Android中,我们可以使用`setTextAlign()`方法来改变文字的对齐方式,包括左对齐(`Paint.Align.LEFT`)、居中对齐(`Paint.Align.CENTER`)和右对齐(`Paint.Align.RIGHT`)。不同的对齐方式会影响`x`参数的实际...

    Android TextView drawText BaseLine理解,设置内容垂直、水平居中

    Android TextView drawText BaseLine理解   解决问题:如何设置绘制文本在盒子中 垂直居中 1. getHeight/2 设置为 drawText 绘制坐标,不能居中  上代码XML: Java代码: package ...

    Android中Canvas绘图基础详解

    该代码是一个完整的Android工程,详细演示如了如何使用Android中的各种drawXXX方法,以及画笔Paint如何影响绘制的效果。 具体参见博文: http://blog.csdn.net/iispring/article/details/49770651

    解决DrawText中文字与字母之间自动换行

    在探讨“解决DrawText中文字与字母之间自动换行”的问题时,我们首先需要理解DrawText函数的基本概念及其在Windows编程中的应用。DrawText是一个Windows API函数,用于将文本绘制到指定的矩形区域,同时提供了多种...

    DrawText Api code

    本篇文章将深入探讨如何使用`DrawText` API代码在PictureBox控件中绘制文本,以及相关的编程技巧和注意事项。 首先,`DrawText`函数是Windows API中的一个函数,位于`User32.dll`库中。它的基本语法如下: ```c++ ...

    No such filter:drawtext MacOS上包含drawtext的ffmpeg

    No such filter: 'drawtext' MacOs:node+ffmpeg+web 利用node+ffmpeg 在浏览器上播放rtsp流,所需要的ffmpeg;一般官网上下载的和默认自己编译的都不包含 drawtext filter;该工具包包含,可直接使用 macOs可直接...

    Android应用源码之(本地化与国际化)-IT计算机-毕业设计.zip

    开发者可以使用Android模拟器的不同区域设置进行测试,或者在实际设备上安装APK并更改系统语言来查看应用程序的本地化效果。 8. **论文撰写**: 对于毕业设计而言,除了实现之外,还需要撰写相关的技术论文,解释...

    Android Canvas drawText文字居中的一些事(图解)

    Android Canvas drawText 文字居中的一些事(图解) 在 Android 开发中,绘制居中文字是非常常见的需求。通过使用 Canvas 的 drawText 方法,可以实现文字的绘制,但是文字的居中是一个需要注意的问题。本文将通过...

    CDC::DrawTextCDC::DrawText

    标题中的"CDC::DrawText"是指在Microsoft Visual C++ (VC++)编程环境中,使用GDI (Graphics Device Interface) 的CDC类中的DrawText成员函数来绘制文本。这个函数允许程序员在设备上下文中绘制格式化的文本,提供了...

    利用drawtext给视频加字幕

    本文将深入探讨如何使用`ffmpeg`工具,结合`drawtext`过滤器来为视频添加文本字幕,同时忽略音频部分,专注于单一流视频的处理。 `ffmpeg`是一个强大的跨平台命令行工具,用于处理各种音视频格式的转换、编码、解码...

    android canvas drawText()文字居中效果

    总结来说,Android Canvas的`drawText()`方法结合`FontMetrics`和`setTextAlign()`可以轻松实现文字的居中显示。正确理解和运用这些概念对于创建自定义UI和图形界面至关重要。通过实践和调试,开发者可以掌握这些...

    Android特效——数字滚动条

    3. **数值动画**:为了实现数字滚动的效果,我们需要使用Android的动画框架。这可能涉及到ValueAnimator或ObjectAnimator,通过设置动画的时间间隔和目标值,平滑地改变数字的显示。 4. **布局管理**:数字滚动条...

    Android嵌入式开发资料

    开发者可以利用Path对象创建复杂的路径,使用Rect和RectF来绘制矩形,以及drawBitmap和drawText方法来显示图像和文字。此外,还可以通过Shader类实现渐变、图案填充等高级绘图效果。 实验报告中的"实验一"可能涉及...

    Android-android自定义尺子

    在Android中,我们可以使用`Canvas`类来绘制这些元素。`Canvas`提供了丰富的绘图方法,如`drawLine`(绘制直线,代表刻度)、`drawText`(绘制文本,用于数字和单位)以及`drawBitmap`(如果需要,可以绘制自定义...

    MFC-TextOut.rar_DrawText_DrawText Visual C++_MFC

    在MFC环境中,通常会创建一个`CDC`对象,然后使用这个对象来调用`TextOut`或`DrawText`。例如,在响应WM_PAINT消息时,可以这样使用: ```cpp void CMyView::OnPaint() { CPaintDC dc(this); // 创建一个设备上...

    Android Camera添加水印(编码)

    可以使用Canvas的drawText()或drawBitmap()方法来实现。 4. **设置回调**:监听相机预览数据,通过Camera2 API的ImageReader或者Camera API的onPreviewFrame()回调。 ### 添加动态水印 动态水印涉及到视频处理,这...

Global site tag (gtag.js) - Google Analytics