Android字体

本文详细介绍了在Android中如何自定义字体,包括使用XML属性、font-family资源文件、代码方式设置字体,以及如何在不同API级别下兼容处理。此外,还讲解了如何通过SpannableString精确控制部分文字的字体样式,提供了丰富的示例和技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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> 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值