Android屏幕适配

一、目的

    屏幕适配的目的是让某个view元素在不同尺寸和分辨率的android设备上显示相同的效果。

二、基本概念

1、屏幕尺寸

    屏幕对角线的长度,单位是英寸(inch),1 inch = 2.54cm。

    常见的Android手机尺寸有5寸,5.5寸,6寸等。

2、屏幕分辨率

    分辨率即是屏幕横向和纵向的像素点总和,单位是px(pixel),1px 表示是一个像素点。

    目前常见的分辨率都比较高,如1080 * 1920,1440*2560等。

3、屏幕密度(dpi)

   屏幕密度dpi(dots per inch)是每英寸的点数。也就是说,密度越大每英寸内容纳的点数就越多。

    在android.util包下面有一个DisplayMetrics类,该类中定义了常用设备常用的dpi,可以通过下面代码获取本设备对应的屏幕密度:

DisplayMetrics metrics = context.getResources().getDisplayMetrics();

int density = metrics.densityDpi;

    densityDpi常用的值为:

    DENSITY_LOW = 120  
    DENSITY_MEDIUM = 160  //默认值  
    DENSITY_TV = 213      //TV专用  
    DENSITY_HIGH = 240  
    DENSITY_XHIGH = 320  
    DENSITY_XXHIGH = 480  
    DENSITY_XXXHIGH = 640

密度类型代表的分辨率(px)屏幕密度(dpi)换算(px/dp)比例
低密度(ldpi)240x3201201dp=0.75px3
中密度(mdpi)320x4801601dp=1px4
高密度(hdpi)480x8002401dp=1.5px6
超高密度(xhdpi)720x12803201dp=2px8
超超高密度(xxhdpi)1080x19204801dp=3px12
4、像素密度(ppi)

    像素密度即每英寸上像素点的个数(pixel per inch),屏幕分辨率大不一定意味着显示更清晰,因为手机尺寸不知道,而屏幕的ppi越高,表示屏幕的像素密度越高,这样屏幕内容看起来就更加细腻,看起来也就更加真实。ppi的计算公式为: 

    

    如,今天某手机发布会上,发布的手机屏幕参数:6.28英寸,1080*2280分辨率(402ppi),可以根据公式计算ppi结果是401.7约等于402。

    Google官方指定的dpi区分标准:
名称像素密度范围屏幕密度图片icon尺寸
drawable-ldpippi=120-160120  density=0.7536*36
drawable-mdpippi=160-240160  density=1(baseline)48*48
drawable-hdpippi=240-320240  density=1.572*72
drawable-xhdpippi=320-480320  density=296*96
drawable-xxhdpippi=480-640480  density=3144*144
drawable-xxxhdpippi=640-800640  density=4192*192
    根据ppi来判断屏幕密度的依据是,ppi最接近那个dpi,即取对应的dpi值。如上面计算出来的ppi值是402,则取屏幕密度480dpi,即相应的资源文件应该放在xxhdpi中。


5、设备独立像素(dp/dip)

    dp/dip(density-independent pixel),这个和设备硬件有关,不同设备有不同的显示效果。在做项目时,为了适配市场上繁多的手机分辨率,建议使用dp。

    dp 和 px 之间的转换关系: px = dp *(dpi/160)

6、独立比例像素(sp)

    sp(scale-independent pixel),Android开发时用此单位设置文字大小。推荐使用12sp、14sp、18sp、22sp作为字体设置的大小,不推荐使用奇数和小数,容易造成精度的丢失问题;


三、屏幕适配方案

    屏幕适配就是使得布局,图片资源等匹配不同的屏幕尺寸和屏幕密度。

