在本系列的上一篇文章中,我们对 Typeface 进行了深入的解析,还没有看过上一篇文章的朋友,建议先去阅读 Android字体系列 (二):Typeface完全解析。接下来我们看下 Google 推出的 Xml 中使用字体

一、Xml 中字体介绍

Google 在 Android Support Library 26 引入了 Xml 中设置字体这项新功能,它可以让你将字体当成资源去使用,你可以在 res/font/ 文件夹中添加 font 文件,将字体捆绑为资源。这些字体会在 R 文件中编译,可直接在 Android Studio 中使用,如:

@font/myfont
R.font.myfont
复制代码

注意:要使用 Xml 字体功能,需引入 Android Support Library 26 及更高版本且要在 Android 4.1 及更高版本的设备

二、使用步骤

1、右键点击 res 文件夹,然后转到 New > Android resource directory

2、在 Resource type 列表中,选择 font,然后点击 OK

3、在 font 文件夹中添加字体文件

关于字体,推荐两个免费下载的网站

fonts.google.com/

www.1001freefonts.com/

添加之后就会生成 R.font.ma_shan_zhenng_regular 和 R.font.noto_sans_bold

4、双击字体文件可预览当前字体

以上 4 个步骤完成后我们就可以在 Xml 中使用字体了

5、创建 font family

1)、右键点击 font 文件夹,然后转到 New > Font resource file。此时将显示 New Resource File 窗口。

2)、输入文件名,然后点击 OK。新的字体资源 Xml 会在编辑器中打开。

3)、将各个字体文件、样式和粗细属性都封装在 <font> 元素中。如下:

<?xml version="1.0" encoding="utf-8"?>
<font-family xmlns:tools="http://schemas.android.com/tools"xmlns:android="http://schemas.android.com/apk/res/android"tools:ignore="UnusedAttribute"><fontandroid:fontStyle="normal"android:fontWeight="400"android:font="@font/ma_shan_zheng_regular"tools:ignore="UnusedAttribute" /><fontandroid:fontStyle="normal"android:fontWeight="400"android:font="@font/noto_sans_bold"/>
</font-family>
复制代码

实践发现使用 font family 存在一些坑:

1、例如我上面添加了两个 font 标签,这个时候在 Xml 里面引用将不会有任何效果,而且设置的 fontStyle 等属性不会生效。

2、当只添加了一个 font 标签,此时字体会生效,但是设置的 fontStyle 等属性还是不会生效

因此我们在使用的时候建议直接对字体资源进行引用,样式粗细这些在进行单独的设置

三、在 XML 布局中使用字体

直接在布局 Xml 中使用 fontFamily 属性进行引用,如下图:

四、在样式中添加并使用字体

1、在 style.xml 中添加样式

<style name="customfontstyle" parent="Theme.ChangeDefaultFontDemo"><item name="android:fontFamily">@font/noto_sans_bold</item>
</style>
复制代码

2、在布局 Xml 中使用,如下图:

五、在代码中使用字体

在代码中,我们可以通过 ResourcesCompat 或 Resource 的 gontFont 方法拿到 Typeface 对象,然后调用相关的 Api 去设置就行了,例如:

//方式1
val typeface = ResourcesCompat.getFont(context, R.font.myfont)
//方式2
val typeface = resources.getFont(R.font.myfont)
//设置字体
textView.typeface = typeface
复制代码

为了方便在代码中使用,我们可以进行合理的封装:

object FontUtil {const val NOTO_SANS_BOLD = R.font.noto_sans_boldconst val MA_SHAN_ZHENG_REGULAR = R.font.ma_shan_zheng_regular/**缓存字体 Map*/private val cacheTypeFaceMap: HashMap<Int,Typeface> = HashMap()/*** 设置 NotoSanUIBold 字体*/fun setNotoSanUIBold(mTextView: TextView){try {mTextView.typeface = getTypeface(NOTO_SANS_BOLD)} catch (e: Exception) {e.printStackTrace()}}/*** 设置 MaShanZhengRegular 字体*/fun setMaShanZhengRegular(mTextView: TextView){try {mTextView.typeface = getTypeface(MA_SHAN_ZHENG_REGULAR)} catch (e: Exception) {e.printStackTrace()}}/*** 获取字体 Typeface 对象*/fun getTypeface(fontResName: Int): Typeface? {val cacheTypeface = cacheTypeFaceMap[fontResName]if (cacheTypeface != null) {return cacheTypeface}return try {val typeface: Typeface? = ResourcesCompat.getFont(MyApplication.mApplication, fontResName)cacheTypeFaceMap[fontResName] = typeface!!typeface} catch (e: Exception) {e.printStackTrace()Typeface.DEFAULT}}
}
复制代码

那么后续我们在代码中使用字体,就只需调一行代码就 Ok 了

FontUtil.setMaShanZhengRegular(mTextView1)
FontUtil.setNotoSanUIBold(mTextView2)
复制代码

六、项目需求实践

回顾一下我接到的项目需求:全局替换当前项目中的默认字体,并引入 UI 设计师提供的一些新字体

