android多分辨率开发的解决方案(2)-----适配大部分手机

来源:互联网 发布:怎么删除我的淘宝评价 编辑:程序博客网 时间:2024/05/16 14:19

android多分辨率适配是一个老生常谈的问题了,但是随着市面上的手机越来越多样化,以前好多方法到现在已经不管用,或者说要做到很好的适配需要添加各种特例,这样大大增大我们研发的难度和时间。之前我总结了一些比较管用的方法,记录一下,并且希望可以帮到大家。


1、关于一些基础知识请看我上一篇文章《android多分辨率开发的解决方案》;如果已经知道一些适配的基础知识可以直接往下看;

这篇文章里的方法在很久以前算是一个不错的方法,但是到现在这个方法也出现了很多适配问题。


2、我们讨论下目前常用适配方法的利弊;


首先,我们看一张图~

 

此图的数据是我从genymotion提供的数据总结出来的,列名分别为手机型号,屏幕dpi,宽度满屏的dp数,手机尺寸

我们根据此图的数据和开发者官网的资料来讨论目前常用适配方法的利弊,官网相关资料地址:http://developer.android.com/guide/practices/screens_support.html


常用方法1:用文件夹 -mdpi、-hdpi、-xhpi等做适配,并针对特例用 -w*h (w为宽度像素值,h为高度像素值)来做特别处理;

这种方法一直以来都很受欢迎,因为就用几个文件夹就可以轻松搞掂适配,但是同时也会有很多特别的手机不能适配到相应的文件夹,导致展示布局与设计不符问题。

官网定义了dpi的范畴:

  • A set of six generalized densities:
    • ldpi (low) ~120dpi
    • mdpi (medium) ~160dpi
    • hdpi (high) ~240dpi
    • xhdpi (extra-high) ~320dpi
    • xxhdpi (extra-extra-high) ~480dpi
    • xxxhdpi (extra-extra-extra-high) ~640dpi
然后,我们观察上图的数据:

  • 大部分mdpi(240dpi)的手机都是一满屏为320dp,也就是同一个规格,可以用一个适配文件就可以解决。但是却存在一个特别的手机Moto Droid Razr ,它同样是属于mdpi,但是它满屏却为360dp;
  • 大部分hdpi(320dpi)的手机满屏是360dp,但也不难发现它们中出了不止一个叛徒---HTC One 和 Google Nexus 4,这两部手机同样是hdpi,但是满屏宽度却是5540dp和384dp,也就是说如果用hdpi文件夹的文件适配这两台手机,其展现的布局会比你想象中小;

  由于有各种特别的手机存在,所以如果用这种适配方法,一般还会对特别的手机做特别处理,例如对上面的moto进行特别处理:新建一个文件夹 values-mdpi-540*960(MotoDroid Razr 的分辨率是540*960),然后里面的文件就是适配该特别的手机;又如对HTC One(1080*1920)进行适配,则又要新建一个文件夹 values-hdpi-1080*1920 来特别适配该手机;

从此可见这个方法处理起来也是十分的麻烦,并且在将来各种新手机面市后,可能你还需要更新app版本来对新上市的手机做特别适配;


常用方法2:从分辨率入手做适配,即用文件夹 -480*800, -720*1080 等适配;

从上图的数据可以看出,属于某一种分辨率的手机,一般都可以用同一个适配文件来适配,但是同样也会有有一些特殊的手机,对于此类手机要用上一个方法提到的特殊处理来处理特殊手机的分辨率,如values-hdpi-1080*1920 ;

而且现在市面上的手机分辨率十分多样化,尤其是魅族,它们不按出牌,大部分手机分辨率都不是主流分辨率,因此,此适配方法也十分麻烦;


常用方法3:从屏幕尺寸大小入手做适配,即用文件夹 -small , -normal , -large等适配;

这个方法要看我上一篇文章,这个方法在以前手机样式没有那么丰富的时候还是可以适配大部分手机,但是到现在这个方法已经大大失效了,可以看看最新的官网资料:

Table 3. Various screen configurations available from emulator skins in the Android SDK (indicated in bold) and other representative resolutions.

 Low density (120), ldpiMedium density (160), mdpiHigh density (240), hdpiExtra-high-density (320), xhdpiSmallscreenQVGA (240x320) 480x640 NormalscreenWQVGA400 (240x400) 
WQVGA432 (240x432)
HVGA (320x480)WVGA800 (480x800) 
WVGA854 (480x854)
 
600x1024640x960LargescreenWVGA800** (480x800) 
WVGA854** (480x854)
WVGA800* (480x800) 
WVGA854* (480x854)
 
600x1024  Extra-Largescreen1024x600WXGA (1280x800)
1024x768
1280x7681536x1152
1920x1152 
1920x12002048x1536
2560x1536 
2560x1600此表格已经与我上一篇文章用到的表格大大不同,通过我上篇文章的计算方法,你可以发现这种适配方法已经出现错误适配了;


从上面的方法可以看出,我们尝试从某一个方面来适配手机,如从dpi,分辨率,手机屏幕大小等方面,希望可以在这个方面能简单地总结出一个适配方案来适配所有手机,但是很不巧,我们不能够仅仅从一个方面就能概括所有手机,所以就会对特殊手机做特殊处理;

你在写android程序时,你会发现dp这个单位是非常特殊,它不跟设备很多东西都没有关联,如同样是30dp的宽度在分辨率相差甚远的两台手机上显示的宽度占比确实一模一样!! 这是否会让你觉得,如果能从dp入手来进行适配,则我们做适配就会变得很简单~事实是可以的~


我提议的方法:从满屏dp入手,用文件夹 -sw<N>dp等来做适配;

看官网资料可以看到,这种方法是从3.2就已经提出来了,当时提出来是为了更好的适配平板,但我觉得这个也可以很好的适配手机。对-sw<N>dp的概念可以看官网,简单来说就是手机宽度至少是Ndp就会适配到sw<N>dp文件夹里,N就是我们做适配的手机宽度大小;

据我所知:常见的手机宽度有 240dp、320dp、360dp、384dp、400dp、480dp、540dp、600dp,其中320、360、480较为普遍,虽然这样的分类仍需要分为多为文件夹,但是相比其他其他维度的分类,这种是比较好的一种分类。

首先,你需要在其中一个文件夹设计好你的布局,然后根据比例可以直接计算其他文件夹布局的尺寸大小,把上述所写来的文件夹都配置一个适配文件后,即在values-sw320dp,values-sw360dp等文件夹配置响应的适配文件后,这样所有系统在3.2及以上的手机就能完美适配了;然后对于3.2以下的手机,我们需要另外写三个左右的文件夹 -hdpi,-xhdpi,-xxhdpi,把-sw240dp里的适配文件拷到-hdpi中,320的拷到xhpi中,360的拷到xxhpi中。这是因为3.2以下的手机没法找到-sw<N>dp的文件夹导致无法适配,同时考虑到现在市场上3.2以下的老古董手机占比只有10%多点,因此对此类系统的手机用-hdpi,-xhdpi,-xxhdpi适配即可

经过上述步骤,你即可以把大部分的手机用简单的方法进行了适配。


如果有疑问或者建议,欢迎大家提问或者指正~如有转载请注明出处,谢谢~

0 0
原创粉丝点击