1.Android字体
1. 像素:像素(pixel)为图像的基本单位,是一个抽象的采样。一般作为一个最小的显示单位内置RGB。
2.屏幕尺寸:指屏幕的物理尺寸,一般用屏幕的对角线长度表示
3.宽高比例:屏幕物理尺寸的宽高比,传统手机一般是16:9,4:3,但是全面屏的出现打破了这个局面:三星S8,三星 note8,小米mix,LGG6 是 2:1,等都是2:1的手机
4.分辨率:值得是屏幕纵行多少像素点,横行多少像素点,如1920:1080,1440:2560等
5.屏幕密度:分辨率/屏幕尺寸可以反映出手机密度。
6.dpi:Dot per inch, 每英寸像素点,可以反映屏幕清晰度。一般的,计算的方法为对角线像素值/对角线长度(屏幕尺寸)。
7.dip: Density-independent pixel,与密度无关像素,亦称为设备独立像素(Device independent pixel),是一个虚拟的像素的单元,其等价于160dpi屏幕的一个实际物理像素。 这个160dpi值得最开始的手机大小算的值
8.sp:根据屏幕密度和字体的缩放比例算出的值。
对照表参考:http://blog.csdn.net/zhaoyw2008/article/details/46008513
2.H5字体
1.任何浏览器的默认字体高度都是16px,
3.适配方法
适配方案一:
https://stuff.mit.edu/afs/sipb/project/android/docs/guide/webapps/targeting.html
通过对H5页面添加这个设置(只有Android系统自带的webview带这个功能)
<meta name="viewport" content="target-densitydpi=device-dpi, width=device-width"/>
这样设置后h5就可以获取到原生这边对应的字体大小了
适配方式二:
通过传递本地的字体大小缩放值,手机的物理分辨率,DP等传给前端,在通过公式:
deviceParams[2] 是手机的屏幕宽度, deviceParams[1] 是dp
通过公式获取到的数值大小适配和原生界面的字体大小一致
3.获取系统字体缩放值
由于系统并未提供这个api接口。于是采用了反射机制获取了系统这个类的值。
public static float getSystemTextScale() {
float textScale = 1;
// 获取系统字体大小
try {
Configuration mCurConfig = new Configuration();
// 获取ActivityManagerNative类的对象activityManagerNative
Class<?> activityManagerNative = Class.forName("android.app.ActivityManagerNative");
/*
* 获得可调用getConfiguration方法的对象oam(调用 getDefault方法得到的东西)
* getMethod:获取AMN类中的getDefault方法
* invoke:通过activityManagerNative对象调用getDefault方法
*/
Object oam = activityManagerNative.getMethod("getDefault").invoke(activityManagerNative);
// 获取getConfiguration方法并通过oam对象调用,得到config对象
Object config = oam.getClass().getMethod("getConfiguration").invoke(oam);
mCurConfig.updateFrom((Configuration) config);
textScale = mCurConfig.fontScale;
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchMethodException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return textScale;
}