六中通用密度
ldpi(低)~120dpi
mdpi(中)~160dpi
hdpi(高)~240dpi
xhdpi(超高)~320dpi
xxhdpi(超超高)~480dpi
xxxhdpi(超超超高)~640dpi
四种通用尺寸
四种通用尺寸:小、正常、 大 和超大
支持不同屏幕尺寸
- 使用wrap_content和match_parent 使用dp
- 使用尺寸限定符 sw最小宽度限定符,仅在android3.2以上版本支持,res/layout-sw600dp/main.xml res/layout/main.xml
- 使用布局别名
res/layout/main.xml:单窗格布局
res/layout-large/main.xml:多窗格布局(这个文件主要是照顾android3.2之前的版本)
res/layout-sw600dp:多窗格布局
当适配手机与平板时,布局可能不一样(手机显示单窗格,pad显示多窗格),在编写布局时可以命名成不同的布局,可以通过使用配置限定符进行映射,如:
res/layout/layouts.xml
<resources>
<item name="main_layout" type="layout">@layout/onepane_with_bar</item>
</resources>
res/values-sw600dp-land/layouts.xml
<resources>
<item name="main_layout" type="layout">@layout/towpanes</item>
</resources>
res/values-sw600dp-port/layouts.xml:
<resources>
<item name="main_layout" type="layout">@layout/onepane</item>
<bool name="has_two_panes">false</bool>
</resources>
res/values-large-land/layouts.xml:
<resources>
<item name="main_layout" type="layout">@layout/twopanes</item>
<bool name="has_two_panes">true</bool>
</resources>
res/values-large-port/layouts.xml:
<resources>
<item name="main_layout" type="layout">@layout/twopanes_narrow</item>
<bool name="has_two_panes">true</bool>
</resources>
支持不同密度
- 提供不同的资源
- MyProject/
res/
drawable-xhdpi/
awesomeimage.png
drawable-hdpi/
awesomeimage.png
drawable-mdpi/
awesomeimage.png
drawable-ldpi/
awesomeimage.png
xhdpi:2.0
hdpi:1.5
mdpi:1.0(基准)
ldpi:0.75 - 使用分辨率无关计量单位
dp sp wrap_content match_content
概念
- px
480 * 800 啥意思? 就是手机的宽480个像素px,高800px - in
1in = 2.54cm 如4英寸的手机就是手机的对角线 4*2.54 = 10.16cm - dpi(Dots per Inch)
如320*480的手机,宽2in 高3英寸,则每英寸包含的像素点的数量为,横向 320/2 = 160dpi 纵向 480/3 = 160dpi,160就是这部手机的dpi,横向和纵向都是相同的,大部分手机屏幕使用正方形的像素点 - density
density = dp/160 - dp
dp即dip (device independent pixels)设备独立像素,Android特有的单位,在屏幕密度dpi=160的屏幕上 1dp=1px
dpi = 320的屏幕上,1dp=2px 10dp 在160dpi的屏幕上 px = 1(density) * 10 = 10px ,在320dpi的设备上 px = 2 * 10 = 20px
Android Drawable
drawable-ldpi (dpi=120, density=0.75)
drawable-mdpi (dpi=160, density=1)
drawable-hdpi (dpi=240, density=1.5)
drawable-xhdpi (dpi=320, density=2)
drawable-xxhdpi (dpi=480, density=3)
如果不想提各个分辨率的图片怎办?
因为市面上目前大部分最大的分辨率为xhdpi xxhdpi比较少 所以可以只适配xhdpi一套图片
设计资源紧张,只切了iPhone的怎么办?
相信设计师们一般都会用最新的iPhone5(5s和5的尺寸以及分辨率都一样)来做原型设计,而iPhone5的屏幕分辨率为640X1164, 屏幕尺寸为4英寸,根据勾股定理(a^2 + b^2 = c^2)640^2+1164^2=1764496, 然后再对其开根号可求出屏幕对角线的分辨率为:1328,除以4可得出iphone5的dpi:1328/4≈332 ,像素个数/英寸=mdpi ,android的是宽度的像素个数除以宽度的英寸。 可以看出iPhone5的屏幕的dpi约等于320, 刚好属于xhdpi,所以你可以很自豪的像你们的设计师说不用专门为Android端切图,直接把iPhone的那一套切好的图片资源放入drawable-xhdpi文件夹里就ok了。
wrap_content VS dp
例如假设你只在drawable_xhdpi文件夹下放了test图片,xhdpi的设备会去xhdpi文件夹下找到test图片并直接显示,而mdpi的设备优先会去mdpi文件夹里查找test图片,但是没找到,最后在xhdpi文件夹下找到,然后会自动根据density计算并缩放显示出来,实际显示出来的大小是120/2=60px, 所以整体的显示比例才会看起来比较正常