Der gültige Wert von Android:fontFamily ist in /system/etc/system_fonts.xml(4.x) oder /system/etc/fonts.xml(5.x) definiert. Der Gerätehersteller kann diesen Wert jedoch ändern, so dass die tatsächlich verwendete Schriftart von der oben erwähnten Datei des angegebenen Geräts abhängt.
In AOSP ist die Schriftart Arial gültig, muss aber mit "arial" und nicht mit "Arial" definiert werden, zum Beispiel Android:fontFamily="arial" . Werfen Sie einen Blick auf Kitkats system_fonts.xml
<family>
<nameset>
<name>sans-serif</name>
<name>arial</name>
<name>helvetica</name>
<name>tahoma</name>
<name>verdana</name>
</nameset>
<fileset>
<file>Roboto-Regular.ttf</file>
<file>Roboto-Bold.ttf</file>
<file>Roboto-Italic.ttf</file>
<file>Roboto-BoldItalic.ttf</file>
</fileset>
</family>
//////////////////////////////////////////////////////////////////////////
Es gibt drei relevante xml-Attribute für die Definition einer "Schriftart" in Layout-- Android:fontFamily , Android:Schriftart y Android:textStyle . Die Kombination von "fontFamily" und "textStyle" oder "typeface" und "textStyle" kann verwendet werden, um das Erscheinungsbild der Schriftart im Text zu ändern, so auch allein verwendet. Codeschnipsel in TextView.java wie diese:
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);
}
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 needed
int 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);
}
}
Aus dem Code können wir sehen:
- wenn "fontFamily" gesetzt ist, wird die "typeface" ignoriert.
- "typeface" hat standardmäßige und begrenzte gültige Werte. Die Werte sind "normal", "sans", "serif" und "monospace", die in system_fonts.xml(4.x) oder fonts.xml(5.x) zu finden sind. Eigentlich sind sowohl "normal" als auch "sans" die Standardschriftart von system.
- Mit "fontFamily" können alle Schriftarten der eingebauten Schriftarten eingestellt werden, während "typeface" nur die typischen Schriftarten "sans-serif", "serif" und "monospace" (die drei Hauptkategorien von Schriftarten in der Welt) bietet.
- Wenn nur "textStyle" gesetzt wird, werden tatsächlich die Standardschriftart und der angegebene Stil eingestellt. Die effektiven Werte sind "normal" "fett" "kursiv" und "fett | kursiv".