在学习本篇文章之前,我们引入字体都是放在 assets 文件目录下,这个目录下的字体文件,我们只能在代码中获取并使用。那么通过本篇文章的讲解,我们不仅可以在代码中进行使用,还可以在 Xml 中进行使用。现在我们解决了一半的需求,关于全局替换默认字体还需等到下一篇文章

字体系列 (三):Xml中的字体 font ttf相关推荐

  1. 【Interfacenavigation】XML中的字体(27)

    原 Android 8.0(API级别26)引入了一项新功能,即XML中的字体,它允许您将字体用作资源.您可以在font文件res/font/夹中添加文件以将字体捆绑为资源.这些字体在您的R文件中编译 ...

  2. html中设置字体字型,html中 如何在font中设置字体样式(粗体斜体等)

    html> 字体加粗 用<b>加粗字体:加粗 用<strong>加粗字体:加粗 用CSS font-weight 加粗 normal(400), bold(700)    ...

  3. 嵌入式Qt方案中文显示系列:Qte中的字体支持和使用

    随着嵌入式系统的不断发展,人们对于嵌入式系统的可靠性.安全性和性能的要求也越来越高.在嵌入式系统中,字体的支持和使用是一个非常重要的问题,因为字体不仅影响着系统的外观,也会影响到系统的性能和安全性.本 ...

  4. 微信小程序可以加服务器上的字体,微信小程序中自定义字体

    微信小程序支持自定义字体开放出来也有段时间,这边整理下使用自定义字体中,容易忽略的一些问题,和简便的全局自定义方式.如果是同时加载两种字体包,先下载下来的会被后下载下来的字体包给覆盖. 官网接口文档 ...

  5. css引入本地字体文件,关于css中引入字体文件

    关于css中引入字体文件 css样式代码: @font-face { font-family: Lovelo-Black;//定义font的名字 src: url(font/Lovelo Black. ...

  6. html5字体修改webview,WebView中修改字体

    一般情况下我们做加载网页都是返回一个url,我们进行加载.各种各样的样式都已经在网页中做了处理.但是,也会碰到一些情况,需要我们加载代码片段.还有修改一些样式,比如:修改网页中的字体.当然,本文中的修 ...

  7. unity 发光字体_Unity3D 设置OnGUI中的字体样式、字体颜色、字体大小等

    1:字体样式 从系统盘,如C:\Windows\Fonts找一个.ttf格式的字体库,放到Assets目录下. 此时选中该字体库,在Inspector面板可以修改字体的大小,试了一下修改字体的颜色(F ...

  8. html页面icon字体无法显示,bootstrap中icon字体图标怎么不显示?

    bootstrap中icon字体图标怎么不显示?下面本篇文章给大家介绍一下Bootstrap字体图标不显示问题.有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助. 问题: bootstr ...

  9. win10修改系统字体(替换OneNote中Calibri字体)

    微软的OneNote还是很好用的,但是字体问题一直是一个吐槽点. 我自己就去微软官网吐槽了好几次,然而并没有什么用.我说设置默认字体为consolas完全无法生效,再次输入笔记时,中文自动改为微软雅黑 ...

最新文章

  1. 网页性能优化之异步加载js文件
  2. 数据库水平切分的实现原理解析——分库,分表,主从,集群,负载均衡器
  3. 使用【python语言】和【typescript】进行冒泡排序
  4. 无监督特征学习——Unsupervised feature learning and deep learning
  5. 数据库开发基本操作-SQL Server数据库基础知识
  6. python (六)函数
  7. 刚刚,阿里云上线六大“战疫情”项目
  8. zmq 接口函数之 :zmq_socket_monitor - 注册一个监控回调函数
  9. 热传递物理模型matlab,简单传热学计算机分析MatlabPDE二维不稳态焊接热传导求解.PPT...
  10. 信号集操作函数,信号阻塞与未决
  11. SpringMVC+Thymeleaf如何处理URL中的动态查询参数
  12. linkedin第三方授权登录
  13. NetApp 全闪存数据存储软件 AFF A 系列
  14. MacOS Catalina 10.15.1 (19B88) — 苹果操作系统
  15. openGL中Phong 着色
  16. 音乐伴奏如何提取?不容错过的几款软件
  17. JQ input框单多图上传
  18. Exiting intel PXE ROM.Operating system not found
  19. Windows下截图快捷键
  20. Notification的功能与使用案例

热门文章

  1. 什么是AOP对AOP的面试题
  2. vuex配合本地Cookies数据持久化
  3. 【滤波器设计】基于matlab实现数字滤波器和均衡器设计
  4. 女生节征集令 | 你的数据女神,由你来宠~
  5. 轻卡板簧设计(论文+CAD图纸+CATIA三维图+SW图纸)
  6. Java对接阿里云号码隐私保护
  7. 2.0.2-Reaper piano roll 缩放与滚动设置
  8. 利用时间来找回修改数据
  9. Unity MonoIL2CPP
  10. 精选28款超实用的“工具类”网站