几个概念:
1) 屏幕密度(dpi) :dot per inch,即每英寸像素数。
ldpi(120),mdpi(160),hdpi(240),xhdpi(320)
计算方法:
以480x854,4.0inch手机为例,其对角线为4.0inch,对角线的像素数为:(480^2 + 854^2)开根号 = 979.
所以其dpi = 979 / 4 = 245,约为240
2)屏幕尺寸:对角线长度。有small,normal,large,extra large
 
3)方向:横屏和竖屏
 
4)分辨率:一个物理屏幕上总的像素点数,如480x800等。我们应用中并不使用分辨率这个概念,主要是dpi和尺寸
 
5)dp(density-independent pixel)独立像素单位。一个抽象概念,用来定位UI布局,包括尺寸和位置。
 
 
 
1、可以在android工程目录res下有四个文件夹,主要是为了支持多分辨率的图片
drawable-hdpi
drawable-mdpi
drawable-ldpi
drawable-xhdpi
 
当设计给出切图时,我们首先需要明确一点,设计给出的切图是在什么尺寸下给出的。如果是480x800的切图,则应该放入drawable-hdpi目录下,如果是320x480的切图,则应该放在mdpi目录下。如果是720x1280的切图,则应该放在xhdpi目录下。
 
当使用该图片时,系统会根据机器的分辨率到相应的文件夹下查找图片。
 
问题1:如果只放一套图片,系统如何对图片的分辨率进行转换?
android系统加载图片资源遵循下面的规则:首先判断手机的屏幕密度,然后在相应的密度下文件夹中查找图片资源。如果找到,则进行显示。如果找不到,则会从drawable或者其他drawable-*文件夹中寻找。找到后,将文件夹所表示的密度与手机实际密度进行比较,从而缩放图片。例如在drawable下找到资源(等价于从drawable-mdpi),而手机又是hdpi的,这样android在显示图片时会将图片进行放大,以满足hdpi手机显示需要。不难想象,图片肯定会变模糊。
 
系统加载图片前先将图片进行缩放,因此你通过getwidth得到的尺寸已经是经过缩放的尺寸了。缩放比例与密度之比保持一致。
 
问题2:如果切图放错文件夹会有什么问题?
如果放错文件夹,系统会进行相应的缩放,使图片进行错误的缩放。例如hdpi的图片放到mdpi中,在hdpi的手机显示,会比原图片大
问题3:720p图片相关问题?
 
设计给切图,最好根据那个dpi呢?是都可以吗?一般应该给480*800的hdpi的切图。这样对于mdpi,可以自动缩小。图像显示质量不受影响。对于xdpi,放大幅度不大,图像显示质量影响较小。
 
那么为什么不用xhdpi呢,这样都是缩小图像不是更好吗?有两个理由,一是增大了apk的尺寸,另一个就是容易引起切图的变形,影响显示。主要是对于.9的图片,有对某一方向进行了压缩,如果设置时,拉伸区域太小,再压缩时可能变形。当然这也不是绝对的,可以通过增大.9.png文件的拉伸区域来实现。
或许还有个理由,xhpi的机型比较不占多数。
 
2、dp工作原理
 
     最关键要记住一个公式:
     android在计算pixel值时会首先判断屏幕的密度。如果我们把mdpi设为1,则hdpi就等于1.5. 如果我们使用dp为单位,android在转换为pixel时会依据下面公式:
 
     px = dp * density;
 
 
    dp表示独立像素密度,所谓独立,就是不依赖与屏幕的密度。
     从本质上来看,dp其实表示是相同的物理长度,注:不是以像素为单位,而是以inch为单位。
     例如对于mdpi,长度为m inch的屏幕,其像素数为n1,dp数为n2. 对于hdpi,也是长度为m inch,包含的像素数为n1 * 1.5. 根据公式可以算出,其dp值为n1 * 1.5 / 1.5 = n1. 对于xhdpi的也是n1.
 
     即:相同的物理长度其dp值相同。
 
 
     
