关于Android UI适配相关的一些总结学习

  • 1、px、dp、dpi、屏幕尺寸、sp分别都是什么
  • 2、px、dp、dpi、屏幕尺寸、sp他们之间有什么关系
  • 3、160dpi是怎么来的,为什么是160
  • 4、为什么Android系统原生的方案不完美?
  • 4、具体适配方案推荐


1、px、dp、dpi、屏幕尺寸、sp分别都是什么

  1. px就是分辨率。分辨率就是手机屏幕的像素点数。一般为屏幕的“宽×高”,例如分辨率有720×1280的手机设备,表示此屏幕在宽度方向有720个像素点,在高度方向有1280个像素点。
  2. dp 即dip,密度无关像素。 定义如下:
    Density-independent pixel (dp)独立像素密度。标准是160dip.即1dp对应1个pixel,计算公式如:px = dp * (dpi / 160),屏幕密度越大,1dp对应 的像素点越多。上面的公式中有个dpi,dpi为DPI是Dots Per Inch(每英寸所打印的点数),也就是当设备的dpi为160的时候1px=1dp;
    dp等于物理定长
    1dp=(1/160*)(inch)=(2.54/160)(cm)。在任何设备上都是定长,除非设备参数被厂商修改。
  3. dpi dots per inch(每英寸像素点数),即每英寸上有多少个像素,也就是屏幕像素密度。假设设备内每英寸有160个像素,那么该设备的屏幕像素密度=160dpi
    总之一句话, dp能够让同一数值在不同的分辨率展示出大致相同的尺寸大小
  4. 屏幕尺寸指的是手机对角线的长度,5.5寸指的就是对角线的长度是5.5inch。1英寸=2.54cm
  5. sp即字体的单位,和dp差不多,区别是如果字体使用的sp为单位,那如果你手机字体调大了,那你app的字体会随之变大,如果用dp则不会变化。
- Android开发时用此单位设置文字大小,可根据字体大小首选项进行缩放
- 推荐使用12sp、14sp、18sp、22sp作为字体设置的大小,不推荐使用奇数和小数,容易造成
精度的丢失问题;小于12sp的字体会太小导致用户看不清

2、px、dp、dpi、屏幕尺寸、sp他们之间有什么关系

  1. 先看两个公式:
  2. 根据手机分辨率求 dpi:
以5.5寸1920 * 1080的手机为例:
5.5寸是指手机对角线的长度,分辨率是1920 * 1080,也就是知道长像素是1920,宽像素是1080,
那么对角线多长呢,其实就是求斜边的长度: 1920^2+1080^2=2202^2
所以 dpi=2202/5.5=400

由此得出一个结论:相同尺寸的手机,分辨率越高,dpi越高。手机分辨率相同,屏幕尺寸(对角线英寸数)越小,dpi越高

  1. dp与px之间的关系,px = dp(dpi/160),这个不难理解,如果一个20dp的Button,在dpi为480的设备占的像素值就是20(480/160)=60px,这个有一点要注意,px的计算完全依照dpi这个参数,而不同尺寸和分辨率的机型的dpi可能相同,这就会造成显示差异。
六种通用的密度:
		ldpi(低)~120dpi
		mdpi(中)~160dpi
		hdpi(高)~240dpi
		xhdpi(超高)~320dpi
		xxhdpi(超超高)~480dpi
		xxxhdpi(超超超高)~640dpi
	
	如上表所示,现在我们在mdpi下设计了一个48x48的应用图标,那么在ldip下大小缩小0.75倍为36x36,
	在hdip下放大1.5倍为72x72,在xhdpi下放大2倍为96x96,在xxhdpi下放大3倍为144x144,在xxxhdpi下
	放大4倍为192x192.
	
	android对于不同dpi设备提供了5个目录存放图片,使开发人员根据实际需要对图片适配。一般情况需要
	UI根据一种DPI密度、或分辨率的设备设计UI,根据不同dpi的比例出图,一般需要xhdpi、xxhdpi两套图,
	即2x、3x图。

3、160dpi是怎么来的,为什么是160

其实这个问题没有找到标准答案,但是只要记住,Android是以160dpi为基准就行了。
  1. 在Google官方文档的解释中,因为第一款Android设备(HTC的T-Mobile G1)是属于160dpi的。
    其实选择160dpi作为基准,也是为了更好的适配。 Android Design [1] 里把主流设备的 dpi 归成了四个档次,120 dpi、160 dpi、240 dpi、320 dpi,比例是 2:1.5:1:0.75。
    如果以160dpi为基准的话,只要尺寸的 DP 是 4 的倍数,XHDPI 下乘以 2,HDPI 下乘以 1.5,LDPI 下乘以 0.75 即可满足所有尺寸下都是整数像素。
    160dpi 为基准比较方便换算。但是仔细想的话,这个理由其实不成立。因为其他几个dpi本来就是根据基准定出来的。比如用240dpi作为基准,你可以改为360dpi(1.5)、240dpi、180dpi(0.75)、120dpi(0.5)。
    第一款机型是160dpi。这看上去是比较靠谱的原因。但其实如@郑旺所说,第一款机型G1实际上是180dpi的。个人的猜测是因为iphone是160dpi的

4、为什么Android系统原生的方案不完美?

Android的dp单位只是谷歌的UI适配算法,但是对于目前市面上各种Android尺寸的设备,

我们来举个栗子,比如现在有两个手机,分辨率都是1080(px)×1920(px),手机1的屏幕大小为5寸,手机2的屏幕大小是6寸,我这里有个控件,它在相对布局下,现在布局中有个控件宽高均为100dp:

那么对于手机1而言,它每dp占2.75px,也就说,最终这个控件在手机1上显示的最终的宽高为275×275
对于手机2而言,它每dp约占2.3px,也就是说最终这个控件的最终宽高为230×230
可以看出差别竟然相差了40多个像素点,也许你觉得没什么区别。那么我们为控件换个长宽,将宽高设置为400dp:

对于手机1而言,可以计算出,它最终的宽高为1100×1100,很明显宽已经超过了1080,所以它宽度会占满横屏,也就是它的最终宽高为1080×1100。
对于手机2而言,可以计算出,它的最终宽高为920×920
很明显在手机2上这个控件的宽并没有占满横屏,所以手机2和手机1之间出现了很明显的差异。