知識(shí)
不管是網(wǎng)站,軟件還是小程序,都要直接或間接能為您產(chǎn)生價(jià)值,我們?cè)谧非笃湟曈X表現(xiàn)的同時(shí),更側(cè)重于功能的便捷,營(yíng)銷的便利,運(yùn)營(yíng)的高效,讓網(wǎng)站成為營(yíng)銷工具,讓軟件能切實(shí)提升企業(yè)內(nèi)部管理水平和效率。優(yōu)秀的程序?yàn)楹笃谏?jí)提供便捷的支持!
Android5.0system_fonts.xml文件的解析過程
發(fā)表時(shí)間:2020-10-19
發(fā)布人:葵宇科技
瀏覽次數(shù):166
Android 5.0 system_fonts.xml文件的解析過程
起首看看看5.0 中familyset version="22" 的格式
20 <family name="sans-serif">
21 <font weight="100" style="normal">Roboto-Thin.ttf</font>
22 <font weight="100" style="italic">Roboto-ThinItalic.ttf</font>
23 <font weight="300" style="normal">Roboto-Light.ttf</font>
24 <font weight="300" style="italic">Roboto-LightItalic.ttf</font>
25 <font weight="400" style="normal">Roboto-Regular.ttf</font>
26 <font weight="400" style="italic">Roboto-Italic.ttf</font>
27 <font weight="500" style="normal">Roboto-Medium.ttf</font>
28 <font weight="500" style="italic">Roboto-MediumItalic.ttf</font>
29 <font weight="900" style="normal">Roboto-Black.ttf</font>
30 <font weight="900" style="italic">Roboto-BlackItalic.ttf</font>
31 <font weight="700" style="normal">Roboto-Bold.ttf</font>
32 <font weight="700" style="italic">Roboto-BoldItalic.ttf</font>
33 </family>
35 <!-- Note that aliases must come after the fonts they reference. -->
36 <alias name="sans-serif-thin" to="sans-serif" weight="100" />
37 <alias name="sans-serif-light" to="sans-serif" weight="300" />
38 <alias name="sans-serif-medium" to="sans-serif" weight="500" />
39 <alias name="sans-serif-black" to="sans-serif" weight="900" />
40 <alias name="arial" to="sans-serif" />
41 <alias name="helvetica" to="sans-serif" />
42 <alias name="tahoma" to="sans-serif" />
43 <alias name="verdana" to="sans-serif" />
在Typeface.java中靜態(tài)類實(shí)現(xiàn)了對(duì)system_fonts.xml文件的的解析過程
一. system_fonts.xml文件存在設(shè)備的/system/etc/system_fonts.xml 中
二. Typyface文件對(duì)system_fonts.xml文件的解析過程
須要兩個(gè)比較重要的數(shù)據(jù)構(gòu)造:
- Font
public static class Font {
public String fontName; //用于存儲(chǔ)Fontfile的文件地點(diǎn)的Path
public int weight; //新增長(zhǎng)的字段,表示字體大年夜小
public boolean isItalic; //是否為斜體
}
- Family
public static class Family {
public String name; //對(duì)應(yīng)于Family的名字, eg:sans-serif
public List<Font> fonts; //屬于該Family的Font集合
public String lang; //說話屬性
public String variant;
}
再看看system_fonts.xml文件的初始化代碼:
private static void init() {
// Load font config and initialize Minikin state
//以下根據(jù)設(shè)備文件的絕對(duì)路徑(/system/etc/system_fonts.xml緝獲得File對(duì)象,就沒什么好分析的了
File systemFontConfigLocation = getSystemFontConfigLocation();
File configFilename = new File(systemFontConfigLocation, FONTS_CONFIG);
//無關(guān)代碼直接給省去了,直接分析解析代碼(殘剩的代碼后頭再進(jìn)行分析)
try {
FileInputStream fontsIn = new FileInputStream(configFilename); //打開文件,沒什么可以分析的
FontListParser.Config fontConfig = FontListParser.parse(fontsIn);//所有的核心都在這個(gè)parse中進(jìn)行處理的
.....
} catch (RuntimeException e) {
..............
}
}
要想知道parse到底干了什么,直接看源代碼
/* Parse fallback list (no names) */
public static Config parse(InputStream in) throws XmlPullParserException, IOException {
try {
XmlPullParser parser = Xml.newPullParser(); //很明顯這個(gè)是一個(gè)Xml文件解析對(duì)象類,不須要去深究了
parser.setInput(in, null);
parser.nextTag();
return readFamilies(parser); //重點(diǎn)分析這個(gè)函數(shù)
} finally {
in.close();
}
}
parse的在應(yīng)用輸入流創(chuàng)建了Xml解析對(duì)象后,和行工作就轉(zhuǎn)交給readFamilies這個(gè)函數(shù)了
private static Config readFamilies(XmlPullParser parser)
throws XmlPullParserException, IOException {
Config config = new Config(); //設(shè)備文件的所有解析結(jié)不雅都是存儲(chǔ)于這個(gè)變量中
parser.require(XmlPullParser.START_TAG, null, "familyset");
while (parser.next() != XmlPullParser.END_TAG) {
if (parser.getEventType() != XmlPullParser.START_TAG) continue;
//以下兩個(gè)if 前提可知,該解析只對(duì) 'family' 標(biāo)簽和 'alias' 標(biāo)簽里的內(nèi)容進(jìn)行解析
if (parser.getName().equals("family")) {
config.families.add(readFamily(parser));
} else if (parser.getName().equals("alias")) {
config.aliases.add(readAlias(parser));
} else {
skip(parser);
}
}
return config;
}
大年夜膳綾擎代碼可以知道,readFamilies針對(duì)family 和 alias 標(biāo)簽里的內(nèi)容進(jìn)行分析,其他內(nèi)容都進(jìn)行忽視處理,并且處理的結(jié)不雅都保存的Config這個(gè)對(duì)象中
- 對(duì)與family 標(biāo)簽中的內(nèi)容進(jìn)行解析的過程,readFamily函數(shù)的調(diào)用
private static Family readFamily(XmlPullParser parser)
throws XmlPullParserException, IOException {
//family 標(biāo)簽可能有三個(gè)屬性: 分別是name lang variant,所以以下三行完查對(duì)對(duì)應(yīng)屬性的攫取
String name = parser.getAttributeValue(null, "name");
String lang = parser.getAttributeValue(null, "lang");
String variant = parser.getAttributeValue(null, "variant");
/* 1. 以family為父標(biāo)簽,font可認(rèn)為其子標(biāo)簽,font標(biāo)簽描述的是:ttf文件的存儲(chǔ)路徑(path)、文字的大年夜?。╳eight)、
* style等特點(diǎn).
* 2. family可以有多個(gè)font標(biāo)簽,即在同一個(gè)family下的font是屬于同一字體族
*/
List<Font> fonts = new ArrayList<Font>();
//鈣揭捉環(huán)完查對(duì)屬于同一字體族的font屬性:weight , style , fullFilename(絕對(duì)路徑)的攫取
while (parser.next() != XmlPullParser.END_TAG) {
if (parser.getEventType() != XmlPullParser.START_TAG) continue;
String tag = parser.getName();
if (tag.equals("font")) {
String weightStr = parser.getAttributeValue(null, "weight");
//若weight屬性不存在,默認(rèn)為400
int weight = weightStr == null ? 400 : Integer.parseInt(weightStr);
boolean isItalic = "italic".equals(parser.getAttributeValue(null, "style"));
String filename = parser.nextText();
String fullFilename = "/system/fonts/" + filename;
fonts.add(new Font(fullFilename, weight, isItalic));
} else {
skip(parser);
}
}
return new Family(name, fonts, lang, variant);
}
- 對(duì) alias 標(biāo)簽的內(nèi)容的都取,readAlias. alias其實(shí)就是對(duì)family進(jìn)行重定名(alias只能對(duì)已知的family的名字進(jìn)行重定名)
eg : 名字為 sans-serif-thin的family必須在該句前出現(xiàn)
<alias name="sans-serif-thin" to="sans-serif" weight="100" />
private static Alias readAlias(XmlPullParser parser)
throws XmlPullParserException, IOException {
Alias alias = new Alias();
alias.name = parser.getAttributeValue(null, "name");
alias.toName = parser.getAttributeValue(null, "to");
String weightStr = parser.getAttributeValue(null, "weight");
if (weightStr == null) {
alias.weight = 400;
} else {
alias.weight = Integer.parseInt(weightStr);
}
skip(parser); // alias tag is empty, ignore any contents and consume end tag
return alias;
}
就如許,就完成了對(duì)xml文件的解析
相關(guān)案例查看更多
相關(guān)閱讀
- painter
- 云南小程序開發(fā)哪家好
- 小程序開發(fā)
- 網(wǎng)站上首頁(yè)
- 網(wǎng)站建設(shè)價(jià)格
- 昆明小程序開發(fā)
- 服務(wù)器
- 網(wǎng)站建設(shè)電話
- 網(wǎng)站建設(shè)優(yōu)化
- 云南小程序開發(fā)制作公司
- 網(wǎng)絡(luò)公司排名
- 小程序開發(fā)費(fèi)用
- 網(wǎng)站建設(shè)需要多少錢
- 百度人工排名
- 政府網(wǎng)站建設(shè)服務(wù)
- 云南軟件定制
- 網(wǎng)站建設(shè)公司地址
- 云南網(wǎng)站建設(shè)首頁(yè)
- 報(bào)廢車拆解管理系統(tǒng)
- 網(wǎng)站排名
- 云南etc小程序
- 云南網(wǎng)站建設(shè)專家
- 云南網(wǎng)站建設(shè) 網(wǎng)絡(luò)服務(wù)
- 微分銷
- 小程序的開發(fā)公司
- 昆明軟件定制
- 云南網(wǎng)站設(shè)計(jì)
- 昆明網(wǎng)絡(luò)公司
- 開發(fā)微信小程序
- 云南網(wǎng)站建設(shè)招商