• TextView中字体设置

    • typeface

      • 一、配置设置
      • 代码方式设置
    • fontFamily
  • 文字如何实现加粗、斜体?
  • 三者之间的关系
  • 自定义字体
  • 参考:

TextView中字体设置

textView中有三个属性可以设置字体

  • textStyle:设置样式
  • fontFamily:设置使用的字体
  • typeface:设置使用的字体文件。

textStyle 如下样式

  • NORMAL:默认字体;
  • BOLD:粗题;
  • ITALIC:斜体;
  • BOLD_ITALIC:粗斜体;

typeface

java系统默认支持如下字体:

  • noraml (普通字体,系统默认使用的字体)
  • sans(非衬线字体)
  • serif (衬线字体)
  • monospace(等宽字体)

简单介绍三种字体的区别:在西方国家罗马字母阵营中,字体分为两大种类:Sans Serif和Serif,打字机体虽然也属于Sans Serif,但由于是等宽字体,所以另外独立出Monospace这一种类。

Serif的意思是,在字的笔划开始及结束的地方有额外的装饰,而且笔划的粗细会因直横的不同而有不同。相反的,Sans Serif则没有这些额外的装饰,笔划粗细大致差不多。如下图:

Serif和Sans-serif字体的区别

有两种方式设置字体。

一、配置设置

<TextViewandroid:text="Hello,World"android:textSize="20sp"<!--  使用默认的sans字体-->android:typeface="sans" <!--  使用默认的serifs字体-->   android:typeface="serif"<!--  使用默认的monospace字体-->android:typeface="monospace"/>

代码方式设置

//设置serif字体
textView.setTypeface(Typeface.SERIF);
//设置sans字体
textView.setTypeface(Typeface.SANS_SERIF);
//设置monospace字体
textView.setTypeface(Typeface.MONOSPACE);

fontFamily

fontFamily 值为系统支持的字体名称。
根据MATERIAL DESIGN 文档中的排版一章描述,anroid可支持下图的字体样式:

新版本支持新的字体,详细见下表。

这些字体文件定义在系统文件的data/fonts/fonts.xml文件夹下android 5.0 +以上。详细信息可连接的文件。

    <!-- first font is default --><family name="sans-serif"><font weight="100" style="normal">Roboto-Thin.ttf</font><font weight="100" style="italic">Roboto-ThinItalic.ttf</font><font weight="300" style="normal">Roboto-Light.ttf</font><font weight="300" style="italic">Roboto-LightItalic.ttf</font><font weight="400" style="normal">Roboto-Regular.ttf</font><font weight="400" style="italic">Roboto-Italic.ttf</font><font weight="500" style="normal">Roboto-Medium.ttf</font><font weight="500" style="italic">Roboto-MediumItalic.ttf</font><font weight="900" style="normal">Roboto-Black.ttf</font><font weight="900" style="italic">Roboto-BlackItalic.ttf</font><font weight="700" style="normal">Roboto-Bold.ttf</font><font weight="700" style="italic">Roboto-BoldItalic.ttf</font></family>

android 4.4- 文件是不同的,感觉更易于理解。android 4.1 介绍中的Font families章节有较为详细的介绍

Font families
Android 4.1 adds several more variants of the Roboto font style for a total of 10 variants, and they're all usable by apps. Your apps now have access to the full set of both light and condensed variants.The complete set of Roboto font variants available is:Regular
Italic
Bold
Bold-italic
Light
Light-italic
Condensed regular
Condensed italic
Condensed bold
Condensed bold-italic
You can apply any one of these with the new fontFamily attribute in combination with the textStyle attribute.Supported values for fontFamily are:"sans-serif" for regular Roboto
"sans-serif-light" for Roboto Light
"sans-serif-condensed" for Roboto Condensed
You can then apply bold and/or italic with textStyle values "bold" and "italic". You can apply both like so: android:textStyle="bold|italic".You can also use Typeface.create(). For example, Typeface.create("sans-serif-light", Typeface.NORMAL).

font.xml文件定义了很多字体,若字体不支持怎么办?android 5.0版本的font.xml注释中有如下一段话可以很好的说明系统的处理流程:

The first family is also the default font, which handles font request that have not specified
specific font names.

