1. 布局中xml影响字体的属性
共有如下三种属性,均对应代码中的
textView.setTypeface()
1) android:typeface 类型为enum
monospace: 等宽字体
normal: 普通字体
sans: 非衬线字体
serif: 衬线字体
2) android:fontFamily 类型为String
与上面属性互斥,二者均有的话以上面属性为准;
可以引用系统自带的字体,如sans-serif-thin,也可以引用在res/font目录下的自定义字体或font-family.xml
3) android:textStyle 类型为flag,bit位,类似enum
normal: 0
bold: 1
italic: 2
bold|italic: 1|2=3
2. font-family
在res目录下新建font目录: res->new->Android Resource Directory,选择font
在font目录下新建font-family(eg. sf_bold.xml),new->Font resource file;可以直接把字体文件复制进去,otf或ttf格式均可
使用时可以直接在android:fontFamily标签引用,或者在代码中设置
textView.setTypeface()
sf_bold.xml:引用字体资源,为了兼容8.0以下版本,需要添加app:font...
<font-family xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<font
android:font="@font/regular"
android:fontWeight="400"
app:font="@font/regular"
app:fontWeight="400" />
<font
android:font="@font/bold"
android:fontWeight="700"
app:font="@font/bold"
app:fontWeight="700" />
</font-family>
fontWeight 100~900,字体的粗细,400一般对应正常字体,700一般对应粗体,100:thin, 900:black
(覆盖字体本身的weight, 这里面是根据400:normal, 700:bold来查找要使用的字体?)
可参照sdk/fonts目录下的xml文件
3. 代码获取typeface
1) 创建默认的字体
Typeface.defaultFromStyle()
2) 根据字体名创建字体,只能用系统中的字体名,用其它名字可能获取到难以预料的结果
Typeface.create(family, style)
3) 从文件中加载字体
Typeface.createFromFile(path)
4) 从资源中添加字体
android8.0或以上
context.getResoures.getFont()
小于8.0,把字体文件放到assets目录下,
Typeface.createFromAsset(context.getAssets(),path)
5)使用Typeface.Builder,可以从文件或assets中加载字体
new Typeface.Builder()...build()
4. style中设置字体
给每个TextView设置字体太麻烦,可以在styles.xml中添加新的style,并添加字体的item
<item name="android:fontFamily">@font/sf_ext_bold</item>
5. 给部分文字设置字体
1)用SpannableString/SpannableStringBuilder设置span
spannableString.setSpan(object, start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
(特别说明:Spannable.SPAN_EXCLUSIVE_EXCLUSIVE指的是新插入的文本是否具有格式)
object 是指字体格式,通常需要new对象,否则对于两个以上的同种格式只会显示后面的部分,一般是CharacterStyle | ParagraphStyle | TextWatcher | SpanWatcher的子类(see Spannable.java),常用的类如下:
- TypefaceSpan: 设置字体(这个只能用系统字体?)
- StyleSpan: 加粗|倾斜
- AbsoluteSizeSpan: 字体绝对大小,单位可以用像素或dp
- RelativeSizeSpan: 相对默认字体的倍数, float
- ForegroundColorSpan: 前景色(文字颜色)
- BackgroundColorSpan: 背景色
- UnderlineSpan: 下划线
- StrikethroughSpan: 删除线
- SubscriptSpan: 下标
- SuperscriptSpan: 上标
- ScaleXSpan: 字体宽度放大倍数, float 高度不变
- BulletSpan: 设置项目符号,可设符号宽度和颜色,类似ppt的段前符号
- ImageSpan: 设置图片,把指定位置的文字替换为图片
- URLSpan: 设置超链接,响应点击需添加 textView.setMovementMethod(LinkMovementMethod.getInstance())
- 其它,可自定义
2)还可以用html格式的字体,然后用Html.fromHtml()转为Spanned
标签<b><i><u>分别代表加粗、倾斜和下划线
<b>No Emails in Here</b>
字体大小及颜色
<font color="#797d80" size="13">Just empty space.</font>
超链接
<a href="tel:12345678">dial a phone number</a>