假设有如下分辨率机器:
800 x 480
1024 x 600
1024 x 768
1280 x 800
1920 x 1200
2048 x 1536
总共六种类分辨率机器,如果按照dp为单位来细分可以分为几种呢?
首先通过context.getResources().getDisplayMetrics().density获取到当前机器的屏幕密度,然后通过dp = px/density进行换算可以得到机器对应的以dp为单位的大小。比如,我分别打出了自己手里面设备对应的dp,值如下:
设备px大小 |
设备屏幕密度dpi |
设备dp大小 |
对应的最小宽度 |
800 x 480 |
1 |
800 x 480 |
Sw480dp |
1024 x 600 |
1 |
1024 x 600 |
Sw600dp |
1024 x 768 |
1 |
1024 x 768 |
Sw720dp |
1280 x 800 |
1,另外一台机器是1.5 |
1280 x 800 另外一台是853 x 533 |
Sw720dp 另外一台是Sw480dp |
1920 x 1200 |
1.5 |
1280 x 800 |
Sw720dp |
2048 x 1536 |
2 |
1024 x 768 |
Sw720dp |
表一 设备dp 最小宽度描述表
关于最小宽度的概念可以看下面描述:
屏幕的基本尺寸,是指最短的可用屏幕区域。具体的说,设备的最小宽度是屏幕可用的宽度和高度中最短的那个(也可以把它看做是屏幕的最小可能的宽度)。这样就可以使用这个限定符来确保应用程序至少有<N>dp的宽度可用于UI界面,而不管屏幕的当前方向。
例如,如果布局在任何时候都需要至少600dp的最小屏幕尺寸,那么就能够使用这个限定符,在res/layout-sw600dp/目录中创建布局资源。系统只会在可用屏幕的尺寸至少是600dp的时候才会使用这些资源,而不管600dp是否是被用户认知的高度或宽度。最小宽度是设备的固定屏幕尺寸特征,当屏幕的方向发生改变时,设备的最小宽度不改变。
设备的最小宽度需要考虑屏幕的装饰和系统UI的占用。例如,如果设备有一些固定的UI元素要沿着最小宽度的轴向,占用一定的屏幕空间,那么系统声明的最小宽度要比实际的屏幕尺寸要小,因为被系统占用的像素部分对用户应用程序的UI无效。因此,这个值应该是应用程序布局所需要的最小的实际尺寸(通常,这个值是布局支持的最小宽度,而不管屏幕的当前方向)。
以下是可以使用的通用屏幕尺寸的一些值:1.320,针对以下屏幕配置的设备:
240x320ldpi(QVGA手持设备)
320x480mdpi(手持设备)
480x800hdpi(高分辨率手持设备)
2.480,针对480x800mdpi的屏幕(平板或手持设备)
3.600,针对600x1024mdip的屏幕(7英寸平板)
4.720,针对720x1280mdip的屏幕(10英寸平板)
当应用程序提供了多个带有不同值的最小宽度限定符资源目录时,系统会使用最接近(不超出)设备最小宽度的那个资源。
这个限定符被添加在API级别13中。
还要看android:requiresSmallestWidthDp属性,它声明了与你的应用程序兼容的最小的最小宽度,并且smallestScreenWidthDp配置字段会持有这个设备最小宽度的值。
从表一可以看到,七个设备、六种分辨率对应了三中最小宽度,因此我们适配了这几种不同 最小宽度的情况就可以完成对上面所有机型的适配。怎样根据最小宽度来适配不同机型呢?其实很简单,只需要自定义下面几个文件夹里面的文件就可以了。
res/layout-sw320dp
res/layout-sw480dp
res/layout-sw600dp
res/layout-sw720dp
res/values-sw320dp
res/values-sw480dp
res/values-sw600dp
res/lvalues-sw720dp
举个例子,假如我在做第一款机器的时候,所有的UI尺寸都是以720dp的机器来配置的,那么对应到最小宽度为600dp的机器就应该是所有的尺寸大小除以1.2,对应到最小宽度为480dp的机器就应该是所有的尺寸大小除以1.5,依次类推。
当然,前提是你在布局里面的尺寸都是用dp为单位,字体用sp或者dp为单位。