分辨率适配

Android 屏幕适配:最全面的解决方案

六中通用密度

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, 所以整体的显示比例才会看起来比较正常

九宫格图片的制作,已经不同的黑点代表的意思 todo

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值