Android屏幕适配记录<一>

来源:互联网 发布:php 跨域设置cookie 编辑:程序博客网 时间:2024/06/05 20:48

    Android的屏幕适配一直以来都在折磨着我们这些开发者,本篇文章主要讲解下Android屏幕适配的原因、重要概念以及相应的解决方案。


   简介:

  • Android屏幕适配出现的原因
  • 重要概念
    • 屏幕尺寸
    • 屏幕分辨率
    • 屏幕像素密度
    • dpdipdpisppx
    • mdpihdpixdpixxdpi
  • 解决方案
    • 支持各种屏幕尺寸
      • 使用wrap_contentmatch_parentweight
      • 使用相对布局禁用绝对布局
      • 使用限定符
        • 使用尺寸限定符
        • 使用最小宽度限定符
        • 使用布局别名
        • 使用屏幕方向限定符
        • 使用自动拉伸位图
    • 支持各种屏幕密度
      • 使用非密度制约像素
      • 提供备用位图
    • 实施自适应用户界面流程
      • 确定当前布局
      • 根据当前布局做出响应
      • 重复使用其他活动中的片段
      • 处理屏幕配置变化
    • 最佳实践
      • 关于高清设计图尺寸
      • ImageView的ScaleType属性
      • 动态设置
    • 更多参考资料

Android屏幕适配出现的原因

在我们学习如何进行屏幕适配之前,我们需要先了解下为什么Android需要进行屏幕适配。

由于Android系统的开放性,任何用户、开发者、OEM厂商、运营商都可以对Android进行定制,修改成他们想要的样子。

但是这种“碎片化”到底到达什么程度呢?

在2012年,OpenSignalMaps(以下简称OSM)发布了第一份Android碎片化报告,统计数据表明,

  • 2012年,支持Android的设备共有3997种。
  • 2013年,支持Android的设备共有11868种。
  • 2014年,支持Android的设备共有18796种。

 当今Android系统碎片化问题的严重性,而随着支持Android系统的设备(手机、平板、电视、手表)的增多,设备碎片化、品牌碎片化、系统碎片化、传感器碎片化和屏幕碎片化的程度也在不断地加深。而我们今天要探讨的,则是对我们开发影响比较大的——屏幕的碎片化。

一、概念介绍

  什么是屏幕尺寸、屏幕分辨率、屏幕像素密度? 
  什么是dp、dip、dpi、sp、px?他们之间的关系是什么? 
  什么是mdpi、hdpi、xdpi、xxdpi?如何计算和区分?

  在下面的内容中我们将介绍这些概念。

    1.屏幕尺寸

        屏幕尺寸指屏幕的对角线的长度,单位是英寸,1英寸=2.54厘米

        比如常见的屏幕尺寸有2.4、2.8、3.5、3.7、4.2、5.0、5.5、6.0等

    2.屏幕分辨率

         屏幕分辨率是指在横纵向上的像素点数,单位是px,1px=1个像素点。一般以纵向像素*横向像素,如1960*1080。

     3.屏幕像素密度

        屏幕像素密度是指每英寸上的像素点数,单位是dpi,即“dot per inch”的缩写。屏幕像素密度与屏幕尺寸和屏幕分辨率有关,在单一变化条件         下,屏幕尺寸越小、分辨率越高,像素密度越大,反之越小。

    4. dp、dip、dpi、sp、px

         px我们应该是比较熟悉的,前面的分辨率就是用的像素为单位,大多数情况下,比如UI设计、Android原生API都会以px作为统一的计量单位,          像是获取屏幕宽高等。 

        dip和dp是一个意思,都是Density Independent Pixels的缩写,即密度无关像素,上面我们说过,dpi是屏幕像素密度,假如一英寸里面有160          个像素,这个屏幕的像素密度就是160dpi,那么在这种情况下,dp和px如何换算呢?在Android中,规定以160dpi为基准,1dip=1px,如果密         度是320dpi,则1dip=2px,以此类推。(在一英寸里 :160dpi时为1:1,当像素密度变为320dpi时、密度升高、还在这一英寸里,只有像素点增         加 即为1:2 两个像素为一个密度)

       假如同样都是画一条320px的线,在480*800分辨率手机上显示为2/3屏幕宽度,在320*480的手机上则占满了全屏,如果使用dp为单位,在这两        种分辨率下,160dp都显示为屏幕一般的长度。这也是为什么在Android开发中,写布局的时候要尽量使用dp而不是px的原因。480*800中:           1dp=3px; 320*480中 1dp=2px;

       而sp,即scale-independent pixels,与dp类似,但是可以根据文字大小首选项进行放缩,是设置字体大小的御用单位。

   5.mdpi、hdpi、xdpi、xxdpi

      其实之前还有个ldpi,但是随着移动设备配置的不断升级,这个像素密度的设备已经很罕见了,所在现在适配时不需考虑。

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

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

名称像素密度范围mdpi120dpi~160dpihdpi160dpi~240dpixhdpi240dpi~320dpixxhdpi320dpi~480dpixxxhdpi480dpi~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 进行匹配。

  下图为图标的各个屏幕密度的对应尺寸

屏幕密度图标尺寸mdpi48x48pxhdpi72x72pxxhdpi96x96pxxxhdpi144x144pxxxxhdpi192x192px

 二、解决方案

   支持各种屏幕尺寸

   使用wrap_content、match_parent、weight

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

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

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

     下篇文章会讲解具体讲解weight的使用这里先简单介绍:

线性布局中子控件最终占用宽度 = 原有宽度+剩余空间分配量
例如,在水平方向上的线性布局LinearLayout控件L中,包含两个水平占用空间的控件A、B,其中:
L控件:L控件宽度layout_width = width_l
A控件:A控件宽度layout_width = width_a   A控件权重layout_weight = weight_a
B控件:B控件宽度layout_width = width_b   B控件权重layout_weight = weight_b
L中子控件最终占用宽度 = 原有宽度(width_a)+剩余空间分配量
A所占宽度 = width_a + (width_l-width_a-width_b)*weight_a/(weight_a+weight_b)
B所占宽度 = width_b + (width_l-width_a-width_b)*weight_b/(weight_a+weight_b)
由此可以推断,当使用权重(layout_weight)时,会遇到下列两种情况:
情况1:当L中内部子控件(A,B)的宽度之和大于L的总宽度时,即(width_l-width_a-width_b)<0时,weight_a/(weight_a+weight_b)         比例的值越大,当前控                        件所占空间越小。
情况2:当L中内部子控件(A,B)的宽度之和小于L的总宽度时,即(width_l-width_a-width_b)>0时,weight_a/(weight_a+weight_b)        比例的值越大,当前控                       件所占空间越大。

支持各种屏幕密度

   使用非密度制约像素
由于各种屏幕的像素密度都有所不同,因此相同数量的像素在不同设备上的实际大小也有所差异,这样使用像素定义布局尺寸就会产生问题。因          此,请务必使用 dp 或 sp 单位指定尺寸。dp 是一种非密度制约像素,其尺寸与 160 dpi 像素的实际尺寸相同。sp 也是一种基本单位,但它可根       据 用户的偏好文字大小进行调整(即尺度独立性像素),因此我们应将该测量单位用于定义文字大小。
参考博客:http://blog.csdn.net/jdsjlzx/article/details/45891551
                 http://blog.csdn.net/zhaokaiqiang1992

0 0
原创粉丝点击