这是我参加更文应战的第 1 天,活动概况查看: 更文应战

前语

很快乐遇见你~

最近接到一个需求,大致内容是:大局替换其时项目中的默许字体,并枚举类型 java引进 UI 规划师供应的一些新字体。所以对字体做了些研讨,把源码编辑器编程猫自己的一些心得同享给咱们。

留心:本文所展示的体系源码都是依据Andro算法的有穷性是指id-30 ,并提取中心部分进行剖析

一、Android 默许字体介绍

1、Android 体系默许运用的是一款宫颈癌前期症状叫做 Roboto 的字体,字体转换器这也是 Google 举荐运用的一款字体 传送门。它供应了多种字体办法的挑选,例如:粗体,斜体等等源码

2、在 Android 中,咱们一般会直接或直接的通过 TextV源码网站iew 控件去承载字体的算法是什么闪现,因为关于 Android 供应的承载字体闪现的控件都会直接或直接承继 TextView,例如:EditText,Button 等等,下面给出一张 TextView 承继图:

Android字体系列 (一):Android字体根底

3、TextView 中有三个特征能够设置字体的闪现:

1)、textStyle

2)、typeface

3)、fontFamily

下面咱们关键介绍下这三个特征

二、textStyle

textStyle 首要用来设置字体的款式,咱们字体规划看下它在 TextView 的自定义特征中的一个表现:

//TextView 的自定义特征 text狗狗币Style
<attr name="textStyle">
<flag name=字体规划在线生成器"normal" value="0" />
<flag name="bold" value="1" />
<flag name="italic" value="2" />
</attr>

从上述自定义特征中咱们可枸杞以知道:

1、textStyl算法剖析的意图是e 首要有 3 种款式:

  • normal:默许字体
  • bold:粗体
  • italic:斜体

2、textStyle 是用 flag 来承载的,flag 标明的值能够做或运算,也就是说咱们能够设置多种字体款式进行叠加

接下来咱们在 xml 中设置一下,如下图:

Android字体系列 (一):Android字体根底

能够看到,咱们给 TextView 的 textStyle 特征设置了粗体和斜体两种款式叠加,右边能够看到预览作用

相同咱们也能够在代码中对其进行设置,可是在代码中设置字体款式只能设置一种,不能叠加:

mText枚举类型定义View.setTypeface枚举类型 java(null, Typeface.BOL枚举类型是什么意思D)

三、typeface

typeface 首要用于设置 TextView 的字体,咱们看下它在 Te枚举类型enumxtView 的自定义特征中的一个表现:

//TextView 的自定义特征Go typeface
<attr name="type源码face">
<enum name="normal" value="0" />
<enum name="sans" vgooglealue="1" />
<en枸杞um name="serif" value="2" />
<enum name="monospace公积金" value="3" /&gt枚举类型是什么意思;
</attr>

从上述自定义特征中咱们能够知道:

1、typ宫颈癌疫苗eface 供应了 4 种字体:

  • noraml:普通字体,体系默许运用的字工商银行
  • sans:非衬线字体
  • serif:衬线字体
  • mono字体大小怎样调space:等宽字体

2、typeface 是用 e枚举类型 javanum 来承载的,e枚举类型的用法num 标明枚举类型,每次只能挑选一个,因而咱们每次只能设置一种字体,不能叠加

接下来咱们在 xml算法导论 中设置一下,如下图:

Android字体系列 (一):Android字体根底

简略介绍这几种字体的差异:

serif (衬线字体):在字的笔划初步及完毕的当地有额外的装饰,而且笔划的粗算法是什么细会因直横的不同而有不同相

sans (非衬线字体):没有 serif 字体这些额外的装饰,和 noraml 字体是相同的

Android字体系列 (一):Android字体根底

monospa源码本钱ce (等宽字体):约束每个字符的宽度,让它们抵达一个等宽的作用

相同咱们也能够在代码中进行设置:枸杞

mTv.setTypeface(Typeface.SERIF)

四、fontFamily

fontFamily 恰当所以加强版的 type算法工程师face,它标明 android 体系支撑的一系列字体,每个字体都有一个别号,咱们通过别号枸杞就能设置这种字体,看下它在 TextView 的自定义特征中的源码网站一个表现:

//TextView 的自定义特征 fontFamil源码编辑器y
<attr name="fontFamily" format="string" />

从上述自定义特征中咱们能够知道:枸杞

fontFamily枚举类型 c言语 接收的是一个 String 类型的值,也就是咱们能够通过字体别号设置这种字体,如下图:

Android字体系列 (一):Android字体根底

能够看到,它翔实的区分了每个系宫颈癌前期症状列字体的款式,相同咱们在 xml 中对它进行一个设置:

Android字体系列 (一):Android字体根底
咱们算法剖析的意图是在代码中在对他进行一个设置:

mTv.s字体下载etTypeface(Typeface.create("sans-serif-medium",T枚举类型 c言语ypeface.NORMAL))

值的留心的是:fontFamily 设置的某些字体有兼容性问题,如我上面设置的 sans-serif-medium 字体,它在 Android 体系版别大于等于 21 才会收效,假定小于枚举类型是什么意思 21 ,则会运用默许字体,因而咱们在运用 fontFamily
特征时,需求留心这个问题

到这儿,咱们就把影响 Android 字体的 3 个特征给讲完了,可是我心里有个疑问️ ?假定我这三个特征一同设置,会一同收效吗?

带着这个问题,咱们探究一下源码

五、textStyle,typeface,fontFamily 三者宫颈癌前期症状联络剖析

TextView 在我枚举类型enum们运用它之前需进行一个初工商银行始化,究竟会调用它参数最多的那个结构办法:

public TextView(Context context, @Nullable AttributeGoSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleA枚举类型名的定义ttr, defStyleRes);
//省掉成吨代码.....
//读取设置的特征
readTextAppearance(context, appearance, attributes, false /* styleArray */);
//设置字体
applyTextAppearance(算法的时刻复杂度是指什么attributes);
}
private void applyTextAppearance枚举类型enum(宫颈癌疫苗TextAppearanceAttributes attributes) {
//省掉成吨代码.....
s枚举类型 c言语etTypefaceFromAttrs(attributes.mFontTypeface, attributes.mFontFamily,
attrib源码编辑器编程猫utes.mTypefaceIndex, attributes.mTextStyle, attributes.mFontWeight);
}

上面这条调用链字体辨认扫一扫,首要会读取 TextView 设置的相关特征,我算法剖析的意图是们看下与字体相关的几个:

private void readTextAppearance(Context context, TypedArray appearance,
TextAppeargoogleanceAttributes attributes, boolean styleAr字体大全ray) {
//...
sw源码编辑器编程猫下载itch (ind源码编辑器手机版下载ex) {
case com.android.in枚举类型enum用法ternal.R.styleable.TextAppearance_typeface:
attributes.mTypefaceIndex = appearance.getInt(attr, attributes.mT算法的时刻复杂度取决于yp枸杞efaceIndex);
if (attributes.mTypefaceIndex != -1 &&am算法工程师p; !attributes.mFontFamilyExplicit) {
attributes.mFontFamigooglely = null;
}
break;
case com.android.internal.R.字体大小怎样调styleable.TextAppearance_fontFamily:
if (!context.isRestricted() && context.canLoadUnsafeResources()) {
try {
attributes.mFontTypeface =源码编辑器编程猫下载 appearance.getFont(attr);
} catch (UnsupportedOperationExc字体下载egoogleption | Res算法的五个特性ources.NotFoundException e) {
// Expected if it is not a font re字体辨认source.
}
}
if (attributes.mFo算法工程师和程序员差异ntTypeface == null) {
attributes.mFontFamily = appearance.getString(attr);
}
attribut字体全国es.mFontFamilyExplicit = true;
break;
case com.android.internal.R.s源码编辑器tyleabl枚举类型 javae.TextAppe算法的时刻复杂度取决于arance_textStyle:
attributes.mTextStyle = ap源码码头pearance.getInt(attr宫颈癌, attributes.mTextStyle);
break;
//...
default:
}
}

从上述代码中咱们能够看到:

1、当咱们设置 typeface 特征时,会将对应的特征值赋给 mT字体美化大师ypefaceIndex ,并把 mFontFamily 置为 null

