博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android 屏幕适配
阅读量:6721 次
发布时间:2019-06-25

本文共 3828 字,大约阅读时间需要 12 分钟。

定义

使某一元素在Android 不同尺寸,不同分辨率的手机,显示相同的效果

基本概念

屏幕尺寸

含义:手机对角线的物理尺寸

单位:inch(英寸),1英寸=2.45cm

Android常用的尺寸 5寸,5.5寸,6寸1复制代码

屏幕分辨率

含义:屏幕横向纵向上,像素点数的总和

一般描述为屏幕 宽*高=A*B;含义:屏幕在横向方向(宽度)上有A个像素点,在纵向方向(高度)上有B个像素点例子:1080*1920 宽度方向上有1080个像素点,在高度上有1920个像素点123复制代码

单位:px(pixel) 1px=1像素点

ui的设计图都会以px为统一计量单位1复制代码

Android 常见分辨率:320*480,480*800,720*1280,1080*1290

屏幕像素密度

含义:每英寸像素点数

单位:dpi

假设每英寸含有160个像素点,则屏幕像素密度是 160dpi1复制代码

Android 手机对每类手机屏幕大小都有一个相对应的屏幕屏幕像素密度

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

屏幕尺寸,屏幕分辨率,屏幕密度 三者的关系

密度无关像素

含义:dp或dip ,与终端上的实际像素点无关

单位:dp ,可以保证不同像素密度上设备显示相同的效果

Android 开发用dp不用px,是Android特有的单位场景:假如画一条屏幕一般长度的线段,如果用px作为计量单位,在480*800的手机上,需要240px,在320*480的手机上,应设置为160px,二者设置不同,如果用dp为单位,在这里俩种分辨率下,都是160dp1234复制代码

dp与px的转换:

因为ui给的设计图都是给的px为单位,所以我们要吧px转换为dp

