多说几句:
之前由于没有仔细研究适配,一直认为android不是有dpi么,只要保证mdpi等等的值设置好且正确就可以做到适配。但是在近期的项目中,需要适配平板和手机。计算了平板和手机,dpi都是属于xhdpi的,但是效果展示相差很大。还再纳闷,不是说dp可以自己根据屏幕大小调整适配么?经过查阅资料发现:在屏幕 尺寸相差不大的情况下,dp可以使不同分辨率的设备上展示效果相似。但是在屏幕尺寸相差比较大的情况下,dp就失去了这种效果。所以需要以下的限定符来约束,采用多套布局,数值等方式来适配。
原文地址:http://blog.csdn.net/wzy_1988/article/details/52932875
写的挺详细的。原作者辛苦了。但是为了方便查阅。我把重要的表格摘录出来了。有不明白的去查看原文。
在安卓3.2之下的适配 限定符
屏幕特性 | 限定符 | 描述 |
---|---|---|
屏幕尺寸 | small | 小屏幕 |
normal | 基准屏幕 | |
large | 大屏幕 | |
xlarge | 超大屏幕 | |
屏幕密度 | ldpi | <=120dpi |
mdpi | <= 160dpi | |
hdpi | <= 240dpi | |
xhdpi | <= 320dpi | |
xxhdpi | <= 480dpi | |
xxhdpi | <= 640dpi(只用来存放icon) | |
nodpi | 与屏幕密度无关的资源.系统不会针对屏幕密度对其中资源进行压缩或者拉伸 | |
tvdpi | 介于mdpi与hdpi之间,特定针对213dpi,专门为电视准备的,手机应用开发不需要关心这个密度值. | |
屏幕方向 | land | 横向 |
port | 纵向 | |
屏幕宽高比 | long | 比标准屏幕宽高比明显的高或者宽的这样屏幕 |
notlong | 和标准屏幕配置一样的屏幕宽高比 |
例如:
res/layout/my_layout.xml // layout for normal screen size ("default")
res/layout-large/my_layout.xml // layout for large screen size
res/layout-xlarge/my_layout.xml // layout for extra-large screen size
res/layout-xlarge-land/my_layout.xml // layout for extra-large in landscape orientation
res/drawable-mdpi/graphic.png // bitmap for medium-density
res/drawable-hdpi/graphic.png // bitmap for high-density
res/drawable-xhdpi/graphic.png // bitmap for extra-high-density
res/drawable-xxhdpi/graphic.png // bitmap for extra-extra-high-density
res/mipmap-mdpi/my_icon.png // launcher icon for medium-density
res/mipmap-hdpi/my_icon.png // launcher icon for high-density
res/mipmap-xhdpi/my_icon.png // launcher icon for extra-high-density
res/mipmap-xxhdpi/my_icon.png // launcher icon for extra-extra-high-density
res/mipmap-xxxhdpi/my_icon.png // launcher icon for extra-extra-extra-high-density
android3.2之后引入的,目前推荐使用的;
屏幕特性 | 限定符 | 描述 |
---|---|---|
最小宽度限定符 | sw<N>dp 例如sw600dp, sw720dp | 屏幕的最小尺寸,就是屏幕可用区域的最小尺寸,是指屏幕可用高度或宽度的最小值(你可以默认是屏幕的最小宽度).你能用这个限定符确保,无论屏幕方向如何,这个限定符修饰下的布局需要的屏幕最小尺寸是Ndp. 例如,如果你的布局在运行时需要的最小屏幕宽度是600dp,则你可以利用这个限定符创建布局资源目录res/layout-sw600dp.只有当屏幕的最小宽度或最小高度是600dp时,系统才会使用这些布局文件或者资源文件.最小屏幕宽度是固定设备的特有屏幕尺寸,当屏幕方向发生变化时,设备的最小宽度值不变. 设备的最小宽度值要考虑屏幕的尺寸和系统UI.例如,如果在屏幕上有一些系统持久化UI元素,则系统的最小宽度值要比实现的屏幕尺寸小一些,因为这些系统的UI元素你的应用是无法使用到的. 当你使用之前的广义限定符是,你可以定义连续的一系列限定符.用最小宽度来决定广义屏幕尺寸是有意义的,是因为宽度是影响你UI设计的关键因素.UI在竖直方向上会经常滚动,但是在水平方向上往往是固定的布局.可见不论是适配手机或者平板,宽度往往都是布局的关键因素.因此,你需要关心你手机上的最小宽度值. |
屏幕可用宽度 | w<N>dp Examples: w720p w1024p | 指定资源使用时需要的最小宽度.当屏幕方向发生变化时,系统会调整这个值,使其始终为你UI显示的宽度. 这个属性经常被用来判断当前是否需要显示多屏布局,因为哪怕用户当前正在使用平板,你也可能不希望用户在平板竖屏时显示多个屏幕的布局样式.这时,你就可以使用这个限定符来标明你布局需要的最小宽度 |
屏幕可用高度 | h<N>dp Examples: h720dp h1024dp etc. | 标明资源使用时需要的最小高度.当屏幕发生旋转时,系统会自动选择当前大的一方作为高度值.大部分应用很少需要这个限定符,因此不做过多讲解 |
在不考虑屏幕方向只关注布局最小空间的前提下,使用sw<N>的方式更加简单.
例如:
res/layout/main_activity.xml #手机布局
res/layout-sw600dp/main_activity.xml #7寸平板布局
res/layout-sw720dp/main_activity.xml #10寸平板布局
再补充一点:
设备宽度的dp计算方法:
dp = 屏幕像素宽度/(屏幕像素密度/160) 160是基准屏幕像素密度 这个用来计算以上的sw后面的数值
通用公式:
dp = px/(dpi/160)
px = dp*(dpi/160)