五、说一说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重叠。同时减少不必要的背景绘制。相同的背景可以合并,不会展示的背景可以去掉。