密度类型 代表的分辨率(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

在Android 中 以160dpi为基准 1dp=1px

独立比例像素 ##

单位:sp

在Android 开发中用此单位设置文字的大小,可根据字体大小首选项进行缩放推荐使用12sp,14sp,18sp,22sp作为字体设置的大小,不推荐奇数和小数,容易造成精度的丢失,小于12sp会导致文字太小,看不清sp 作为字体大小会根据系统字体大小改变,而dp不会1234复制代码

mdpi、hdpi、xdpi、xxdpi

mdpi、hdpi、xdpi、xxdpi用来修饰Android中的drawable文件夹及values文件夹,用来区分不同像素密度下的图片和dimen值。

那么如何区分呢?Google官方指定按照下列标准进行区分:

名称 像素密度范围
mdpi 120dpi~160dpi
hdpi 160dpi~240dpi
xhdpi 240dpi~320dpi
xxhdpi 320dpi~480dpi
xxxhdpi 480dpi~640dpi

在进行开发的时候,我们需要把合适大小的图片放在合适的文件夹里面。下面以图标设计为例进行介绍。

在设计图标时,对于五种主流的像素密度(MDPI、HDPI、XHDPI、XXHDPI 和 XXXHDPI)应按照 2:3:4:6:8 的比例进行缩放。例如,一个启动图标的尺寸为48x48 dp,这表示在 MDPI 的屏幕上其实际尺寸应为 48x48 px,在 HDPI 的屏幕上其实际大小是 MDPI 的 1.5 倍 (72x72 px),在 XDPI 的屏幕上其实际大小是 MDPI 的 2 倍 (96x96 px),依此类推。

虽然 Android 也支持低像素密度 (LDPI) 的屏幕,但无需为此费神,系统会自动将 HDPI 尺寸的图标缩小到 1/2 进行匹配。

解决方案

支持各种屏幕尺寸

使用wrap_content、match_parent、weight

要确保布局的灵活性并适应各种尺寸的屏幕,应使用 “wrap_content” 和 “match_parent” 控制某些视图组件的宽度和高度。

使用 “wrap_content”,系统就会将视图的宽度或高度设置成所需的最小尺寸以适应视图中的内容,而 “match_parent”(在低于 API 级别 8 的级别中称为 “fill_parent”)则会展开组件以匹配其父视图的尺寸。

如果使用 “wrap_content” 和 “match_parent” 尺寸值而不是硬编码的尺寸,视图就会相应地仅使用自身所需的空间或展开以填满可用空间。此方法可让布局正确适应各种屏幕尺寸和屏幕方向。

weight是线性布局的一个独特的属性,我们可以使用这个属性来按照比例对界面进行分配,完成一些特殊的需求。

使用相对布局,禁用绝对布局

在开发中,我们大部分时候使用的都是线性布局、相对布局和帧布局,绝对布局由于适配性极差,所以极少使用。

由于各种布局的特点不一样,所以不能说哪个布局好用,到底应该使用什么布局只能根据实际需求来确定。我们可以使用 LinearLayout 的嵌套实例并结合 “wrap_content” 和 “match_parent”,以便构建相当复杂的布局。不过,我们无法通过 LinearLayout 精确控制子视图的特殊关系;系统会将 LinearLayout 中的视图直接并排列出。

如果我们需要将子视图排列出各种效果而不是一条直线,通常更合适的解决方法是使用 RelativeLayout,这样就可以根据各组件之间的特殊关系指定布局了。例如,我们可以将某个子视图对齐到屏幕左侧,同时将另一个视图对齐到屏幕右侧。

使用限定符 适配各种屏幕

上面所提到的灵活布局或者是相对布局,可以为我们带来的优势就只有这么多了。虽然这些布局可以拉伸组件内外的空间以适应各种屏幕,但它们不一定能为每种屏幕都提供最佳的用户体验。因此,我们的应用不仅仅只实施灵活布局,还应该应针对各种屏幕配置提供一些备用布局。

如何做到这一点呢?我们可以通过使用配置限定符,在运行时根据当前的设备配置自动选择合适的资源了,例如根据各种屏幕尺寸选择不同的布局。

使用尺寸限定符

res/layout/main.xml,单面板(默认)布局:

12345678910复制代码

res/layout-large/main.xml,双面板布局:

1234567891011121314复制代码

请注意第二种布局名称目录中的 large 限定符。系统会在属于较大屏幕(例如 7 英寸或更大的平板电脑)的设备上选择此布局。系统会在较小的屏幕上选择其他布局(无限定符)。

使用最小宽度限定符

在版本低于 3.2 的 Android 设备上,开发人员遇到的问题之一是“较大”屏幕的尺寸范围,该问题会影响戴尔 Streak、早期的 Galaxy Tab 以及大部分 7 英寸平板电脑。即使这些设备的屏幕属于“较大”的尺寸,但很多应用可能会针对此类别中的各种设备(例如 5 英寸和 7 英寸的设备)显示不同的布局。这就是 Android 3.2 版在引入其他限定符的同时引入“最小宽度”限定符的原因。

最小宽度限定符可让您通过指定某个最小宽度(以 dp 为单位)来定位屏幕。例如,标准 7 英寸平板电脑的最小宽度为 600 dp,因此如果您要在此类屏幕上的用户界面中使用双面板(但在较小的屏幕上只显示列表),您可以使用上文中所述的单面板和双面板这两种布局,但您应使用 sw600dp 指明双面板布局仅适用于最小宽度为 600 dp 的屏幕,而不是使用 large 尺寸限定符。

res/layout/main.xml,单面板(默认)布局:

12345678910复制代码

res/layout-sw600dp/main.xml,双面板布局:

1234567891011121314复制代码

也就是说,对于最小宽度大于等于 600 dp 的设备,系统会选择 layout-sw600dp/main.xml(双面板)布局,否则系统就会选择 layout/main.xml(单面板)布局。

还有很多其他限定符,请自行了解

代码设配

可以通过代码设配布局,比如一个ViewPager我们要他显示屏幕高度的1/3,就可以在代码中适配

ImageView的ScaleType属性

设置不同的ScaleType会得到不同的显示效果,一般情况下,设置为centerCrop能获得较好的适配效果。

转载地址:http://ofnmo.baihongyu.com/

你可能感兴趣的文章
The builder launch configuration could not be found
查看>>
linux 安装软件的地方
查看>>
bond网卡绑定(centos6.5 + centos 7)
查看>>
Leetcode-Letter Combinations of a Phone Number
查看>>
压测 linux + jexus + mono + asp.net mvc
查看>>
成功交付离岸项目
查看>>
[转]ArcGIS 10.1创建切片缓存方法工具总结
查看>>
垃圾回收与内存泄漏
查看>>
旧博客欢迎莅临
查看>>
深度学习原理与框架-卷积网络细节-迁移学习 1.冻结层数,只进行部分层的训练...
查看>>
C# 中的invoke和begininvoke
查看>>
通用类 IPScanner 利用纯真IP数据库(QQWry.dat)查询IP所在地
查看>>
http请求报文结构
查看>>
人不成熟的五个特征
查看>>
HTTP===返回结果的HTTP状态码
查看>>
How to change the computer name on Ubuntu
查看>>
bzoj1093
查看>>
一些题解
查看>>
bzoj2792
查看>>
data encryption
查看>>