1、支持各种屏幕尺寸

    使用wrap_content、match_parent、weight。weight是线性布局的一个独特的属性,我们可以使用这个属性来按照比例对界面进行分配,完成一些特殊的需求。

    android:layout_weight含义:如果View设置了该属性并且有效,那么该 View的宽度/高度等于原有宽度/高度(android:layout_width)加上剩余空间的占比。

    下面以宽度设置weight为例,设屏幕宽度为L,下面的button的原有宽度为W1和W2

    计算后的button1宽度为W = W1 + (L-(W1+W2)) * 百分比,button2同理。

    在线性布局中,一般设置宽或高的属性为0dp,然后在根据weight比重计算百分比。这样可以宽或者高就可以按照比重效果显示(1:2)。


    如果将width属性设置为match_parent,此时的效果如下,和上面正好是相反的。通过计算来说明原因,利用上面的公式:

    width属性设置为match_parent,则宽度和屏幕的宽度一致为L。

    button1W = L + (L-(L+L)) * (1/3) = 2/3L;

    button2W = L + (L-(L+L)) * (2/3) = 1/3L;


2、使用相对布局,禁用绝对布局

    Android开发中大部分时候使用的都是线性布局、相对布局和帧布局,绝对布局由于适配性极差,所以极少使用。

3、使用限定符

1)、尺寸限定符

    layout-large:系统会在属于较大屏幕(例如 7 英寸或更大的平板电脑)的设备上选择此布局。系统会在较小的屏幕上选择其他布局(无限定符)。这种方式只是用Android3.2之前版本。

    layout-swXXXdp:最小宽度限定符,Android3.2版本后引入了最小宽度限定符,通过指定某个最小宽度(以 dp 为单位)来精确定位屏幕从而加载不同的UI资源。

    例:使用了layout-sw600dp的最小宽度限定符,最小高度或者最小宽度(宽和高中最小的)大于600dp,就采用layout-sw600dp目录下的布局。(已测

2)、使用布局别名

    布局别名,为了解决文件名重名而带来的后期维护问题。

    场景:为了适配Android3.2前后的版本,需要定义对应的布局文件,如下,其中layout-large/main.xml和layout-sw600dp/main.xml两个文件内容是一致的。

  •     适配手机的单面板(默认)布局:res/layout/main.xml
  •     适配尺寸>7寸平板的双面板布局(Android 3.2前):res/layout-large/main.xml
  •     适配尺寸>7寸平板的双面板布局(Android 3.2后)res/layout-sw600dp/main.xml

    解决上面出现两个布局相同的xml文件,可以用布局别名。定义两个不同名的布局文件,然后在对应的资源文件中定义对布局的引用,注意name属性是和默认布局名称保持一致。(已测

    适配手机的单面板(默认)布局:res/layout/main.xml

    适配尺寸>7寸平板的双面板布局:res/layout/main_twopanes.xml

res/values-large/layout.xml(Android 3.2之前的双面板布局)
    <resources>
        <item name="main" type="layout">@layout/main_twopanes</item>
    </resources>

res/values-sw600dp/layout.xml(Android 3.2及之后的双面板布局)
   <resources>
       <item name="main" type="layout">@layout/main_twopanes</item>
   </resources>

3)、屏幕方向限定符

    屏幕方向限定符有-land 和 -port,通过该限定符在不同的屏幕以及屏幕方向上显示不同的布局。利用上面的别名方法来加载对用的布局。如下面的定义(已测):

 res/values-sw600dp-land/layout.xml
   <resources>
       <item name="main" type="layout">@layout/main_land</item>
   </resources>

res/values-sw600dp-port/layout.xml
   <resources>
       <item name="main" type="layout">@layout/main_port</item>
   </resources>

4、合理使用图片

    1)、使用.9图片自动拉升。

    2)、自定义shape.xml文件代替一些简单的背景图形。

    3)、使用SVG图形代替位图(简单的),适用于Android5.0以上。

    让美工在PS里把图片导出为SVG/PSD格式,然后 在AS里右键drawable文件夹。

    在drawable中新建Vector Assert,选择本地。

    

    

    在Material Icon中列举了一些简单的常见的小图标

    

5、使用dp和sp单位适应不同屏幕密度的设备

    可以利用限定符,定义不同分辨率下的尺寸。网上有生成脚本:

    Github地址:https://github.com/mengzhinan/PhoneScreenMatch    

    类似的方案还有:https://github.com/paulyung541/EasyScreen


总结:通过以上介绍,对屏幕适配有了初步的了解。

    

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值