Android 和H5 字体大小适配

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" />

    适配方式二:

    通过传递本地的字体大小缩放值,手机的物理分辨率,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;
}




猜你喜欢

转载自blog.csdn.net/MatrixMind/article/details/78987493