serif 是一个带衬线的字体,主要会是一些常用的

在Android实际开发中根据UI的设计图,经常要去改变系统默认的字体样式这样做会使apk变大很多啊而且为什么android要使用ios的字体-_-#

android更换字体

美高梅棋牌官网 1

通过设置typeface属性或者fontFamily属性设置typeface属性:

最近在研究android端字体替换需求,发现还是有很多方式来替换字体。

在 Android 下使用自定义字体已经是一个比较常见的需求了,最近也做了个比较深入的研究。

那么按照惯例我又要出个一篇有关 Android 修改字体相关的文章,但是写下来发现内容还挺多的,所以我决定将它们拆分一下,分几篇来详细的讲解(可能是五篇)。主要会是一些常用的替换字体的方案,最后还会介绍一些全局替换的方案,当然也会包含最新的 『Fonts in XML』的方案。

期待你持续关注。

本篇是本系列的第四篇,之前已经发布的文章,有兴趣可以先看看。

  • Android 字体修改概述|开篇
  • 修改字体需要了解 Typeface 的所有细节
  • 简单粗暴的方式,修改字体
  • normal
  • serif
  • sans
  • monospace

一,前言

一、前言

本文依然属于 Android 修改字体的系列,本系列开始会介绍一些比较方便的全局修改的方案,越往后的方案可能会越好一些,但是不一定最适用你现在的项目。

今天介绍的就是其中的一个,使用反射的方式,修改 Typeface 中的某个字体,来达到全局替换的目的。

fontFamily属性:

Android 系统默认使用的是一款叫做 Robote 的字体。Robote 本身就是 Google 自己的字体格式,Android 和 Chrome 操作系统上,默认都会使用 Robote 字体,并且也是 Google 视觉语言推荐的字体,UI设计师的眼光觉得系统自带的字体效果并不满足我们的设计需要因此要更换我们自己app的风格字体。

二、替换默认字体的思路

本文的很多预备的知识点,应该在之前的文章中就已经说清楚了,有兴趣可以去看看完整的文章,《》。

这里为了保证逻辑完整,还是大概说一下思路。

二,基础

2.1 修改Typeface 的某个默认字体

首先需要明确一点,在 Android 中,所有操作字体的动作,都会使用到 Typeface 这个类。而系统默认的一些字体,也会在 Typeface 被加载的时候进行初始化,因为这些步骤在它的静态代码块内完成。

美高梅棋牌官网 2

/f-init.png

而这些字体都会定义成了 static final 的,所以一般我们是不能去修改它们的。

美高梅棋牌官网 3

/f-staticfinal.png

但是我们是可以使用反射的方式去修改被标记为 static final 的常量的,这个后面再将细节。

也就是说,我们只需要在初始化的实际,替换掉某个默认的字体,然后在Theme 内将默认字体字体标记为该字体,就可以达到替换的目的。

美高梅棋牌官网 4

大家都知道影响字体的属性有以下几个:

android:textStyle="bold"
android:typeface="serif"
android:fontFamily="sans-serif"

2.2 在 TextView 中默认的字体

在 TextView 的构造方法里,设置字体的方法是 setTypefaceFromAttrs() ,下面是该方法的方法签名。

美高梅棋牌官网 5

/f-setAttr.png

在该方法的参数中,如果 familyName 为 null 的时候,会根据传入的 typefaceIndex 去设置对应的字体,传入到 setTypeface() 方法中。

再来看看 TextView 的构造方法中,获取这几个参数的地方。在默认什么都不设置的情况下, familyName 就是为 null,而 typefaceIndex 为 -1。这两个参数会先从 TextAppearance 中读取属性,再从 TextView 本身设置的 xml 属性中读取,后者会覆盖前者。

可是 typefaceIndex 还会有一些其它的操作,例如 inputType 为 password 的时候,就会强行修改为 MONOSPACE。

美高梅棋牌官网 6

/f-getAttr.png

最终,将处理后的结构,传递给 setTypefaceFromAttrs() 方法。

通过这些细节,我们就可以了解到,是在有一些情况下,是可以保证 TextView 使用的是我们的某个被加载到 Typeface 中的默认字体的。

条件就是:

fontFamily == null && typefaceIndex != -1

※typeface和fontFamily区别

android:typeface属性是增加API1android:fontFamily在API16中添加了属性

1. android:textStyle

textStyle 主要用于设定一些字体的样式,它是对所有的字体都生效的。也就是说哪怕你替换了字体,依然可以使用 textStyle 来修饰它的样式。textStyle 本身支持的可选项有 normal|bold|italic,它们也非常的好理解,就是普通|粗体|斜体。

2.3 在 Theme 中,修改字体为默认字体样式

对于一些默认的字体样式,是可以直接在 Theme 中进行设置的,它的优先级低于在页面布局的 xml 中,为 TextView 设置的字体样式,但是如果不设置,那么在 Theme 中的设置将会生效。

这个没什么好说的,我这里用的主题就是 AppTheme,所以我在它里面修改 android:typeface 就可以了。

美高梅棋牌官网 7

/f-theme.png

本文由美高梅游戏网站登录发布于美高梅棋牌游戏,转载请注明出处:serif 是一个带衬线的字体,主要会是一些常用的

您可能还会对下面的文章感兴趣: