字体在Android View中的输出 drawText

Canvas 作为绘制文本时,使用FontMetrics对象,计算位置的坐标。

public static class FontMetrics {

public float   top;

public float   ascent;

public float   descent;

public float   bottom;

public float   leading;

}

它的各基准线可以参考下图:

上图其实是通过代码画出来的,具体代码如下:

mPaint.reset();

mPaint.setColor(Color.WHITE);

mPaint.setTextSize(80);

// FontMetrics对象

FontMetrics fontMetrics = mPaint.getFontMetrics();

String text = "abcdefg";

// 计算每一个坐标

float textWidth = mPaint.measureText(text);

float baseX = 30;

float baseY = 700;

float topY = baseY + fontMetrics.top;

float ascentY = baseY + fontMetrics.ascent;

float descentY = baseY + fontMetrics.descent;

float bottomY = baseY + fontMetrics.bottom;

// 绘制文本

canvas.drawText(text, baseX, baseY, mPaint);

// BaseLine描画

mPaint.setColor(Color.RED);

canvas.drawLine(baseX, baseY, baseX + textWidth, baseY, mPaint);

mPaint.setTextSize(20);

canvas.drawText("base", baseX + textWidth, baseY, mPaint);

// Base描画

canvas.drawCircle(baseX, baseY, 5, mPaint);

// TopLine描画

mPaint.setColor(Color.LTGRAY);

canvas.drawLine(baseX, topY, baseX + textWidth, topY, mPaint);

canvas.drawText("top", baseX + textWidth, topY, mPaint);

// AscentLine描画

mPaint.setColor(Color.GREEN);

canvas.drawLine(baseX, ascentY, baseX + textWidth, ascentY, mPaint);

canvas.drawText("ascent", baseX + textWidth, ascentY + 10, mPaint);

// DescentLine描画

mPaint.setColor(Color.YELLOW);

canvas.drawLine(baseX, descentY, baseX + textWidth, descentY, mPaint);

canvas.drawText("descent", baseX + textWidth, descentY, mPaint);

// ButtomLine描画

mPaint.setColor(Color.MAGENTA);

canvas.drawLine(baseX, bottomY, baseX + textWidth, bottomY, mPaint);

canvas.drawText("buttom", baseX + textWidth, bottomY + 10, mPaint);

相信通过以上程序,能够很好的理解topLine,buttomLine,baseLine,ascentLine,descentLine。

另外:Paint类有两个方法

public native float ascent();

public native float descent();

ascent():the distance above the baseline(baseline以上的height)

descent():the distance below the baseline(baseline以下的height)

所以ascent() + descent() 可以看成文字的height。

到此为止,怎么获取文字的height和width都已经揭晓了:

时间: 2024-08-03 04:22:50

字体在Android View中的输出 drawText的相关文章

Android View中滚动相关

方法 scrollTo: (内容的左上角)达到某个地点 scrollBy: 根据当前位置,再移动多少 属性: mScrollX, 以下是文档解释 The offset, in pixels, by which the content of this view is scrolled horizontally. mScrollY, 以下是文档解释 The offset, in pixels, by which the content of this view is scrolled vertica

Android view中的requestLayout和invalidate方法

Android view中的requestLayout和invalidate方法 requestLayout:当view确定自身已经不再适合现有的区域时,该view本身调用这个方法要求parent view重新调用他的onMeasure onLayout来对重新设置自己位置. 特别的当view的layoutparameter发生改变,并且它的值还没能应用到view上,这时候适合调用这个方法. invalidate:View本身调用迫使view重画

android view 中各函数的执行顺数

这个就好像是 activity 的生命周期一样,如果我们要使用自定义的 view,那么就很有必要了解一下 view 的那些能够被重写的函数的执行顺序.废话不多讲,以常用的5个函数为例子,见下文: 1 package com.example.pulltorefreshtest; 2 3 import android.content.Context; 4 import android.graphics.Canvas; 5 import android.util.AttributeSet; 6 imp

Android View中的requestLayout和invalidate区别

摘抄自Api Doc RequestLayout: 当view确定自身已经不再适合现有的区域时,该view本身调用这个方法要求parent view重新调用他的onMeasure onLayout来对重新设置自己位置. 特别的当view的layoutparameter发生改变,并且它的值还没能应用到view上,这时候适合调用这个方法.也就是当通过getLayoutParrms().width = XXX的时候,我们需要重新调用RequestLayout invalidate:View类调用迫使v

在android项目中使用FontAwesome字体

在android项目中使用FontAweSome图标集,可以方便的适配各种屏幕分辨率,不必在各种不同分辨率文件夹中新建资源文件.使用字体是一种很巧妙的方法,把图像以字体的方式呈现,这样以前设置为android:background的属性,现在只需要设置android:text就可一搞定,而且还可一适配不同的分辨率. 在XML文件中设置字体时,只需要指定android:typeface属性即可,但是 这个值只支持系统内置的几种字体. 导入FontAwesome字体,需要在项目中导入第三方字体.方式

Android 自定义view中的属性,命名空间,以及tools标签

昨日看到有人在知乎上问这3个琐碎的小知识点,今天索性就整理了一下,其实这些知识点并不难,但是很多开发者平时很少注意到这些, 导致的后果就是开发的时候 经常会被ide报错,开发效率很低,或者看开源代码的时候很多地方看不懂. 考虑到现在越来越多的人开发环境迁移到android studio,所以一切以android studio环境为准.和eclipse开发环境相比其实两者是差不多的, 偶有区别 主要也是android studio引入的gradle脚本造成差异. 首先来看看tools标签. 这个地

android中实现毛笔效果(View 中绘图)

最近有一个项目设计一个APP实现通过触摸屏实现毛笔写字效果.传统的绘画板程序直接通过Path的moveTo和LineTo便可实现简单的线条绘画程序.然而要达到毛笔的笔锋效果则需要更为详细点的设计.我的实现思路是通过以触摸事件DOWN.MOVE.UP中的每一个点为圆心画圆,除此之外还可通过触摸压力的大小改变所绘圆的半径,这样一连串的圆便可粗略地模拟毛笔笔锋效果,在设计次效果时遇到两个问题: 1:android触摸中的MOVE时间取点的频率不是很高,会隔一定的像素取点,当轻触滑动时会出现一天不连续圆

android之在view中内嵌浏览器的方法

我要做的一个东西是在一个页面的中间嵌入浏览器,一开始不知道从哪里开始,因为以前用的都是Textveiw或者editVeiw之类的控件,而它们并不能用来显示网页的内容,怎么办呢? 首先想到的是:是不是有一个用来显示网页的View呢,于是我就在eclipse里xml编辑器里输入<web,哈哈,果然下面有个提示是webVeiw,那么能不能用它呢?于是到网上搜一下它的资料,果然可以的,下面就开始吧. 先在xml里把webview建好,在代码里用findViewById()将其取出来.我的代码是: Web

Android中实现Bitmap在自定义View中的放大与拖动

一:基本实现思路 基于View类实现自定义View –MyImageView类.在使用View的Activity类中完成OnTouchListener接口,实现对自定义View的触摸事件监听 放大与拖动 基于单点触控实现Bitmap对象在View上的拖动.并且检测View的边缘,防止拖动过界.基于两个点触控实现Bitmap对象在View上的放大.并且检测放大倍数.基于Matrix对象实现对Bitmap在View上放大与平移变换 Bitmap对象在View中的更新与显示 通过重载onDraw方法,