如果我是Android面试官三

五、说一说Android中dp, px, sp的区别

dip:设备独立像素,不同硬件设备有不同效果,与像素无关

dp:同dip一样

px:像素,不同设备显示效果相同

sp:用于字体的设置

看一下源码中的解释

public static float applyDimension(int unit, float value, DisplayMetrics metrics) {

        switch (unit) {

        case COMPLEX_UNIT_PX:

            return value;

        case COMPLEX_UNIT_DIP:

            return value * metrics.density;

        case COMPLEX_UNIT_SP:

            return value * metrics.scaledDensity;

        case COMPLEX_UNIT_PT:

            return value * metrics.xdpi * (1.0f/72);

        case COMPLEX_UNIT_IN:

            return value * metrics.xdpi;

        case COMPLEX_UNIT_MM:

            return value * metrics.xdpi * (1.0f/25.4f);

        }

        return 0;

    }

   该函数功能:是把各单位换算为像素。

   metrics.density:默认值为DENSITY_DEVICE / (float) DENSITY_DEFAULT;

   metrics.scaledDensity:默认值为DENSITY_DEVICE / (float) DENSITY_DEFAULT;

   metrics.xdpi:默认值为DENSITY_DEVICE;

   DENSITY_DEVICE:为屏幕密度

   DENSITY_DEFAULT:默认值为160


像素密度:假设手机屏幕分辨率为240X320,屏幕物理尺寸为1.5英寸X2英寸。每英寸包含像素点数为240/1.5 = 160. 160dpi就是这部手机的像素密度。

android默认low = 120 medium = 160 high = 240 之后还有veryhigh = 320 ,他们对应的dp到px系数分别为0.75,1,1.5和2,这个系数乘以dp就是像素数

sp为与缩放无关抽象像素,sp与dp类似,但是唯一区别在于sp随着系统字体字号大小设置而改变,一般建议文字大小用sp,其它大小用dp


六、include、merge和viewstub区别

include标签主要用于布局的复用,当有些地方需要使用已经定义过的布局时,就可以使用Include标签来加载该布局。值得注意的是,加载布局的根布局的id要与include标签的id一样,否则会导致获取不到根布局。

merge为合并标签。用于减少布局层级,提高性能。当内容布局的父布局与外层布局具有相同属性时,就可以使用merge标签作为内容布局父布局。

viewstub标签。viewstub布局也是用来加载布局的,但是与include不同,viewstub标签本身是不可见的,需要使用viewstub的inflate方法或visible方法加载布局并显示。需要注意的是,viewstub在加载布局后,自身会被移除,原位置由加载布局替换。这也是为什么viewstub的加载只能调用一次,因为之后在调用,就会因为找不到viewstub而报空指针错误。

viewstub使用比较灵活,适用于特定情况下的布局加载,在需要时才加载,从布局和性能上来看,也是一种优化手段。


七、谈一谈过度绘制及其优化

过度绘制:屏幕上的某个像素,在同一帧内被绘制多次,多层重叠的UI结构里,如果不可见的UI也在做绘制操作,会导致某些像素区域被绘制多次,对CPU和GPU资源是一种浪费。

常见的优化方案就是合理设计UI层级与布局,做到减少UI重叠。同时减少不必要的背景绘制。相同的背景可以合并,不会展示的背景可以去掉。


猜你喜欢

转载自blog.csdn.net/Kongou/article/details/80719383