AndroidandroidAndroid 开发技术分享

Android-屏幕适配解决方案总结

2018-04-09  本文已影响276人  南北VS东西
Android 屏幕适配总结.png

为什么要进行Android屏幕适配

定义 & 本质

Android屏幕适配中一些用到的相关概念

屏幕尺寸
屏幕分辨率

UI设计师的设计图会以px作为统一的计量单位

dp : device independent pixels
dpi(Dots Per Inch) 屏幕像素密度

例如某设备一英寸内有480像素点,那么这个设备的屏幕像素密度就是480dpi

密度类型 代表的分辨率(px) 屏幕像素密度(dpi)
低密度(ldpi) 240x320 120
中密度(mdpi) 320x480 160
高密度(hdpi) 480x800 240
超高密度(xhdpi) 720x1280 320
超超高密度(xxhdpi) 1080x1920 480

屏幕尺寸、分辨率、像素密度三者关系

UI设计都是用px来进行标注的,Android 开发的时候用的是pd作为计量单位,所以这其中需要进行转换。
在Android中,规定以160dpi(即屏幕分辨率为320x480)为基准:1dp=1px

密度类型 代表的分辨率(px) 屏幕像素密度(dpi) 换算(px/dp) 比例
低密度(ldpi) 240x320 120 1dp=0.75px 3
中密度(mdpi) 320x480 160 1dp=1px 4
高密度(hdpi) 480x800 240 1dp=1.5px 6
超高密度(xhdpi) 720x1280 320 1dp=2px 8
超超高密度(xxhdpi) 1080x1920 480 1dp=3px 12
sp (scale-independent pixel)独立比例像素

用布局进行屏幕适配

让布局元素自适应屏幕
根据设备屏幕的大小自动加载相应布局文件
1、尺寸(size)限定符 适用于3.2之前的版本
  • 通过配置限定符使得程序在运行时根据当前设备的配置(屏幕尺寸)自动加载合适的布局资源
2、最小宽度(Smallest-width:缩写 sw***dp)限定符 适用于 3.2版本以及后面的版本
通过指定某个最小宽度(以 dp 为单位)来精确定位屏幕从而加载不同的UI资源
  • sw xxxdp,即small width的缩写,其不区分方向,即无论是宽度还是高度,只要大于 xxxdp,就采用次此布局
  • 例子:使用了layout-sw 600dp的最小宽度限定符,即无论是宽度还是高度,只要大于600dp,就采用layout-sw 600dp目录下的布局
这中间会有文件名重复的问题,为了解决这种问题考虑用 布局别名
  • 适配手机的单面板(默认)布局:res/layout/main.xml
  • 适配尺寸>7寸平板的双面板布局:res/layout/main_twopanes.xml
  • 然后加入以下两个文件,以便进行Android 3.2前和Android 3.2后的版本双面板布局适配:
  • 1、res/values-large/layout.xml(Android 3.2之前的双面板布局)
<resources>
 <item name="main" type="layout">@layout/main_twopanes</item>
</resources>
  • 2、res/values-sw600dp/layout.xml(Android 3.2及之后的双面板布局)
<resources>
<item name="main" type="layout">@layout/main_twopanes</item>
</resources>

注:

最后两个文件有着相同的内容,但是它们并没有真正去定义布局,它们仅仅只是将main设置成了@layout/main_twopa> nes的别名
由于这些文件包含 large 和 sw600dp 选择器,因此,系统会将此文件匹配到不同版本的>7寸平板上:
a. 版本低于 3.2 的平板会匹配 large的文件
b. 版本高于 3.2 的平板会匹配 sw600dp的文件

屏幕特征 限定符 描述
大小 samall 提供给小屏幕适配的资源(小于3英寸)
大小 normal 提供给中等屏幕设备的资源小于4英寸左右
大小 large 提供给大屏幕设备的资源4英寸-7英寸
大小 xlarge 提供给超大屏幕设备的资源(7-10英寸
分辨率 ldpi 低分辨率设备(120dpi一下)
分辨率 mdpi 中等(120dpi一160dpi)
分辨率 hdpi 高(160dpi一240dpi)
分辨率 hdpi 高(160dpi一240dpi)
分辨率 xhdpi 超高(240dpi一320dpi)
分辨率 xxhdpi 超超高(320dpi一480dpi)
分辨率 xxxhdpi 超超超高480dpi以上,一般都是640dpi
方向 land 横屏
方向 port 竖屏
分辨率 sw***dp 大于*宽度加载此资源
3、屏幕方向(Orientation)限定符
  • 小屏幕, 竖屏: 单面板
  • 小屏幕, 横屏: 单面板
  • 7 英寸平板电脑,纵向:单面板,带操作栏
  • 7 英寸平板电脑,横向:双面板,宽,带操作栏
  • 10 英寸平板电脑,纵向:双面板,窄,带操作栏
  • 10 英寸平板电脑,横向:双面板,宽,带操作栏
  • 电视,横向:双面板,宽,带操作栏

类似上面这些多样化的屏幕适配应该怎样做呢

定义在 res/layout/ 目录下的某个 XML 文件中

使用布局别名进行匹配

用布局组件进行适配 (就是使得布局中的组件根据屏幕可以自适应大小)

  • "wrap_content"
    相应视图的宽和高就会被设定成所需的最小尺寸以适应视图中的内容
  • "match_parent"(在Android API 8之前叫作"fill_parent")
    视图的宽和高延伸至充满整个父布局
  • "weight"
    1.定义:是线性布局(Linelayout)的一个独特比例分配属性
    2.作用:使用此属性设置权重,然后按照比例对界面进行空间的分配,公式计算是:控件宽度=控件设置宽度+剩余空间所占百分比宽幅
    具体可以参考这篇文章,讲解得非常详细

图片资源 进行屏幕适配

1.必须要使用.9.png后缀名,因为系统就是根据这个来区别nine-patch图片和普通的PNG图片的;
2.当你需要在一个控件中使用nine-patch图片时,如
android:background="@drawable/button"系统就会根据控件的大小自动地拉伸你想要拉伸的部分

用户界面流程 进行屏幕适配

只要就是根据用户当时的屏幕设置进行适配,横竖屏切换,或者“单面板”模式还是“双面板”模式

屏幕密度适配

布局控件 适配

屏幕宽度和像素密度没有任何关联关系
介绍一种百分比适配屏幕的方法,类似web前端的 来自鸿阳大神的Android屏幕适配方案

图片资源 适配

更好地方案解决“图片资源”适配问题

上一篇下一篇

猜你喜欢

热点阅读