[Android] 適應多尺寸手機方案的解決方式

基本概念

屏幕尺寸

  • 含义:手机对角线的物理尺寸
  • 单位:英寸(inch),1英寸=2.54cm Android手机常见的尺寸有5寸、5.5寸、6寸等等

屏幕分辨率

  • 含义:手机在横向、纵向上的像素点数总和
  1. 一般描述成屏幕的”宽x高”=AxB
  2. 含义:屏幕在横向方向(宽度)上有A个像素点,在纵向方向 (高)有B个像素点
  3. 例子:1080x1920,即宽度方向上有1080个像素点,在高度方向上有1920个像素点
  • 单位:px(pixel),1px=1像素点 UI设计师的设计图会以px作为统一的计量单位
  • Android手机常见的分辨率:320x480、480x800、720x1280、1080x1920

 

屏幕像素密度

  • 含义:每英寸的像素点数
  • 单位:dpi(dots per ich)
  • 屏幕尺寸、分辨率、像素密度三者关系

    一部手机的分辨率是宽x高,屏幕大小是以寸为单位,那么三者的关系是:



  • 密度无关像素

    • 含义:density-independent pixel,叫dp或dip,与终端上的实际物理像素点无关。
    • 单位:dp,可以保证在不同屏幕像素密度的设备上显示相同的效果
      1. Android开发时用dp而不是px单位设置图片大小,是Android特有的单位
      2. 场景:假如同样都是画一条长度是屏幕一半的线,如果使用px作为计量单位,那么在480x800分辨率手机上设置应为240px;在320x480的手机上应设置为160px,二者设置就不同了;如果使用dp为单位,在这两种分辨率下,160dp都显示为屏幕一半的长度。
    • dp与px的转换 因为ui设计师给你的设计图是以px为单位的,Android开发则是使用dp作为单位的,那么我们需要进行转换:
    • 独立比例像素

      • 含义:scale-independent pixel,叫sp或sip
      • 单位:sp
      1. Android开发时用此单位设置文字大小,可根据字体大小首选项进行缩放
      2. 推荐使用12sp、14sp、18sp、22sp作为字体设置的大小,不推荐使用奇数和小数,容易造成精度的丢失问题;小于12sp的字体会太小导致用户看不清

      请把上面的概念记住,因为下面讲解都会用到!


更好地方案解决“图片资源”适配问题

上述方案是常见的一种方案,这固然是一种解决办法,但缺点在于:

  • 每套分辨率出一套图,为美工或者设计增加了许多工作量
  • 对Android工程文件的apk包变的很大

那么,有没有一种方法:

  • 保证屏幕密度适配
  • 可以最小占用设计资源
  • 使得apk包不变大(只使用一套分辨率的图片资源)

下面我们就来介绍这个方法: - 只需选择唯一一套分辨率规格的图片资源

方法介绍

1. 先来理解下Android 加载资源过程 Android SDK会根据屏幕密度自动选择对应的资源文件进行渲染加载(自动渲染)

比如说,SDK检测到你手机的分辨率是320x480(dpi=160),会优先到drawable-mdpi文件夹下找对应的图片资源;但假设你只在xhpdi文件夹下有对应的图片资源文件(mdpi文件夹是空的),那么SDK会去xhpdi文件夹找到相应的图片资源文件,然后将原有大像素的图片自动缩放成小像素的图片,于是大像素的图片照样可以在小像素分辨率的手机上正常显示。

所以理论上来说只需要提供一种分辨率规格的图片资源就可以了。 那么应该提供哪种分辨率规格呢?

如果只提供ldpi规格的图片,对于大分辨率(xdpi、xxdpi)的手机如果把图片放大就会不清晰

所以需要提供一套你需要支持的最大dpi分辨率规格的图片资源,这样即使用户的手机分辨率很小,这样图片缩小依然很清晰。那么这一套最大dpi分辨率规格应该是哪种呢?是现在市面手机分辨率最大可达到1080X1920的分辨率(dpi=xxdpi=480)吗?

2. xhdpi应该是首选

原因如下:

  • xhdpi分辨率以内的手机需求量最旺盛 目前市面上最普遍的高端机的分辨率还多集中在720X1080范围内(xhdpi),所以目前来看xhpdi规格的图片资源成为了首选
  • 节省设计资源&工作量 在现在的App开发中(iOS和Android版本),有些设计师为了保持App不同版本的体验交互一致,可能会以iPhone手机为基础进行设计,包括后期的切图之类的。 设计师们一般都会用最新的iPhone6和iPhone5s(5s和5的尺寸以及分辨率都一样)来做原型设计,所有参数请看下图

iPhone主流的屏幕dpi约等于320, 刚好属于xhdpi,所以选择xhdpi作为唯一一套dpi图片资源,可以让设计师不用专门为Android端切图,直接把iPhone的那一套切好的图片资源放入drawable-xhdpi文件夹里就好,这样大大减少的设计师的工作量!

