Android多分辨率适配总结

来源:互联网 发布:kinyo lolita淘宝店铺 编辑:程序博客网 时间:2024/06/04 18:52

1、屏幕大小

屏幕的实际大小,用屏幕对角线长度来衡量,单位为英寸,1英寸≈2.54CM,这里一定要注意,单位是英寸,而不是寸
案例:


2、屏幕密度DPI

DPI:1英寸长度中,像素点的数量 

假设一寸距离:


xxxhdpi -640dpi:


表示将1寸距离,平分为640个段,那么每段的长度约等于

3.33/640≈0.005cm

常用的dpi有:

ldpi (low) ~120dpi
mdpi (medium) ~160dpi
hdpi (high) ~240dpi
xhdpi (extra-high) ~320dpi
xxhdpi (extra-extra-high) ~480dpi
xxxhdpi (extra-extra-extra-high) ~640dpi


3、像素px

这里需要注意,px是一个相对单位,跟屏幕dpi有关,假如屏幕dpi=160,那么

1px = 1 英寸 / 160 ≈ 0.015cm

同理,dpi=320,那么

1px = 1英寸/320 =0.0079cm

1px = 1 英寸/DPI  相对单位


4、设备独立像素DIP(简称DP)

不同设备有不同的显示效果,这个和设备硬件有关。比较抽象,经过多轮验证,发现在目前google定义里面,dp成了绝对长度:

1dp=1英寸/160 =0.015cm 绝对单位

因此,google推荐使用dp,因为不管是什么样密度的手机,在手机上展示的长度都是相同的;


5、屏幕分辨率

显示分辨率就是屏幕上显示的设备独立像素个数。假设我们说手机分辨率800*400,那么也就是说,手机高度有800个像素点,手机宽度有400个像素点。


综上举例:

华为U9508,分辨率1280*720,屏幕4.5英寸,屏幕密度DPI为320。根据这些公开数据,可以得出:

屏幕4.5英寸 : 屏幕对角线长度  2.54*4.5=11.43 cm

屏幕密度DPI为320  :  每英寸有320个像素点,1px = 2.54 /320 = 0.0079cm

分辨率1280*720 :

屏幕宽度 720px = 720*0.0079=5.688cm 

屏幕高度 1280px = 1280*0.0079 =  10.112cm

1dp=0.015cm 绝对单位

经过测量,以上数据属实。据以上原理,得出广为流程dp <--> px 装换公式

[java] view plaincopy
  1. /** 
  2.  * 根据手机的分辨率从 dp 的单位 转成为 px(像素) 
  3.  */  
  4. public static int dip2px(Context context, float dpValue)  
  5. {  
  6.     final float scale = context.getResources().getDisplayMetrics().density;  
  7.     return (int) (dpValue * scale + 0.5f);//最后的0.5f只是为了四舍五入  
  8. }  
  9.   
  10. /** 
  11.  * 根据手机的分辨率从 px(像素) 的单位 转成为 dp 
  12.  */  
  13. public static int px2dip(Context context, float pxValue)  
  14. {  
  15.     final float scale = context.getResources().getDisplayMetrics().density;  
  16.     return (int) (pxValue / scale + 0.5f);//最后的0.5f只是为了四舍五入  
  17. }  


6、屏幕坐标

在开发中经常会设置屏幕坐标点,那么问题来了,屏幕坐标的单位是什么?px 还是 dp?

简单想一下,在获取屏幕高度和宽度时候,获取的结果都是屏幕分辨率,那么说明屏幕坐标的单位就是屏幕分辨率的单位,因此是px-像素点。

举例:

[java] view plaincopy
  1. <Button  
  2.         android:id="@+id/test1"  
  3.         android:text="拉取升级信息"  
  4.         android:layout_width="100dp"  
  5.         android:layout_height="100dp"/>  
 获取这个view的高度和宽度,在DPI为320时,获取到的值为200,说明屏幕坐标指的就是屏幕像素点。


7、各种drawable的差别

首先,常用drawable有ldpi 、mdpi 、hdpi 等等,在不同DPI的手机会优先使用对应drawable下的资源文件,对应关系如下: 

                                                                   

那么问题来了,同一张图片放在不同的drawable下面,究竟会有什么不同?做个实验,将一张46*43的PNG图片放在不同的drawable下面,展示出来看看有什么不同,布局文件如下:

