1:px
像素。一般说一个手机的分辨率为1280*720,意思就是宽度为720像素,高度为1280像素。
但是,安卓的适配不能用这种方式。
比如一个840*360的屏幕和一个1280*720的屏幕,我做了一个180px宽的布局,那么在第一个屏幕上就占据一半的宽度,在第二个屏幕上会只占据1/4的宽度。这样无法达到适配要求。
2:DPI
既然px不能作为适配的单位,所以引入了DPI的概念。(Dots Per Inch)每英寸的点数。
举例:现在规定有两个手机,尺寸一样。都是宽度为2英寸,高度为3.5英寸(瞎举的,高度咋滴都行)
第一个手机的分辨率为:840*360。也就是在2英寸的屏幕上,有360个像素点,那么每英寸的像素点就是180个。
第二个手机的分辨率为:1280*720.也就是在2英寸的屏幕上,有720个像素点,那么每英寸的像素点就是360个。
个数就是DPI
3:dp
然后引入了dp的概念,这个dp和屏幕分辨率就木有关系了,只和DPI有关系
规定是:当dpi为160时,1dp = 1px;
以此类推:当dpi为320时,1dp = 2px;
1dp = dpi/160 px;
那么,用dp来适配,
还是那两个屏幕,840*360的DPI为180,1280*720的DPI为360.现在来做一个宽为80dp的div吧
第一个屏幕:1dp = (180/160)px = 1.125px; 80dp = 90px
第二个屏幕:1dp = (360/160)px = 2.25px; 80dp = 180px;
都是对应屏幕的1/4宽。这样也就达到了适配的目的。
4:density
这个密度的值,其实就是dpi/160的值。
诶?上面说1dp = dpi/160 px.那么,1dp = density px
在安卓中,提供了获取density的方法
getResources().getDisplayMetrics().density
这样,也就实现了dp和px的换算
话说为啥要换算dp和px呢?
因为,xml中既可以用px,也可以用dp
但是java代码中,很多布局相关的单位都是px,比如:
LinearLayout.LayoutParams layoutParams =new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
layoutParams.setMargins(10,20,30,40);
这里的margins的四个参数left,top,right,bottom的单位都是px,得换成dp
网友评论