额外小tips

  • ImageView的ScaleType属性 设置不同的ScaleType会得到不同的显示效果,一般情况下,设置为centerCrop能获得较好的适配效果。
  • 动态设置 使用场景:有些情况下,我们需要动态的设置控件大小或者是位置,比如说popwindow的显示位置和偏移量等
  • public class ScreenSizeUtil { public static int getScreenWidth(Activity activity) { return activity.getWindowManager().getDefaultDisplay().getWidth(); } public static int getScreenHeight(Activity activity) { return activity.getWindowManager().getDefaultDisplay().getHeight(); } }

一、使用layout_weight属性方法

目前最为推荐的Android多屏幕自适应解决方案

(1) 传统使用方法 :将layout_width和layout_height设置为fill_parent,通过 layout_weight属性控制控件的显示比例,当layout_weight越小,控件显示比例就越大。但是,如果布局中控件较多且显示比例不相同时,传统使用layout_weight属性的方法将比较麻烦

(2) 0px设值法:即使layout_width="0dp" 或layout_height="0dp",再结合layout_weight属性正比例控制控件的显示,该方法有效解决了当前Android开发中碎片化问题之一。

二、自定义尺寸法

所谓自定义尺寸法,即为每一种屏幕界面定义一套界面尺寸大小。


三、多布局
所谓多布局,即为不同尺寸屏幕设计单独的布局文件。为了提供自适应不同屏幕的资源,我们可以为不同屏幕尺寸、不同屏幕分辨率提供相应的布局资源、Drawable资源。需要注意的是,使用多布局方法,须在清单文件中添加如下代码,否则,会出现异常

1.如何支持多个屏幕
(1)在程序中显示声明你的应用程序支持屏幕尺寸的清单(AndroidMnifest.xml)
  1. <supports-screens   
  2.      android:resizeable=[“true”|”false”]  
  3.      android:smallScreens=[“true”|”false”]  
  4.      android:normalScreens=[“true”|”false”]  
  5.      android:largeScreens=[“true”|”false”]  
  6.      android:xlargeScreens=[“true”|”false”]  
  7.      android:anyDensity=[“true”|”false”]/>
2.文字自适应
(1) dip: device independent pixels(设备独立像素). 不同设备有不同的显示效果,这个和设备硬件有关,一般我们为了支持WVGA、HVGA和QVGA (WVGA=800x480,HVGA=480x320, QVGA=320x240)推荐使用这个,不依赖像素。
(2)px: pixels(像素). 不同设备显示效果相同,一般我们HVGA代表320x480像素,这个用的比较多。 
(3)pt: point,是一个标准的长度单位,1pt=1/72英寸,用于印刷业,非常简单易用; 
(4)sp: scaled pixels(放大像素). 主要用于字体显示best for textsize。可以根据用户的字体大小首选项进行缩放 
    根据上面对单位的分析,使用sp为单位就可以实现自适应字体大小。 在res文件夹中创建一个文件夹,叫做values-320x240。其中320x240是你手机屏幕的分辨率,根据你手机屏幕的情况做不同的命名,例如values-800x480。在该文件夹下创建一个dimens.xml文件,定义各种字体的大小。那么系统就会自动根据你手机屏幕的分辨率去调用响应的文件夹。 
        另外,值得提醒的是,记得在你默认的values文件下的dimens.xml文件中也要写上相应的字体大小,因为当系统无法认识你手机屏幕大小的时候,它会自动去找你默认文件中的东西,没有写的话程序会崩溃。
3.布局自适应
(1)根据不同屏幕尺寸,提供不同布局
    默认情况下面,android会自动调整应用程序的布局,但是大多数情况下面,根据广义尺寸,小,正常,大,更大去增加不同的布局资源。比如,如果需要对大小为large的屏幕提供支持,需要在res目录下新建一个文件夹layout-large/并提供layout。当然,也可以在res目录下建立layout-port和layout-land两个目录,里面分别放置竖屏和横屏两种布局文件,以适应对横屏竖屏自动切换。
layout :默认中等屏幕 
layout-small :小屏幕 
layout-large :大屏幕 
layout-xlarge :特大屏幕 
layout-land :横屏 
layout-port :竖屏
注:Android3.2以上推荐使用在layout、values目录添加-sw<N>dp,即屏幕尺寸至少宽N个dp才能使用该资源。
(2)提供不同的屏幕密度和不同的位图drawables 
    默认情况下面系统会自动调整和缩放位图,但是难免拉伸位图,为了保证你的位图是最好看的,根据广义密度,低,中型, 高,特高去添加不同的位图资源。比如,如需对密度为low的屏幕提供合适的图片,需新建文件夹drawable-ldpi/。应尽量使用点9格式的图片,图片大小的确定:low:medium:high:xhigh比例为3:4:6:8。举例来说, 对于中等密度(medium)的屏幕你的图片像素大小为48×48,那么低密度(low)屏幕的图片大小应为36×36,高(high)的为72×72,extra high为96×96
Android系统支持多配置资源文件,我们可以追加新的资源目录到你的Android项目中。
drawable-hdpi、drawable-mdpi、drawable-ldpi的区别:
>drawable-hdpi里面存放高分辨率的图片,如WVGA (480x800),FWVGA (480x854)  
>drawable-mdpi里面存放中等分辨率的图片,如HVGA (320x480)  
>drawable-ldpi里面存放低分辨率的图片,如QVGA (240x320) 


Link:
https://cloud.tencent.com/developer/article/1394200


留言

熱門文章