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,如果当前系统内没有该字体也会不生效, 所以这里就被卡主了。
如果大家有什么建议能给我留言吗?

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值