问题引入
在自定View执行onDraw时,需要调用Canvas的drawText方法 (Canvas类说明)
drawText (Stringtext, float x, float y,Paint paint) 使用基本的drawText方法时,不明确文字绘制位置是如何受到origin坐标影响的
1.Canvas.drawText中x、y位置的说明
2.使用TextPaint来绘制文字 (以下摘自链接2)
FontMerics理论知识
Baseline是基线,在Android中,文字的绘制都是从Baseline处开始的,Baseline往上至字符“最高处”的距离我们称之为ascent(上坡度),Baseline往下至字符“最低处”的距离我们称之为descent(下坡度);Baseline上方的值为负,下方的值为正
leading(行间距)则表示上一行字符的descent到该行字符的ascent之间的距离;
top的意思其实就是除了Baseline到字符顶端的距离外还应该包含这些符号的高度,bottom的意思也是一样。一般情况下我们极少使用到类似的符号所以往往会忽略掉这些符号的存在,但是Android依然会在绘制文本的时候在文本外层留出一定的边距,这就是为什么top和bottom总会比ascent和descent大一点的原因。而在TextView中我们可以通过xml设置其属性android:includeFontPadding="false"去掉一定的边距值但是不能完全去掉。
fontMetrics中的变量和文字的size、typeface有关
TypePaint中各个方法的使用说明
setTextAlign各种对齐方式带来的影响示例
3.FontMetrics的各种文字示意图辅助说明
4.一种绘制文字水平及垂直居中的方法
targetRect.centerY() - (FontMetrics.bottom - FontMetrics.top) / 2 - FontMetrics.top
(FontMetrics.bottom - FontMetrics.top) / 2
—— 文字的top与bottom间的距离,十分接近纯文字的高度,因为top是负值,所以用bottom-top
文字一行显示不全需要换行怎么处理
StaticLayout基本使用示例
使用Canvas的drawText绘制文本是不会自动换行的,即使一个很长很长的字符串,drawText也只显示一行,超出部分被隐藏在屏幕之外。可以逐个计算每个字符的宽度,通过一定的算法将字符串分割成多个部分,然后分别调用drawText一部分一部分的显示, 但是这种显示效率会很低。
StaticLayout是android中处理文字换行的一个工具类,StaticLayout已经实现了文本绘制换行处理
StaticLayout在绘制的时候,默认从Canvas的(0,0)位置开始,且无法定位,所以要对canvas做translate处理
···java
canvas.save();
canvas.translate(textX,textY);
mTextLayout.draw(canvas);
canvas.restore();
···
String 和 Charsequence 有什么区别
String Charsequence StringBuilder StringBuffer的区别
String is Charsequence
String 和 CharSequence 关系
String 继承于CharSequence,也就是说String也是CharSequence类型。
CharSequence是一个接口,它只包括length(), charAt(int index), subSequence(int start, int end)这几个API接口。除了String实现了CharSequence之外,StringBuffer和StringBuilder也实现了CharSequence接口。
需要说明的是,CharSequence就是字符序列,String, StringBuilder和StringBuffer本质上都是通过字符数组实现的!
StringBuilder和StringBuffer的区别
StringBuilder和StringBuffer都是可变的字符序列。它们都继承于AbstractStringBuilder,实现了CharSequence接口。
但是,StringBuilder是非线程安全的,而StringBuffer是线程安全的。