2、公积金当咱们设置 fontFamily源码 特征时,首要会通过 appearance.getFont() 办法去字体规划获取字体文件,Go假定能获取到,则赋值给 mFontTypef枚举类型是什么意思ace,假定获取源码之家不到,则通过 appearance.getString源码编辑器编程猫() 办法取获取其时字体别号并赋值给 mFontFamily

留心:当咱们给 fontFamily 设置了字体一些第三方字体,那么此时 appearance.getFont() 办法就获取不到字体

3、当咱们设置 textStyle 特征时,会将获取的特征值赋给 mTextStyle

上述办法走完了,会调 setTypefaceFromAttrs() 办法,这个办法就是究竟 TextView 设置字体的办法,咱们来解析下这个办法:

private vo算法的时刻复杂度是指什么id s源码编辑器手机版下载etTypefaceFromAttrs(@Nullable Typ字体eface typeface, @Nullable String familyName,
@XMLT宫崎骏ypefaceAttr i龚俊nt typefaceIndex, @Typefac枚举类型中的元素都具有一个整型值e.Style int style,
@IntRange(from = -1, to = FontStyle.枚举类型的用法FONT_WEIGHT_MAX) int weight) {
if (typeface == null && familyName算法的时刻复杂度是指什么 != null) {
/google/ Lookup normal Typeface from system font map.
final Typeface normalTypeface = Typeface.create(familyName, Typeface.NORMAL);
resolveStyle源码之家AndSetTypeface(normalTypeface, style, weight);
} else if (typeface != null) {
resolveSt字体转换器yleAndSetTypeface(typeface, style, weight);
} else {  // both typeface and familyName is null.
switch (typefaceIndex) {
case SA源码本钱NS:
resolveStyleAndSetType字体转换器face(枚举类型定义Typefac字体辨认扫一扫e.SANS_SERIF, style, weight)源码编辑器编程猫;
break;
case SERIF:
resolveStyleAndSetTyp枚举类型enum用法eface(Typeface.SERIF, style, we算法的时刻复杂度取决于ight);
break;
case MONOSPACE:
r枸杞esolveStyleAndSetTypeface(Typeface.MONOSPACE, style, weight);
break;
case DEFAULT_TYPEFACE:
default:
resolveStyleAndSetTypeface(null, style, weight);
break;
}
}
}

上述代码过程:

1、当 typeface 为空枸杞而且 familyName 不为空时,取 familyName 的字宫崎骏

2、当 typeface 不为空而且 familyName 为空时,取 typeface 的字体

3、当 typeface 和 familyName 都为空,则根宫颈癌疫苗据 typefaceIndex 的值取相应的字体

4、typeface ,familyName 和 typefaceIndex 在咱们分源码编辑器手机版下载析的 readTextAppearance 办法会被赋值

5、resolveStyleAndSetTypefce 办法会进行字体和字体款式的设置

6、style 是在 re源码编辑器编程猫adTextAppearance 办法中赋值的,他和设置字体并不冲突

好,现在代码剖析的差不多google了,咱们再来看下上面那个算法规划与剖析疑问?咱们运用假定法来进行推导:

假定在 Xml算法的时刻复杂度是指什么 中, typeface,familyName 和 textStyle 我都设置了,那么依据上面剖析:

1、textStyle 肯定会收效

2、当设置了 typeface 特征,typefaceIndex 会被赋值,一同 familyName 会置为空

3、当设置了 familyName 特征,分情况:1、假定设置的是体系字体,typeface 会被赋值,familyN字体大全ame 仍是算法的时刻复杂度取决于为空。2、假定设置的是第三方字体,typeface 为空,familyName 被赋值

因而,当咱们设置了这个三个特征,typeface 和 f源码码头a公积金milyName 总有一个不会为空字体全国,因而不会走第三个条件体,那么 typeface 设置的特征就不会收效了,而剩余的两个特征都可枚举类型 c言语以收Go

终究对这三个特征做一个总结:

1、fontFamily、typeface 特征用于字体字体设置,枚举类型中的元素都具有一个整型值假定都设置了,优先运用 fontFamily 特征,typeface 特征不会收效

2、textStyle 用于字体款式设置,与字体设置不会发生冲突

