文档章节

Android屏幕适配(一)

k
 kim366
发布于 2016/05/13 19:13
字数 2926
阅读 6
收藏 0

      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越大,如果脱离了屏幕的物理尺寸谈分辨率是没有任何意义的。就像平板的分辨率比手机的大,那是因为平板个大呀。从颜色显示的细腻程度上讲并不见得比手机强。

          

  • 这是一张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越大,如果脱离了屏幕的物理尺寸谈分辨率是没有任何意义的。就像平板的分辨率比手机的大,那是因为平板个大呀。从颜色显示的细腻程度上讲并不见得比手机强。

  • 本文转载自:http://blog.csdn.net/oyangyujun/article/details/47973713

    共有 人打赏支持
    k
    粉丝 1
    博文 129
    码字总数 0
    作品 0
    朝阳
    android兼容oppo手机刘海屏解决方案

    引用自OPPO官方文档,这里缩减了一些内容,选取重要内容,包括oppo沉浸式的兼容。 转载请标明出处: https://blog.csdn.net/DJY1992/article/details/80688802 本文出自:【奥特曼超人的博客】...

    奥特曼超人
    06/14
    0
    0
    android多分辨率多屏幕密度下UI适配方案

    前言 Android设计之初就考虑到了UI在多平台的适配,它本身提供了一套完善的适配机制,随着版本的发展适配也越来越精确,UI适配主要受平台两个因素的影响:屏幕尺寸(屏幕的像素宽度及像素高度...

    geeksu
    2014/08/20
    0
    0
    android兼容小米xiaomi刘海屏解决方案

    引用自小米官方文档,这里缩减了一些内容,捡取重要内容。 转载请标明出处: https://blog.csdn.net/DJY1992/article/details/80688376 本文出自:【奥特曼超人的博客】 推荐: android 兼容所...

    奥特曼超人
    06/14
    0
    0
    一大波 Android 刘海屏来袭,全网\Maybe/最全适配技巧!

    一、序 Hi,大家好,我是承香墨影! Apple 一直在引领设计的潮流,自从 iPhone X 发布之后,"刘海屏" 就一直存在争议。不过不管你怎样,Android 也要跻入 "刘海屏" 的行列,尤其是 Android ...

    承香墨影
    04/12
    0
    0
    升级之前必看,关于安卓P的几大新特性,你知道吗?

      近日,安卓最新系统Android 9已经正式开始推送升级,Android 9的代号为Android P,在近日确认名为馅饼(pie),首批支持推送更新的机型是Google“亲儿子”Pixel系列,接着便是安卓手机之...

    人工智能那点事
    08/10
    0
    0

    没有更多内容

    加载失败,请刷新页面

    加载更多

    Linux安装MySQL的两种方法

    1. 运行平台:CentOS 6.3 x86_64,基本等同于RHEL 6.3 2. 安装方法: 安装MySQL主要有两种方法:一种是通过源码自行编译安装,这种适合高级用户定制MySQL的特性,这里不做说明;另一种是通过...

    onedotdot
    19分钟前
    3
    0
    phpize源码安装php扩展

    4、进入源码中的ext/pcntl目录 ~# cd php-5.3.29/ext/pcntl/ 5、运行 phpize 命令 ~# phpizeConfiguring for:PHP Api Version: 20090626Zend Module Api No: 20090626......

    bengozhong
    27分钟前
    1
    0
    Git 常用技巧

    # Git 常用技巧 ## 暖场 - Git 怎么读 ? - Git 的作者是谁 ? - 谁没有 Github 账号 ? - 谁没有在 Github 提交过 issues,PR ? - 谁没有不会用命令操作 Git ? ## Git 简介 Git 是一种代码...

    帝子兮
    40分钟前
    1
    0
    MySQL学习笔记

    踩坑建议 对于时间相关字段,为插入及显示毫秒数据,建议使用datetime(6)类型,并设置数据库客户端显示毫秒相关数据

    OSC_fly
    40分钟前
    0
    0
    spring配置文件中xsd引用异常

    异常: org.xml.sax.SAXParseException; lineNumber: 78; columnNumber: 69; schema_reference.4: 无法读取方案文档 'http://www.springframework.org/schema/tx/spring-tx-3.2.xsd', 原因为......

    zaolonglei
    43分钟前
    3
    0

    没有更多内容

    加载失败,请刷新页面

    加载更多

    返回顶部
    顶部