字体 设置与app原生页面字体的不同"/>
webview内 加载网页的字体 设置与app原生页面字体的不同
手机系统本身预置了不少字体,当然包括android原生的 4种。
android 原生控件设置字体可以用代码设置setTypeface ,或者xml 内设置font family 。
这里就需要主要到这两者的区别
差个前提知识,android实际是linux
① Android 系统的字体文件:位于 /system/fonts/ 文件夹下,我们可以到对应的目录下进行查看,可以看出,Android的字体文件都是ttf文件,
② 在/system/etc/目录下有两个字体配置文件,分别是system_fonts.xml 和 fallback_fonts.xml ,当系统需要加载字体时,会优先从 system_fonts.xml 文件开始查找,如果没有找到再进入 fallback_fonts.xml 查找。
而 typeface 是android 类,他会读取这些目录下的字体文件
生成font family name和 相应typeface 对象的映射 存于sSystemFontMap 内。这里可以看到android 原生默认的几种字体。不同手机还会有扩展。
通过反射可以拿到 该map内容
Field sSystemFontMap = null;
try {
sSystemFontMap = Typeface.class.getDeclaredField(“sSystemFontMap”);
sSystemFontMap.setAccessible(true);
Object ss = sSystemFontMap.get(titleText.getTypeface());Map<String, Object> d = Util.change(ss);Log.e("wwww","titleText.getTypeface();"+d.size());} catch (NoSuchFieldException e) {e.printStackTrace();} catch (IllegalAccessException e) {e.printStackTrace();}
public static HashMap<String, Object> change(Object parameter) {
HashMap<String, Object> hashmap = new HashMap<String, Object>();
Class clsHashMapKaTeX parse error: Expected '}', got 'EOF' at end of input: … { clsHashMapNode = Class.forName(“java.util.HashMap$Node”); //通过反射得到hashmap里面内部类node
Field[] fields = parameter.getClass().getDeclaredFields();
for (Field field : fields) {field.setAccessible(true);if (field.getName() == "table") { //遍历属性,当时table属性时候Object[] node = (Object[]) field.get(parameter); //得到table属性值for (Object object : node) { //遍历if (object != null) { //有可能table数组有node为空,因为hash值特性try {iteration(object, clsHashMap$Node,hashmap); //递归} catch (NoSuchFieldException | SecurityException e) {e.printStackTrace();}}}}}} catch (ClassNotFoundException e) {e.printStackTrace();
} catch (IllegalAccessException e) {e.printStackTrace();
}return hashmap;
}
private static void iteration(Object object, Class clsHashMap$Node, HashMap<String, Object> hashmap) throws IllegalArgumentException, IllegalAccessException, NoSuchFieldException, SecurityException {
Field key = clsHashMap$Node.getDeclaredField("key"); //获取node类里面的key属性Field value = clsHashMap$Node.getDeclaredField("value"); //获取node类里面value属性Field next = clsHashMap$Node.getDeclaredField("next"); //获取node类里面next属性key.setAccessible(true);value.setAccessible(true);next.setAccessible(true);//得到三个属性的属性值String strkey = key.get(object).toString();Log.e("wwwww","strkey:"+strkey);Object objValue = value.get(object);Log.e("wwwww","objValue:"+objValue);Object objNext = next.get(object);//判断next是否为空,不为空则递归if(objNext==null){hashmap.put(strkey, objValue);}else{iteration(objNext, clsHashMap$Node, hashmap);}}
打印出来的字符内容。
一般在手机设置内 可以修改手机系统显示的字体,可以购买各种字体加入进去,这时手机的显示就变化了。app内原生的控件 会通过typeface 类加载了设置的默认字体。
但是webview 内的网页却由手机厂家不同 而有些变化有些没有变化。
从我们应用层的角度,webview设置字体的api 有
1、setStandardFontFamily(String font)
设置WebView标准字体库字体,默认字体“sans-serif”。
getSettings.setStandardFontFamily(“sans-serif”);
2、setFixedFontFamily(String font)
设置WebView固定的字体库字体,默认“monospace”。
getSettings.setFixedFontFamily(“monospace”);
3、setSansSerifFontFamily(String font)
设置WebView Sans SeriFontFamily字体库字体,默认“sans-serif”。
getSettings.setSansSerifFontFamily(“sans-serif”);
4、setSerifFontFamily(String font)
设置WebView seri FontFamily字体库字体,默认“sans-serif”。
getSettings.setSansSerifFontFamily(“sans-serif”);
5、setCursiveFontFamily(String font)
设置WebView字体库字体,默认“cursive”
getSettings.setCursiveFontFamily(“cursive”);
6、setFantasyFontFamily(String font)
设置WebView字体库字体,默认“fantasy”。
getSettings.setFantasyFontFamily(“fantasy”);
这里的入参都是font family name。如果想webview 内的网页也随当前系统的设置而变化,我得拿到当前默认的font family name。这就比较麻烦了,应用内都是typeface 对象,而该对象的font family name值也取不到,当前默认typeface是什么 也没有合适的api。如果自己随意设置一个font family name,如果当前系统内没有该字体也会不生效, 所以这里就被卡主了。
如果大家有什么建议能给我留言吗?
更多推荐
webview内 加载网页的字体 设置与app原生页面字体的不同
发布评论