上面这段源码剖析或许有点绕,假定有不清楚的当地,欢迎谈论区给我留言源码本钱发问

六、TextView 设置字体特征源码剖析

通过上面源码的剖析,咱们清楚了 fontFamily,typefac枚举类型是什么意思e 和 textStyle 这三者的联络。接下来咱们研讨一下,咱们设置的这些特征是怎样结束这些作用的呢?又到了源码剖析环节,或许会有点字体下载单调,可是假定你能够认真看完,一定会收成许多,干就完了

咱们上面用 Xml 或代码设置的字体特征,究竟都会走到 Tex枚举类型名的定义tView 的 setTypeface 重载办法:

//重载办法一
public void setTypeface(@Nullable Typefa宫颈癌ce tf) {
if (mTextPaint.g字体大小怎样调etTypeface源码年代() != tf) {
//通过算法工程师和程序员差异 mTextPaint 设置字体
mTextPaint.setTypeface(tf);
//字体规划改写重绘
if (mLayout != null) {
nu源码网站llLayouts();
requestLayout();
invalidate();
}
}
}
//重载办法二
public void set算法Typeface(@Nullable Typeface tf, @Typeface.Style int style) {
if (style > 0) {
if (tf == null) {
tf = Typeface.defaultFromStyle(style);
} else {
tf = Typefac枚举类型定义e.create(tf, style);
}字体美化大师
//调用重载办法一,设置字体
setTypefa源码编辑器编程猫ce(tf);
//通过一些算法
int typefaceStyle = tf != null ? tf.getS宫颈癌疫苗tyle() : 0;
int need = st宫颈癌yle & ~typefaceStyle;
//翻开画笔的粗体和斜体
mTextPai字体大小怎样调nt.setFakeBoldText((need & Typeface.BOL源码编辑器D) != 0);
mTextPaint.se源码之家tT算法剖析的意图是extSkewX((need & Typeface.ITALIC) != 0 ? -0.25f : 0);
} else {
mT字体规划extPaint.setFakeBoldText(false);
mTextPaint.setTextSkewX(0);
setTypeface(tf);
}
}

剖析下上述代码:

重载办法一:

TextView 设置字体实践上就是操作 mTextPaint,mTex算法的五个特性tPa枚举类型enum用法int 是 TextPai字体nt 的类政策,承继自 Paint 即画笔,因而咱们设置的字体实工商银行践上会通过调用字体规划画笔的办法来进行制作

重载办法二:

相对于重载办法一,法二多传递了一个 textStyle 参数,首要用来符号粗体和斜体的:

1)、假定设置了 textStyle ,进入第一个条件体,分情况:1、假定传进来的 tf 为 null ,则会依据传入的 style 去获取 Typeface 字体,2、假定不为 null ,则会依据传入的 tf 和 style字体 去获取 Typeface 字体。设置好字体后,接下来还会翻开画笔的粗体和斜字体辨认体设置

2)、假定没有设置 textStyle,则只会设置字体,并把画笔的粗斜体设置置为 false 和 0

从上述剖析咱们能够得知:Text算法View 设置字体和字体款式究竟都是通过画笔来完算法剖析的意图是结的

七、总结

本篇文章首要讲了:

1、源码编辑器编程猫An算法剖析的意图是droid 字体大约的一个介绍

2、关于影响 Androi源码编辑器手机版下载d 字体闪现的三个特征

3、textStyle,typ枚举类型eface,fontFamily 三者的一个联络

4、设置的这三个特征是怎样结束这些作用的字体

或许我宫颈癌前期症状们会问,你上面那个需求还没讲怎样就要完毕了呢?我上面那个需求,以今天所讲的知识或许还结束不了,别着急,关于 Android 字体我预备写个系列,因为内容实在是太多了。这个系列文章不会让咱们等太久,因为在参加 6 月更文应战,预备爆肝 9 篇

好了,本篇文章到这儿就完毕了,假定有任何问题,欢迎给我算法的五个特性留言,咱们谈论区一同讨论

感谢你阅读这篇文章

全文到源码本钱此,原创不易,欢迎点赞,保藏,谈论枚举类型是什么意思和转发,你的认可是我创造的动力

欢迎重视我的 公 众 号,微信查找 sweetying ,文章更新可第一时刻收到