从表象上看,dp可以表示一个相同的比例
也就是在ldpi、mdpi、hdpi和xdpi的屏幕密度中,用同一个dp值,可以表示相同的比例。
 
     请注意:是比例而不是尺寸。因为UI设计中,我们最关心的是一个视图相对于整个屏幕的比例,例如:在mdpi中,某TextView的长度占屏幕宽度的1/2,假设屏幕的宽度像素为320pixel,那么TextView为160pixel。而在hdpi中,我们需要该TextView也占到屏幕的1/2,才能称之为适应了不同的屏幕密度。为了实现这个目标,Android提供了dp的概念。
 
     我们把dip为160(mdpi)的屏幕与dp一一对应起来,即mdpi屏幕中,1个pixel就等于1个dp。通常,mdpi的屏幕宽度为320pixel,所以其屏幕宽度为320dp。
 
以上摘抄自http://blog.csdn.net/tanqiantot/article/details/11174011 以备忘
 

多屏幕适配的4条黄金原则

1) 在layout文件中设置控件尺寸时应采用fill_parent、wrap_content、match_parent和dp;

具体来说,设置view的属性android:layout_width和android:layout_height的值时,wrap_content,match_parent或dp比px更好,文字大小应该使用sp来定义

2) 在程序的代码中不要出现具体的像素值,在dimens.xml中定义;

为了使代码简单,android内部使用pix为单位表示控件的尺寸,但这是基于当前屏幕基础上的。为了适应多种屏幕,android建议开发者不要使用具体的像素来表示控件尺寸。

3) 不使用AbsoluteLayout(android1.5已废弃) ,可以使用RelativeLayout替代;

4) 对不同的屏幕提供合适大小的图片。

不同大小屏幕用不同大小的图片,low:medium:high:extra-high图片大小的比例为3:4:6:8;举例来说,对于中等密度(medium)的屏幕你的图片像素大小为48×48,那么低密度(low)屏幕的图片大小应为36×36,高(high)的为72×72,extra-high为96×96。

使用9-patch PNG图片

使用图片资源时,如果出现拉伸,因为图片处理的原因,会变形,导致界面走形。9-patch PNG图片也是一种标准的PGN图片,在原生PNG图片四周空出一个像素间隔,用来标识PNG图片中哪些部分可以拉伸、哪些不可以拉伸、背景上的边框位置等。

“上、左”定义可拉伸区域

“右、下”定义显示区域,如果用到完整填充的背景图,建议不要通过android:padding来设置边距,而是通过9-patch方式来定义。

Android SDK中提供了编辑9-Patch图片的工具,在tools目录下draw9patch.bat,能够立刻看到编辑后的拉伸效果,也可以直接用其他图片编辑工具编辑,但是看不到效果。

