android尺寸问题(转)
最近公司做的项目中涉及到屏幕自适应的问题。由于做的是电视版的项目,因此屏幕自适应问题更为突出。想起之前曾经写过一篇这样的文章作为备忘。今天特意在电脑上翻了一下,把它找了出来,顺便也把当时参考过的文章给找了出来。这里分享给大家,希望对大家有所帮助,有错误的地方还忘各位指正。
参考的文章地址如下,在此对两位作者表示感谢。
http://blog.csdn.net/beihai1212/article/details/7026327
http://blog.csdn.net/moruite/article/details/6028547
首先我们了解一下屏幕分辨率,像素密度,drawable和layout的匹配规则等问题,然后会给出屏幕自适应的解决方案(官方文档上也有)。
1、基本概念
in:即英寸,它表示的是屏幕的物理尺寸。1in = 2.54cm,而且我们平时所说的尺寸是指可视屏幕的对角线的长度,并不是屏幕面积。因此,比如我们说一个手机是3.2英尺,也就 是说,它的可视区域的对角线的长度是:3.2*2.54 = 8.128cm。
分辨率:它指的是屏幕垂直方向和水平方向的像素个数。比如分辨率是:480*320,也就是说: 水平方向(宽)有320个像素点。竖直方向(高)有480个像素点。
dpi:像素密度,即dots per inch,指的是每英寸的像素数。如160dpi指手机水平或垂直方向 上每英寸距离有160个像素点。假定设备分辨率为320*240,屏幕长2英寸宽1.5英 寸,dpi=320/2=240/1.5=160。Android中主要有三种像素密度:120,160,240。它就是 DisplayMetrics类中属性densityDpi的值。
density:密度,指每平方英寸中的像素数。计算方式:density=分辨率/屏幕尺寸。在android中,160dpi的密度为1.0,120dpi的密度为0.75,240dpi的密度为1.5。它就是 DisplayMetrics类中属性density的值。
px:即pixel,像素。它在不同设备上的显示效果相同。这里的“相同”指的是像素不会变。第一个问题:比如一个button的宽是100px,那么无论是在120,160,还是240像素密度 的设备上,它的宽都应该显示100px。,比如我们有三个480x320的手机,它的dpi 分 别为:120,160,180。那么此时,如果它在160dpi的手机上显示3厘米,在120dpi的 手机上就会显示(4/3)*3厘米,就比160dpi上显示的要大了,同理,在240dpi上显示的 按钮看起来就更窄了。而这里我们的手机是一样大的,这就出现了不适应屏幕的问题。
这就是我们不推荐不使用px的原因之一,因为px与手机的像素密度有直接的关系。
第二个问题:比如我们有三个手机,它的dpi都为120,而屏幕尺寸分别为【宽度为更 小的那个值】:320*240,480*320,640*480。我们需要在屏幕的第一行放一个按 钮,让它 占满屏幕。设计的时候,我们在480*320的手机上设置好了大小,比如为180px,当把 这个程序运行在320*240的手机上时,而明显,这个按钮是显示不全的,而在640*480 的手机上它又是占不满的。这就是我们不推荐不使用px的原因之二,因为px与手机的屏幕有直接的关系。
由于有上面的问题,android中我们一般就推荐使用dip,而不使用px。
dp:dp是dip的缩写,它是device-independent pixel,即设备独立像素。它是一个与像素密 度和屏幕尺寸都无关的单位。在不同的屏幕上有不同的显示效果。它与像素px的换算 公式为:px = (像素密度/160)*dp。
上面已经说过,android中常用的像素密度有120,160,240。那么在160dpi的设备上, 1px=1dp。
解决第一个问题:还是三个480x320的手机,它的dpi 分别为:120,160,180。我们将 一个按钮的宽度设置为:100dp。根据上面的换算单位,它在160dpi的手机上显示的像 素为100px,即上面的3cm。那么在120dpi的手机上它显示的像素就为(3/4)*100px,换 算成厘米为:(4/3)*(3/4),还是相当于在160dpi上的显示宽度,即3cm。同理可得到在 240dpi的设备上,它的显示宽度也为3厘米。
sp:放大像素,即ScaledPixels。它主要用于字体的显示,他会根据像素密度来放大或者缩 写字体。
2、android中的drawable和layout。
对于API 1.6及以上版本的应用程序中,可以使用drawable,drawable-hdpi,drawable-ldpi,drawable-mdpi,drawable-xdpi的文件夹来在不同的像素密度下使用的图片。使用layout-small,layout-normal,layout-large,layout-xlarge来存放不同屏幕尺寸下使用的布局文件。其在android应用程序中所对应的实际设备的转换关系如下图:

