android屏幕适配方法
android中图片适配是一件很棘手的事情,本篇文章详细的介绍屏幕显示的原理,为什么会资源文件中会存在
drawable-ldpi、drawable-mdpi、drawable-hdpi、drawable-xhdpi等文件夹,为什么要使用dp作为单位等等。
首先从这两张图片的显示效果开始说起


这是一张200x200的图片在不同的手机上的显示效果。很明显第二张图片看上去要比第一张占用的空间小很多?这是为什么呢?
这里我们引入 ppi (pixel per inch)名词,翻译过来就是每英寸的距离像素点的个数。现在来解释上面的现象。对于一张200x200像素的图片,我国我们想要显示在 200ppi 的手机上,那么占用屏幕的长和宽均为 200pix / (200pix / inch) = 1 inch ,也就是说要占用 1 inch x 1 inch,如果要显示在 300ppi 的手机上,那么占用屏幕的长和宽均为 200pix / (300pix / inch ) = 2/3 inch,也就是说对于 ppi越高的手机,单位inch上能够显示更多的像素点,因此当这两种手机显示同样多的像素点的时候,ppi 越高的手机占用的空间就越小。这就是我们想要图片在各种手机屏幕上都显示一致的效果时需要解决的问题。
既然这种效果不是我们想要的,怎么做才能获取一致的显示效果呢?下面介绍三种方法
方法一:对每一中不同的ppi使用不同的图片,这需要我们先判断屏幕的ppi,再对图片进行处理,然后显示,显然比较麻烦。而且对于获取屏幕ppi这个参数android并没有提供给我们api调用。所以这种办法基本行不通
方法二: 在用eclipse开发环境生成一个android项目后,系统会给我们生成drawable-ldpi、drawable-mdpi、drawable-hdpi、drawable-xhdpi,drawable-xxhdpi,对于同一张图片资源,我们分别创建这五个版本来适应不同的屏幕。假设你想一张图片
在 200ppi和400ppi的手机上显示的长和宽都是一样的为 1inch x 1inch,那么你就需要制作一张200x200的图片和一张
400x400的图片,然后放入对应得drawable目录中就可以了。那么程序运行时怎么知道自己到底是使用哪个drawable目录下
的图片呢?这个是不需要我们考虑的,而是手机厂商考虑的问题,只需要知道,程序会使用适应当前屏幕的目录下的图片
资源。
drawable-ldpi、drawable-mdpi、drawable-hdpi、drawable-xhdpi,drawable-xxhdpi,这几个目录对应的pppi为
120ppi 160ppi 240ppi 320ppi 480ppi ,也就是说如果屏幕的ppi为320,那么就会优先使用drawable-xhdpi目录下的
图片资源。当然手机屏幕的ppi也是多种多样,例如有的是 300ppi,有的是220ppi,这个系统会选择最接近的目录,也就
是 300ppi的手机会选择320ppi对应的drawable目录下的资源
方法三:方法2中需要为每个drawable目录都生成对应的图片版本,如果图片较多的话,生成不同版本的图片倒是小事更主要的缺点是会增大应用的大小,那么可不可以只在一个目录下存放图片,例如只在drawable-mdpi目录下存放图片呢答案是可以的,假设我们在drawable-hdpi(对应的ppi为160ppi)目录下存放了一个100X100的图片,那么当图片需要
在320ppi的android设备上进行显示时,android系统会将自动将图片进行处理生成一个200X200的图片显示到设备上,那么他们占用的空间大小分别为 100/160 = 3/5 inch 200/320 = 3/5 inch 可以看出他们占用的长和宽都是一样的这种自动缩放的优点是只需要一张图片就能适应各种ppi类型的屏幕。缺点是当对100X100的图片进行变换成200X200的图片时肯能会造成图片的不清晰,如果提供一个drawable-xhdpi下的图片资源,图片较多的话会无形增加应用的大小,所以说如何进行选择也是一个衡量。建议是将比较重要的图片资源提供多个版本(当android设备和自己的ppi相对应的drawable下找到想要的资源时,就不会再到其他目录需找资源)。不是很重要的图片资源存储一个版本,让系统根据自己的ppi自己对图片进行适当的缩放显示。
最后再说下为什么在布局文件中使用 dp作为单位而不是使用px
dp是一个与屏幕ppi无关的参数,同时也是一个事实上并不存在的虚拟单位。显示时会根据具体屏幕的ppi进行像素的映射,关系如下160ppi 1dp 1px120ppi 1dp 0.75px240ppi
1dp 1.5px320ppi 1dp 2px因此在布局文件中一般使用dp作为单位,这样就能适应不同ppi的屏幕,在各种ppi的屏幕上有一样大的物理上的距离。(可以看出1dp并不总是等于1px的,对于ppi高的屏幕肯能要等于2px,只是为了物理上看起来的距离是相等的)最后希望大家能够明白 我们经常说的分辨率和ppi的关系,其实他们是没多大关系。分辨率只是说明屏幕上有多少个像素点,这也跟屏幕大小有关系。当然对于屏幕大小相同的来讲 分辨率越高 ppi越大,如果脱离了屏幕的物理尺寸谈分辨率是没有任何意义的。就像平板的分辨率比手机的大,那是因为平板个大呀。从颜色显示的细腻程度上讲并不见得比手机强。
android屏幕适配方法的更多相关文章
- 【收藏】Android屏幕适配全攻略(最权威的Google官方适配指导)
来源:http://blog.csdn.net/zhaokaiqiang1992 更多:Android AutoLayout全新的适配方式, 堪称适配终结者 Android的屏幕适配一直以来都在折磨着 ...
- Android屏幕适配全攻略(最权威的官方适配指导)(转),共大家分享。
Android的屏幕适配一直以来都在折磨着我们这些开发者,本篇文章以Google的官方文档为基础,全面而深入的讲解了Android屏幕适配的原因.重要概念.解决方案及最佳实践,我相信如果你能认真的学习 ...
- Android屏幕适配全攻略(最权威的官方适配指导) (转)
招聘信息: Cocos2d-X 前端主程 [新浪微博]手机客户端iOS研发工程师 20k-40k iOS 开发工程师 iOS高级开发工程师(中国排名第一的企业级移动互联网云计算公司 和创科技 红圈营销 ...
- 腾讯优测| 让Android屏幕适配开发更简单-Google百分比布
文/腾讯优测工程师 吴宇焕 腾讯优测优社区干货精选~ 相信开发同学都被安卓设备碎片化的问题折磨过,市面上安卓手机的主流屏幕尺寸种类繁多,给适配造成很大的困难.就算搞定了屏幕尺寸问题,各种分辨率又让人眼 ...
- Android 屏幕适配(一)百分比布局库(percent-support-lib) 解析与扩展
转载请标明出处: http://blog.csdn.net/lmj623565791/article/details/46695347: 本文出自:[张鸿洋的博客] 一.概述 周末游戏打得过猛,于是周 ...
- Android重写getResources规避用户调整系统字体大小影响Android屏幕适配
Android屏幕适配一直是一个头疼的问题.除此之外还要考虑APP在实际应用场景中,用户千奇百怪的设置,最常见的用户设置行为就是设置手机的字体大小,比如把字体设置成超大或者超小,这对屏幕适配又带来额外 ...
- (转)android屏幕适配
声明:eoe文章著作权属于作者,受法律保护,转载时请务必以超链接形式附带如下信息 原文作者: zhuangyujia 原文地址: http://my.eoe.cn/zhuangyujia/archiv ...
- 【转】Android屏幕适配全攻略(最权威的官方适配指导)
原文网址:http://blog.csdn.net/jdsjlzx/article/details/45891551 Android的屏幕适配一直以来都在折磨着我们这些开发者,本篇文章以Google的 ...
- Android屏幕适配全攻略(最权威的官方适配指导)
转载请注明出处:http://blog.csdn.net/zhaokaiqiang1992 Android的屏幕适配一直以来都在折磨着我们这些开发者,本篇文章以Google的官方文档为基础,全面而深入 ...
随机推荐
- HDU 5807 Keep In Touch
加维降复杂度 #pragma comment(linker, "/STACK:1024000000,1024000000") #include<cstdio> #inc ...
- 关于C++中字符的转换
VS的工程属性中我们常会设置Character Set:
- JS获取网页中HTML元素的几种方法分析
getElementById getElementsByName getElementsByTagName 大概介绍 getElementById ,getElementsByName ,getEle ...
- flash检测网络是否通畅
air: 要在 Adobe ® Flash ® Professional(CS4 或更高版本)中使用 air.net 包: 选择“文件”>“发布设置”命令. 在 Flash 面板中,单击 Act ...
- oracle添加sequence
CREATE SEQUENCE seq_tm_function INCREMENT BY 1 -- 每次加几个 START WITH 100000015 -- 从1开始计数 NOMAXVALUE -- ...
- 【转】PHP android ios相互兼容的AES加密算法
APP项目用户密码传输一直没有用HTTPS,考虑到用户的隐私暂时先用AES对密码加密,以后也可以用于手机端与服务端加密交互. PHP的免费版phpAES项目,手机端解码各种不对. 好不容易找了PHP ...
- Linux添加用户user到用户组group
添加用户:useradd niot 添加到组:usermod -a -G root niot 改密码:passwd niot 切换:su - niot 查看用户组:groups 将一个用户添加到用户组 ...
- mongodb备份
一:数据导出,数据导入作为DBA(管理员),经常会碰到导入导出数据的需求,下面介绍实用工具(自带的):1:数据导入 mongoexport导出csv格式的文件./mongoexport -d Test ...
- OpenGL.Vertex Array Object (VAO).
OpenGL抛弃glEnable(),glColor(),glVertex(),glEnable()这一套流程的函数和管线以后,就需要一种新的方法来传递数据到Graphics Card来渲染几何体,我 ...
- jsp环境搭建(Windows)
1.软件准备 JDK 最新版jdk-8u45-windows-x64.exe tomcat 最新版32-bit/64-bit Windows Service Installer Eclipse IDE ...