Android屏幕适配原理的更多相关文章

  1. 腾讯优测| 让Android屏幕适配开发更简单-Google百分比布

    文/腾讯优测工程师 吴宇焕 腾讯优测优社区干货精选~ 相信开发同学都被安卓设备碎片化的问题折磨过,市面上安卓手机的主流屏幕尺寸种类繁多,给适配造成很大的困难.就算搞定了屏幕尺寸问题,各种分辨率又让人眼 ...

  2. Android屏幕适配和方案【整理】

    版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 这里只是根据参考资料整理下,具体内容请阅读参考资料. 原型设计图 推荐1倍效果图,即采用 720 * 360 大小( 1280 *7 ...

  3. Android 一种非常好用的Android屏幕适配

    前言 网上关于屏幕适配的文章已经铺天盖地了,为什么我还要讲?因为网上现在基本都是使用px适配,即每种屏幕分辨率的设备需要定义一套dimens.xml文件.再加上有些手机还有虚拟按键(例如华为),这样就 ...

  4. 好用的Android屏幕适配

    前言 网上关于屏幕适配的文章已经铺天盖地了,为什么还要讲?因为网上现在基本都是使用px适配,即每种屏幕分辨率的设备需要定义一套dimens.xml文件.再加上有些手机还有虚拟按键(例如华为),这样就还 ...

  5. Android 屏幕适配之dimens适配

    Android 屏幕适配之dimens适配     转  https://blog.csdn.net/github_2011/article/details/72636851 在过去多个项目中一直使用 ...

  6. Android屏幕适配全攻略 (转载)

    http://blog.csdn.net/jdsjlzx/article/details/45891551 https://github.com/hongyangAndroid/AndroidAuto ...

  7. 【收藏】Android屏幕适配全攻略(最权威的Google官方适配指导)

    来源:http://blog.csdn.net/zhaokaiqiang1992 更多:Android AutoLayout全新的适配方式, 堪称适配终结者 Android的屏幕适配一直以来都在折磨着 ...

  8. Android屏幕适配全攻略(最权威的官方适配指导)(转),共大家分享。

    Android的屏幕适配一直以来都在折磨着我们这些开发者,本篇文章以Google的官方文档为基础,全面而深入的讲解了Android屏幕适配的原因.重要概念.解决方案及最佳实践,我相信如果你能认真的学习 ...

  9. Android屏幕适配全攻略(最权威的官方适配指导) (转)

    招聘信息: Cocos2d-X 前端主程 [新浪微博]手机客户端iOS研发工程师 20k-40k iOS 开发工程师 iOS高级开发工程师(中国排名第一的企业级移动互联网云计算公司 和创科技 红圈营销 ...

随机推荐

  1. 微信网页获取openId

    <%@ WebHandler Language="C#" Class="UserAuth" %> public class UserAuth : I ...

  2. Centos6.6 tar包安装JDK

    Linux CentOS 6.6安装JDK1.7 目录 1.下载JDK 2.卸载JDK 3.安装JDK 3.1..rpm后缀格式JDK安装方式 3.2..tar.gz后缀格式JDK安装方式 4.验证安 ...

  3. Response.Cookies 和 Request.Cookies

    Response.Cookies 和 Request.Cookies     原文地址: http://www.cnblogs.com/forcertain/archive/2012/12/04/28 ...

  4. JDBC操作Oracle数据库

    背景知识 含义:JDBC是一种java数据库连接技术,能实现java程序对各种数据库的访问.由一组使用java语言编写的类和接口组成,这些类和接口称为JDBC API,他们位于java.sql 以及j ...

  5. 读写分离提高 SQL Server 并发性能

    以下内容均非原创,仅作学习.分享!! 在 一些大型的网站或者应用中,单台的SQL Server 服务器可能难以支撑非常大的访问压力.很多人在这时候,第一个想到的就是一个解决性能问题的利器——负载均衡. ...

  6. SQL Group By/Having

    有时候需要检查DataBase里面是不是存在重复的数据,那么比较常用的就是通过Group By来进行分组,然后Having出来,如下: ))

  7. POJ 2376 Cleaning Shifts(轮班打扫)

    POJ 2376 Cleaning Shifts(轮班打扫) Time Limit: 1000MS   Memory Limit: 65536K [Description] [题目描述] Farmer ...

  8. nginx使用ssl模块配置HTTPS支持

    默认情况下ssl模块并未被安装,如果要使用该模块则需要在编译时指定–with-http_ssl_module参数,安装模块依赖于OpenSSL库和一些引用文件,通常这些文件并不在同一个软件包中.通常这 ...

  9. jQuery mobile 前台设计中的css em的使用。

    先贴个网址:http://www.uml.org.cn/html/201207311.asp 大家可以参考一下面这张转换表(body字体为16px时的值) 总结 长篇介绍了一大堆,唯一想告诉大家的是以 ...

  10. Nginx基础知识之————多模块(非覆盖安装、RTMP在线人数实例安装测试)

    说明:已经安装好的nginx,需要添加一个未被编译安装的模块,需要怎么弄呢? 具体:这里以安装第三方nginx-rtmp-module和nginx-accesskey-2.0.3模块为例,nginx的 ...