[html] view plaincopy
  1. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  2.                 xmlns:tools="http://schemas.android.com/tools"  
  3.                 android:layout_width="match_parent"  
  4.                 android:layout_height="match_parent">  
  5.     <!-- test_ldpi -->  
  6.     <ImageView  
  7.         android:id="@+id/test_ldpi"  
  8.         android:layout_width="wrap_content"  
  9.         android:layout_height="wrap_content"  
  10.         android:layout_gravity="center"  
  11.         android:src="@drawable/icon_drawable_ldpi"  
  12.         android:background="@color/gray"  
  13.         android:layout_marginTop="8dp"/>  
  14.   
  15.     <!-- test_drawable -->  
  16.     <ImageView  
  17.         android:id="@+id/icon_drawable"  
  18.         android:layout_width="wrap_content"  
  19.         android:layout_height="wrap_content"  
  20.         android:layout_gravity="center"  
  21.         android:src="@drawable/icon_drawable"  
  22.         android:background="@color/gray"  
  23.         android:layout_below="@id/test_ldpi"  
  24.         android:layout_marginTop="8dp"/>  
  25.   
  26.     <!-- test_mdpi -->  
  27.     <ImageView  
  28.         android:id="@+id/test_drawable_mdpi"  
  29.         android:layout_width="wrap_content"  
  30.         android:layout_height="wrap_content"  
  31.         android:layout_gravity="center"  
  32.         android:src="@drawable/icon_drawable_mdpi"  
  33.         android:background="@color/gray"  
  34.         android:layout_below="@id/icon_drawable"  
  35.         android:layout_marginTop="8dp"/>  
  36.   
  37.     <!-- test_hdpi -->  
  38.     <ImageView  
  39.         android:id="@+id/test_drawable_hdpi"  
  40.         android:layout_width="wrap_content"  
  41.         android:layout_height="wrap_content"  
  42.         android:layout_gravity="center"  
  43.         android:src="@drawable/icon_drawable_hdpi"  
  44.         android:background="@color/gray"  
  45.         android:layout_below="@id/test_drawable_mdpi"  
  46.         android:layout_marginTop="8dp"/>  
  47. </RelativeLayout>  
程序运行截图:

同一张图片,在不同目录下大小是不同的,那么我们在使用wrap_content就要注意了,不要因为放错PNG文件而导致展示效果不理想。

经过验证,一个图片在不同drawable下面,展示长度遵循以下公式:

图片实际展示的宽(高)(单位dp)=图片分辨率宽(高) * 160 / 当前drawable下对应的dpi

测试图片的高度为46,手机dpi为320,带入计算,在不同drawable下展示高度为:

drawable-ldpi :   46*160/120 = 61 dp

drawable :   46*160/160 = 46 dp

drawable-mdpi :   46*160/320= 46 dp

drawable-hdpi :   46*160/320 = 23 dp

主要,单位是dp,实际展示的时候会根据上面的公式换算成px

根据google的建议,不同尺寸放不同分辨率图片:

  • 36x36适合于低密度
  • 48x48适合于中等密度
  • 72x72适合于高密度
  • 96x96适合于超高密度

最后注意一句:drawable-nodpi下的资源,根据资源的实际像素值展示,不进行任何换算,例如46*43图片,实际展示的时候就是46px*43px,至于是多少dp,看上面的结论。


8、各种layout的差别

需要判断注意的是,对于layout、layout-800x480、layout-v16等等目录,符合什么条件才会使用不同目录下的布局文件,整理如下:

目录名称使用场景layout默认使用该目录下的布局layout-land横屏情况下使用layout-port竖屏情况下使用layout-[dpi]-[high x width]dpi:ldpi、mdpi、hdpi等
high x width:例如layout-hdpi-800x480表示
当屏幕满足dpi=hdip、分辨率800x480条件时候,使用指定目录下的布局文件
layout-800x480表示:分辨率800x480,不考虑dpi
layout-v[api lever]例如:layout-v16表示只在api level=16(Android 4.1)
的手机上展示的布局文件。需要注意,有对应layout-[dpi]-[high x width]满足条件的,优先使用layout-[dpi]-[high x width]下的布局,没有才会使用layout-v[api lever]下的布局


9、各种values的差别

values目录就一句话,所有规则同layout
0 0
原创粉丝点击