Android 屏幕适配的研究

来源:互联网 发布:人不问知与不知 编辑:程序博客网 时间:2024/06/15 18:42

一.重要概念

首先,我们先要学习几个重要的概念。

  • 什么是屏幕尺寸、屏幕分辨率、屏幕像素密度?

  • 什么是dp、dip、dpi、sp、px?他们之间的关系是什么?

  • 什么是mdpi、hdpi、xdpi、xxdpi?如何计算和区分?

    1.1  屏幕尺寸

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

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

    1.2  屏幕分辨率

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

   1. 3  屏幕像素密度

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

    2.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,以此类推。

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

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


    3.mdpi、hdpi、xdpi、xxdpi

       

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

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

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

                                                            

在进行开发的时候,我们需要把合适大小的图片放在合适的文件夹里面。下面以图标设计为例进行介绍

                                    


         在设计图标时,对于五种主流的像素密度(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 进行匹配。

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


                                                              


屏幕适配,无疑就是在不同的分辨率下视图控件在显示屏上的相对位置保持基本一致。

适配方案一:百分比布局

    1.定义:在项目中针对你所需要适配的手机屏幕的分辨率各自简历一个文件夹。
    2.实现步骤 <1.设置一套基准比如:480*320 然后
            宽度为320,将任何分辨率的宽度分为320份,取值为x1-x320
            高度为480,将任何分辨率的高度分为480份,取值为y1-y480  比如800*480的屏幕的宽度取值x1 = 480/320 = 1.5px,其他分辨率类似~~
        因为android 系统在运行app时会根据系统分辨率自动去获取res 文件夹下对应的value-xxx*xxx 取出对应设定的取值px了。

    假设我现在需要在屏幕中心有个按钮,宽度和高度为我们屏幕宽度的1/2,我可以怎么编写布局文件呢?
    <FrameLayout >
        <Button
            android:layout_gravity="center"
            android:gravity="center"
            android:text="@string/hello_world"
            android:layout_width="@dimen/x160"
            android:layout_height="@dimen/x160"/>

    </FrameLayout>
    可以看到我们的宽度和高度定义为x160,其实就是宽度的50%;
假设现在的UI的设计图是按照480*320设计的,且上面的宽和高的标识都是px的值,你可以直接将px转化为x[1-320],y[1-480],这样写出的布局基本就可以全分辨率适配了。
    <2.使用自动文件夹生成文件来代替我们自己大量的分辨率计算,可以在文件中调整基准的分辨率大小。
    自动生成文件GenerValueFiles.java 的下载地址:https://github.com/hongyangAndroid/Android_Blog_Demos/blob/master/blogcodes/src/main/java/com/zhy/blogcodes/genvalues/GenerateValueFiles.java


适配方案二:google 推出的android-percent-support-lib百分比布局库

    1.说明:1.google 推出的屏幕适配库只有PercentRelativeLayout 和PercentFrameLayout
          2.支持的属性有:
layout_widthPercent、layout_heightPercent、
layout_marginPercent、layout_marginLeftPercent、
layout_marginTopPercent、layout_marginRightPercent、
layout_marginBottomPercent、layout_marginStartPercent、layout_marginEndPercent。
可以看到支持宽高,以及margin。
也就是说,大家只要在开发过程中使用PercentRelativeLayout、PercentFrameLayout替换FrameLayout、RelativeLayout即可。
    2.使用方法:build.gradle 中添加:
compile 'com.android.support:percent:23.2.1'
然后就可以在布局中使用百分比的布局
<android.support.percent.PercentRelativeLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <TextView
            android:id="@+id/row_one_item_one"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentTop="true"
            android:background="#7700ff00"
            android:text="w:70%,h:20%"
            android:gravity="center"
            app:layout_heightPercent="20%"
            app:layout_widthPercent="70%"/>

        <TextView
            android:id="@+id/row_one_item_two"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_toRightOf="@+id/row_one_item_one"
            android:layout_marginLeft="20dp"
            android:background="#396190"
            android:text="w:30%,h:20%"
            app:layout_heightPercent="20%"
            android:gravity="center"
            app:layout_widthPercent="30%"/>
        
    </android.support.percent.PercentRelativeLayout>
发现并不支持百分比的线性布局
这里需要自定义了:下载地址
https://github.com/hongyangAndroid/android-percent-support-lib-

sample/blob/master/app/src/main/java/com/juliengenoud/percentsamples/PercentLinearLayout.java
对于google 的百分比布局,有一定的局限性,鸿洋写了一个扩展的库参考博客:

http://blog.csdn.net/lmj623565791/article/details/46767825

适配方案三:AutoLayout

使用参考鸿洋的博客:http://blog.csdn.net/lmj623565791/article/details/49990941
要点:
1.本库的地址:https://github.com/hongyangAndroid/AndroidAutoLayout
2.在你的项目的AndroidManifest中注明你的设计稿的尺寸。
<meta-data android:name="design_width" android:value="720"></meta-data>
<meta-data android:name="design_height" android:value="1280"></meta-data>
3.用AutoXXXLayout代替系统原有的XXXLayout
4.拿到设计图纸的px并不代表1像素,我在内部会进行百分比化处理,也就是说:720px高度的屏幕,你这里填写72px,占据10%;当这个布局文

件运行在任何分辨率的手机上,这个72px都代表10%的高度,这就是本库适配的原理。


Android AutoLayout 参考鸿神的博客:

http://blog.csdn.net/lmj623565791/article/details/49990941



0 0
原创粉丝点击