Android系统对drawable,drawable-hdpi,drawable-ldpi,drawable-mdpi,drawable-xdpi中存放的图片进行选择的规则是:先去匹配此密度下对应的图片资源,如果没有,就去使用drawable目录下的图片资源。比如,有一个设备像素密度是240dpi,那么此时它将优先使用drawable-hdpi目录下的图片资源,但是如果drawable-hdpi目录不存在,它就会去使用drawable目录下的资源文件。
在android中除了使用上面的五种布局外,还可以使用layout-axb和layout-swadp的方式来存放布局文件。比如layout-480x360和layout-sw600dp。经过测试,总结出如下的匹配规则:
假设在某个应用程序中存在如下的布局文件:
Layout-xlarge,layout-large,layout-normal,layout-small,layout,layout-sw500dp,layout-1280x800,layout-1280x888,layout-1280x750,layout-sw1280dp,layout-sw1dp。
对于所有版本的API(2.2,3.0,3.2,4.0测试均是如下结果):
A、首先去匹配layout-xlarge,接着是layout-large,然后是layout-normal,最后是layout-small。上述中的任一一个可以匹配成功,布局文件就匹配成功。
B、如果匹配未成功,就会去找layout-swadp这个文件,如果可以找到adp能比屏幕宽度小的,就匹配成功。即使你的屏幕是:1280x800,如果layout中有layout-sw1dp,且第一个条件未被匹配,而layout-swadp又只有这一个,那么此时,不管其他还有什么布局文件,layout-sw1dp都会去匹配,即使你的布局文件中有layout-1280x800。
C、如果上面两中情况都未匹配到,此时就要分版本来匹配layout-axb文件了:
3.2以前的版本:
只有当layout-axb完全匹配时,才去使用这个布局文件,否则使用layout。也就是说,我的屏幕是1280x800,api版本是1.6-3.0,那么此时如果布局文件中有layout-1280x750而没有layou-1280x800,也就说不能完全匹配,那么系统会选用layout这个布局文件来进行匹配。
3.2以后的版本:
如果layout-axb能完全匹配,就使用这个布局文件,如果不能匹配,就去找a和b都要比它的屏幕小,并且最接近的那个布局文件。但是前提条件是:如果是大屏幕,你给的布局文件尺寸比normal的大,如果是小屏幕,你给的布局文件比normal的小。
3、屏幕自适应解决方法
A、使用wrap-content和match-parent(api2.2之前使用fill-parent),即宽高根据内容调整以及伸展至父控件一致。而不是硬编码写死控件的大小。
B、使用相对布局(RelativeLayout)
使用相对的布局方式来进行控件的摆放,这种方式灵活性大,但是也相对复杂。
C、使用FrameLayout,即帧布局可以在一定程度上消除屏幕尺寸带来的问题。
D、使用layout-xlarge,layout-large,layout-small这种方式来建立多个布局文件。使用这种方式可以仅用四个布局文件就匹配所有高于1.6版本的应用。并且效果比只用一个layout要好很多。
E、使用最小宽度标识符,也就是layout-swaaaadp的方式。官方在3.2的新特性中特别申明了如下四种方式用于使用3.2版本的平板建议使用的布局方式,如下:
res/layout-sw600dp/main_activity.xml // 7英寸平板
res/layout-sw720dp/main_activity.xml //10英寸平板
res/layout-w600dp/main_activity.xml //根据宽度自适应
res/layout-sw600dp-w720dp/main_activity.xml //超宽的布局
F、使用layout-axb这种方式来进行屏幕自适应。
由于在3.2版本之前只有当layout-axb完全匹配时,才会去使用这个布局文件,但是在3.2以后可以最接近匹配,所有在电视版中可以使用这种方式进行布局。
G、一些重要的图片,比如logo,主页面的那些图片可以使用9.png图片,因为这种图片拉伸后不会出现很严重的失真,所以显示效果会相比于普通的png图片要好。
9.png图片的更多信息可以看这里:http://www.himigame.com/android-game/321.html
H、使用drawable-hdpi,drawable-mdpi这种方式来定义不同的图片,可以帮助我们适应不同的屏幕密度。使用dp和sp可以帮助我们更好的进行布局
android尺寸问题(转)的更多相关文章
- Android 尺寸单位转换和屏幕适配相关
Android 尺寸单位转换和屏幕适配相关 各种尺寸单位的意义 dp: Density-independent Pixels 一个抽象的单元,基于屏幕的物理密度. (dp和dip的意义相同,所以不用区 ...
- Android尺寸单位
px:pixels(像素),1px的长度对应屏幕一个像素点的大小. dp/dip:(density-independent pixels,设备无关像素) sp:scaled pixels(可缩放像素) ...
- Android 尺寸 神图
- Android尺寸适配问题
1, 布局与组件大小用dp,文字大小用sp 2,
- [置顶]
xamarin android 布局尺寸了解
为了使UI界面在不同大小的移动端显示器上能够正常显示,大家可能都知道使用sp作为字体大小的单位,dp作为其他元素长度的单位. 前几天看了一篇文章关于 App设计规范的,文章用心写的非常好,这里是链接 ...
- Android 资源(resource详解(转)
本文介绍在Android开发中关于资源文件的存储操作.对于Android资源也是非常重要的,主要包括文本字符串(strings).颜色(colors).数组(arrays).动画(anim).布局(l ...
- Android 图形总结
1.9patch图 2.按钮自定义 <?xml version="1.0" encoding="utf-8"?> <shape xmlns:a ...
- android设计,图标等概述
作者:郦橙 锦妖 链接:https://www.zhihu.com/question/36813390/answer/87029428 著作权归作者所有,转载请联系作者获得授权. 简单复制,用于记录, ...
- Android常用五种布局
1. FrameLayout(框架布局) 这个布局可以看成是墙脚堆东西,有一个四方的矩形的左上角墙脚,我们放了第一个东西,要再放一个,那就在放在原来放的位置的上面,这样依次的放,会盖住原来的东西.这个 ...
随机推荐
- linux的PS进程和作业管理(进程调度,杀死进程和进程故障-僵尸进程-内存泄漏)
Ps进程和作业管理 1.查看进程ps 1.格式 ps ---查看当前终端下的进程 3种格式: SYSV格式 带 - 符号 BSD格式 不带 - 符号 GNU格式 长选项 2.ps -a ...
- 第二次作业:卷积神经网络 part 1
第二次作业:卷积神经网络 part 1 视频学习 数学基础 受结构限制严重,生成式模型效果往往不如判别式模型. RBM:数学上很漂亮,且有统计物理学支撑,但主流深度学习平台不支持RBM和预训练. 自编 ...
- 埋在MySQL数据库应用中的17个关键问题!
作者:扎瓦陈序元 来源:https://blog.csdn.net/weixin_42882439 MySQL的使用非常普遍,跟MySQL有关的话题也非常多,如性能优化.高可用性.强一致性.安全.备份 ...
- JDK下载和安装教程,超详细
下载并安装JDK JDK的全称是JavaSE Development Kit,即java开发工具包,是sun公司提供的一套用于开发java应用程序的开发包,它提供了编译.运行java程序所需的各种工具 ...
- 学Java必看!零基础小白再也不用退缩了
程序员们!请往这儿看 对于JAVA的学习,可能你还会有许多的顾虑 不要担心 接着往下看吧 学Java前 一.数学差,英语也不好是不是学不好Java? 答案是:是~ 因为你在问这个问题的时候说明你对自己 ...
- 2020 Multi-University Training Contest 1 部分题解
目录 Cookies Distinct Sub-palindromes Fibonacci Sum Finding a MEX Leading Robots Math is Simple Minimu ...
- ROS 八叉树地图构建 - 安装 octomap 和 octomap_server 建图包!
项目要用到八叉树库 Octomap 来构建地图,这里记录下安装.可视化,并启用带颜色的 Octomap 的过程. 一.Apt 安装 Octomap 库 如果你不需要修改源码,可以直接安装编译好的 oc ...
- go微服务系列(三) - 服务调用(http)
1. 关于服务调用 2. 基本方式调用服务 3. 服务调用正确姿势(初步) 3.1 服务端代码 3.2 客户端调用(重要) 1. 关于服务调用 这里的服务调用,我们调用的可以是http api也可以是 ...
- 四种方法求Capacitated Facility Location Problem问题
问题详情 1. 贪心算法 1.1 算法框架 此题可以利用贪心算法来求解, 可以假设只关注顾客的cost, 当仓库满了就在下一个仓库里 具体解决方案: 将每个顾客到工厂的cost 由小到大进行排序 从第 ...
- oracle语法查某个字段为空
select * from t_address_express_mapping t where t.start_house_number is null;
(2013-01-15 16:55:36)