font.xml文件及其变更记录有较为完备的更新记录。

这里有一张表很好的说明了问题(来源):

Font android:fontFamily android:textStyle
Roboto Thin sans-serif-thin
Roboto Light sans-serif-light
Roboto Regular sans-serif
Roboto Bold sans-serif bold
Roboto Medium sans-serif-medium
Roboto Black sans-serif-black
Roboto Condensed Light sans-serif-condensed-light
Roboto Condensed Regular sans-serif-condensed
Roboto Condensed Medium sans-serif-condensed-medium
Roboto Condensed Bold sans-serif-condensed bold
Noto Serif serif
Noto Serif Bold serif bold
Droid Sans Mono monospace
Cutive Mono serif-monospace
Coming Soon casual
Dancing Script cursive
Dancing Script Bold cursive bold
Carrois Gothic SC sans-serif-smallcaps

总结: fontFamliy 表示android系统支持的一些列字体。每个字体都一个别名,以唯一标识这个字体。由于android各个版本的不同,会导致高版本支持的某些字体设置在低版本不生效,则使用低版本的默认字体。

文字如何实现加粗、斜体?

我们知道TextView画文字,最终都是通过Paint相关设置来完成的。

android中常用的需求是设置TextView的FontFamily属性。有两种方式设置:

  • 方式一 通过配置文件完成
 android:fontFamily="serif"
  • 方式二:通过代码设置。
TextView.setTypeface(TypeFace typeface)。
public void setTypeface(Typeface tf) {//...其他代码mTextPaint.setTypeface(tf);//...更新界面代码
}

可以看下TexTView的setTypeface方法具体实现。

