• 如何“任性”使用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的任意的位置,公式就大家自己推导下把,我就不累述了。

    公式修正

    感谢POP网友指出错误,正确的公式应为:

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

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

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

  • 相关阅读:
    实现用户密码登录
    面对不同类型老板,你该怎么办?
    11 款最好 CSS 框架 让你的网站独领风骚
    C#程序开发中经常遇到的10条实用的代码
    linux之Unable to find the ncurses libraries or the required header files.错误解决办法
    55+手绘网站设计 – 构建极具创新效果的网站
    超棒的JS移动设备滑动内容幻灯实现
    15个非常棒的jQuery无限滚动插件【瀑布流效果】
    前端性能优化:DocumentFragments或innerHTML取代复杂的元素注入
    TopFreeTheme精选免费模板【20130619】
  • 原文地址:https://www.cnblogs.com/xyczero/p/4312126.html
Copyright © 2020-2023  润新知