TextView.setTypeface(TypeFace typeface, int style)。public void setTypeface(Typeface tf, int style) {if (style > 0) {if (tf == null) {tf = Typeface.defaultFromStyle(style);} else {tf = Typeface.create(tf, style);}setTypeface(tf);// now compute what (if any) algorithmic styling is neededint typefaceStyle = tf != null ? tf.getStyle() : 0;int need = style & ~typefaceStyle;mTextPaint.setFakeBoldText((need & Typeface.BOLD) != 0);mTextPaint.setTextSkewX((need & Typeface.ITALIC) != 0 ? -0.25f : 0);} else {mTextPaint.setFakeBoldText(false);mTextPaint.setTextSkewX(0);setTypeface(tf);}
}
  • Paint.setFakeBoldText方法实现字体的加粗
  • Paint.setTextSkewX 实现字体斜体

三者之间的关系

TextView中有个私有方法:setTypefaceFromAttrs

    private void setTypefaceFromAttrs(String familyName, int typefaceIndex, int styleIndex) {Typeface tf = null;if (familyName != null) {tf = Typeface.create(familyName, styleIndex);if (tf != null) {setTypeface(tf);return;}}switch (typefaceIndex) {case SANS:tf = Typeface.SANS_SERIF;break;case SERIF:tf = Typeface.SERIF;break;case MONOSPACE:tf = Typeface.MONOSPACE;break;}setTypeface(tf, styleIndex);}

结论:

  • fontFamily、typeface 都用于设置字体,d都设置是优先使用fontFamily。
  • textStyle 用于改变字体的样式

自定义字体

android O 开始支持自定义字体
https://developer.android.com/guide/topics/resources/font-resource.html

参考:

  • how-to-change-fontfamily-of-textview-in-android
  • Valid values for android:fontFamily and what they map to?
  • 自定义字体

  • https://material.io/guidelines/style/typography.html#typography-line-height

  • https://storage.googleapis.com/material-design/publish/material_v_12/assets/0B0J8hsRkk91LNGdYTEF0VnVPT0k/robotospecimenbooklet.pdf

FontFamily 看这里就够了相关推荐

  1. 十大经典排序算法动画与解析,看我就够了

    作者 | 程序员小吴 转载自五分钟学算法(ID: CXYxiaowu) 排序算法是<数据结构与算法>中最基本的算法之一. 排序算法可以分为内部排序和外部排序.内部排序是数据记录在内存中进行 ...

  2. python免费入门教程-python入门免费教程看这些就够了

    原标题:python入门免费教程看这些就够了 python入门免费教程看这些就够了 自从20世纪90年代初Python语言诞生至今,它逐渐被广泛应用于处理系统管理任务和Web编程.Python已经成为 ...

  3. 关于javascript的原型和原型链,看我就够了(二)

    温故 创建对象的三种方式 通过对象直接量 通过new创建对象 通过Object.create() js中对象分为两种 函数对象 普通对象 仔细观察如下代码 function Foo(name) {th ...

  4. 云小课 | 网站接入WAF失败怎么办?看这里就够了

    阅识风云是华为云信息大咖,擅长将复杂信息多元化呈现,其出品的一张图(云图说).深入浅出的博文(云小课)或短视频(云视厅)总有一款能让您快速上手华为云.更多精彩内容请单击此处. 摘要: 网站接入WAF失 ...

  5. 关于javascript的原型和原型链,看我就够了(一)

    关于js的原型和原型链,有人觉得这是很头疼的一块知识点,其实不然,它很基础,不信,往下看 要了解原型和原型链,我们得先从对象说起 创建对象 创建对象的三种方式: 对象直接量 通过对象直接量创建对象,这 ...

  6. python 人脸识别调整人脸大的距离_Python 人脸识别就多简单,看这个就够了!

    原标题:Python 人脸识别就多简单,看这个就够了! 今天给大家介绍一个世界上最简洁的人脸识别库 face_recognition,你可以使用 Python 和命令行工具进行提取.识别.操作人脸. ...

  7. python免费全套教程-python入门免费教程看这些就够了

    原标题:python入门免费教程看这些就够了 python入门免费教程看这些就够了 自从20世纪90年代初Python语言诞生至今,它逐渐被广泛应用于处理系统管理任务和Web编程.Python已经成为 ...

  8. 《考取HCIA证书看我就够了》第五篇:[HCIA-IoT]物联网技术之感知层技术概览

    系列文章目录 <考取HCIA证书,看我就够了> 1.华为职业认证体系及HCIA介绍 2.[HCIA-IoT]物联网起源与发展 3.[HCIA-IoT]物联网技术之网络层技术概览 4.[HC ...

  9. java日期格式化为json字符串,看这个就够了

    java日期格式化为json字符串,看这个就够了. 不管是入参还是返参,原理都是一样的. /**      * json格式化注解      * 1,pattern是转化成json的格式,       ...

最新文章

  1. 解决xcode ***is missing from working copy
  2. 华硕k555l拆光驱_2L大小的迷你电脑用起来有什么区别?华硕VC66
  3. .NET 2.0防止同用户同时登陆实例
  4. Flow Problem
  5. PL/SQL块中不能直接执行DDL语句(错误)
  6. 解读文献里的那些图——流式细胞术
  7. oracle的redo与undio
  8. Java锁的种类以及辨析
  9. pandas 如何删掉第一行_Pandas-数据筛选
  10. HttpClient 如何正确的释放资源
  11. 传说中的世界500强面试题-推理能力(1)
  12. python调用迅雷下载引擎_GitHub - cryzlasm/ThunderOpenSDK: 迅雷开放下载引擎, 收集, 使用...
  13. ps如何图片调色教程及ps有哪些好用的调色滤镜插件
  14. 计算机机械硬盘寿命,有问有答:电脑的机械硬盘和固态硬盘哪个寿命更长?
  15. OAEP及其在OpenSSL中的实现
  16. mac下Intelij IDEA中修改maven国内镜像
  17. AlphaZero如何学习国际象棋的?
  18. Sulley fuzzer learning
  19. ubuntu18.04 使用systemd方式添加开机运行sh脚本
  20. rsync运行时出现skipping non-regular file

热门文章

  1. GAN 领域当下最热门的“弄潮儿”都有哪些?
  2. 《Linus Torvalds自传》摘录 ----- 阮一峰 文
  3. Windows——鼠标无法进行拖拽的解决方法
  4. 甲骨文CEO埃里森的教战守则
  5. 消息队列 常见问题分析(小白必看)
  6. .onReceive (SwiftUI中文文档手册)
  7. 【大数据实验1】cloudstack安装部署(小白式傻瓜教学)
  8. bp字典爆破——攻防世界weak_auth
  9. 数学建模(基于B站建模老哥和清风学长):层次分析法
  10. python 3 常用内置函数