二、术语和概念

四种屏幕尺寸分类:: small, normal, large, and xlarge

四种密度分类: ldpi (low), mdpi (medium), hdpi (high), and xhdpi (extra high)

需要注意的是: xhdpi是从 Android 2.2 (API Level 8)才开始增加的分类.

xlarge是从Android 2.3 (API Level 9)才开始增加的分类.

DPI是“dot per inch”的缩写,每英寸像素数。

一般情况下的普通屏幕:ldpi是120,mdpi是160,hdpi是240,xhdpi是320。

三、如何做到自适应屏幕大小呢?

1)界面布局方面

需要根据物理尺寸的大小准备5套布局,layout(放一些通用布局xml文件,比如界面中顶部和底部的布局,不会随着屏幕大小变化,类似windos窗

口的title

bar),layout-small(屏幕尺寸小于3英寸左右的布局),layout-normal(屏幕尺寸小于4.5英寸左右),layout-

large(4英寸-7英寸之间),layout-xlarge(7-10英寸之间)

2)图片资源方面

需要根据dpi值准备5套图片资源,drawable,drawalbe-ldpi,drawable-mdpi,drawable-hdpi,drawable-xhdpi

Android有个自动匹配机制去选择对应的布局和图片资源

四、两种获取屏幕分辨率信息的方法:

DisplayMetrics metrics = new DisplayMetrics();

Display display = activity.getWindowManager().getDefaultDisplay();

display.getMetrics(metrics);

//这里得到的像素值是设备独立像素dp

//DisplayMetrics metrics=activity.getResources().getDisplayMetrics(); 这样获得的参数信息不正确,不要使用这种方式。

不能使用android.content.res.Resources.getSystem().getDisplayMetrics()。这个得到的宽和高是空的。

五、关于图片制作

1)关于设计:

设计图先定下一个要设计的尺寸,而且尽量采用在目前最流行的屏幕尺寸(比如目前占屏幕比重比较多的是480系列,也即是480*800或者400*854,下面的图标制作也在次基础上进行比例的换算)上设计。

先了解一下屏幕的级别:

屏幕级别

屏幕密度

比率(相对)

物理大小(英寸)

像素大小

通常的分辨率

ldpi

120

3

0.75

1

120

mdpi

160

4

1

1

160

320*480

hdpi

240

6

1.5

1

240

480*800

xhdpi

320

8

2

1

320

720*1280

xxhdpi

480

12

3

1

480

1080*1800

说明:

屏幕级别:

注意屏幕级别是按照密度分级,和像素没有关系。如果非要让密度和像素扯上关系,则需要一个参照系,android使

用mdpi级别作为标准参照屏幕,也就是说在320*480分辨率的手机上一个密度可以容纳一个像素。然后其他密度级别则在此基础上进行对比。如果理想情

况下,480*800的屏幕一个密度可以容纳1.5个像素。

物理大小:

单位是英寸而不是像素,也就说一个英寸在任何分辨率下显示的大小都是一样的,但是像素在密度不同的手机里面显示的实际的大小是不一样的(这就是为什么android手机需要适配的原因)。

然后就是重点。

假设1像素在160密度下显示1英寸,则1像素在240密度基础上显示大约0.67英寸,在320密度下显示0.5英寸。于是就出现一种情况,在电脑上的一个像素,在不同的手机上看实际的大小不一样。那么怎么让“设计效果”在不同的手机上看起来显示的区域一样呢?

还是假设一个像素在160密度下的显示在一个密度内,也假设就是一英寸。那么需要几个像素才能在240密度级别下显示在一英寸范围内呢?答案是1.5个像素(根据上图的比率换算)。

了解了这个关系,接下来就是图标的制作。

2)关于切图。

关于切图有几个建议:

第一,长宽最好是3的倍数(根据android的推荐logo图标的大小是48(mdpi),72(hdpi),96(xhdpi)得出的最小公约数)。

第二,长宽最好是偶数。因为奇数在进行等比压缩的时候可能有问题。

第三,根据上面两条,如果长宽是6的倍数最理想。

第四,如果可以拉伸而不改变设计意图的情况下,比如纯色背景,则使用android的9path工具制作成.9的图片。

3)关于图标的适配。

然后接下来的一切就和设计稿没什么关系。在切好图的基础上,根据屏幕密度、像素和实际大小的比例关系。假如设计司在

480*800的分辨率下做好了设计图,并且切好图,如果你需要适配720*1280屏幕,该怎么做?根据比例,他们的关系是2:3,于是你需要按照

1.5倍比例制作图标,比如你在480*800的设计稿上切下来一个20*20像素的图,那么你就需要制作一个等比放大成30*30像素的图标,这样同一

个图标在480*800的屏幕和720*1280的屏幕上显示的实际大小才一样。同理,如果你需要适配xxhdpi则需要在20*20的基础上制作一个等

比放大成40*40像素的图标。

4)关于图标的目录,480*800切下来的图我们放在drawable-hdpi目录下,按照2:3放大的图标放在drawable-xhdpi目录下,按照2倍放大的图标放在drawable-xxhdpi目录下。

android会根据手机的密度优先查找对应的目录的资源,

比如408*800分辨率下的手机如果密度是160,则自动加载drawable-hdpi这个目录下的图标,

如果720*1280密度是240的手机自动加载drawable-xhdpi这个目录下的图标。如果没有这个文件夹,则查找和240最接近的对应密度文件夹。

5)其它

接下来要说的估计会让你失望,根据上面的步骤也不能完全解决适配的问题,只能是大概适配,而就算根据上面的步骤大概适配了,实际在手机上的效果也有出入。

比如魅族MX3的分辨率是1080*1800,标准情况下密度是480,但是他的密度大约是524,和480接近,

也就是会查找drawable-xxhdpi这个资源下的文件。也就是说你在480*800分辨率下切图然后按两倍放大的图标在这台手机上显示的效果还是

比实际的小。

而另一个要说的问题是540*960或者640*960,他们的密度很可能是或者接近240也可能是320。于是在480*800的设计稿上切下来的图并且进行的适配制作,在这些手机上显示的实际大小也可能或大或小。

综上所述,我也只是把我的理解和经验分享一下,但是并不能完美适配屏幕,仅仅当做抛砖引玉,如果您路过并且看到这份建议,如果你正好有更好的方案能够进行适配,请不吝赐教。

在代码中获取屏幕像素、屏幕密度

DisplayMetrics metric = new DisplayMetrics();

getWindowManager().getDefaultDisplay().getMetrics(metric);

int width = metric.widthPixels; // 屏幕宽度(像素)

int height = metric.heightPixels; // 屏幕高度(像素)

float density = metric.density; // 屏幕密度(0.75 / 1.0 / 1.5)

int densityDpi = metric.densityDpi; // 屏幕密度DPI(120 / 160 / 240)

DPI是“dot per inch”的缩写,每英寸像素数。

一般情况下的普通屏幕:ldpi是120,mdpi是160,hdpi是240,xhdpi是320。

参考:http://developer.android.com/images/screens_support/screens-ranges.png

附加:配置限定符名称

配置

限定符值

说明

MCC和MNC

例如:

mcc310

mcc310-mnc004

mcc208-mnc00

MCC是移动国家代码的英文首字母缩写(The mobile country

code),它的后面可选择性的跟随来自设备内的SIM卡的移动网络代码(MNC:mobile network

code)。如在任何载体上,mcc310代表美国,mcc310-mnc004代表美国的Venizon公司,mcc208-mnc00代表法国的

Orange公司。

如果设备使用音频连接(GSM 电话),那么MCC和MNC的值来自SIM卡。

也可以单独使用MCC(例如,在应用程序中包含特殊国家合法的资源)。如果仅需要指定语言环境,那么可以使用language和region限定符来替代(稍后讨论)。如果决定要使用MCC和MNC限定符,就要仔细测试,使它能够满足你所期望的工作。

还可以查看配置域mcc和mnc,它们分别指示了当前的移动国家代码和移动网络代码。

mcc:http://developer.android.com/reference/android/content/res/Configuration.html#mcc

mnc:http://developer.android.com/reference/android/content/res/Configuration.html#mnc

语言和地区

例如:

en

fr

en-rUS

fr-rFR

fr-rCA

语言是用两个字母的ISO 639-1语言代码定义的,紧跟其后的是可选的两个ISO-3166-1-appha-2地区代码字母(前面是小写的“r”)。

这个编码不区分大小写,r前缀被用于区分地区部分,不能够单独指定地区。

如果用户改变了系统中的语言设置,那么在应用程序的运行期间也能够改变为对应的语言。

最小宽度

swdp

例如:

sw320dp

sw600dp

sw720dp

屏幕的基本尺寸,是指最短的可用屏幕区域。具体的说,设备的最小宽度是屏幕可用的宽度和高度中最短的那个(也可以把它看做是屏幕的最小可能的宽度)。这样就可以使用这个限定符来确保应用程序至少有dp的宽度可用于UI界面,而不管屏幕的当前方向。

如,如果布局在任何时候都需要至少600dp的最小屏幕尺寸,那么就能够使用这个限定符,在res/layout-sw600dp/目录中创建布局资源。

系统只会在可用屏幕的尺寸至少是600dp的时候才会使用这些资源,而不管600dp是否是被用户认知的高度或宽度。最小宽度是设备的固定屏幕尺寸特征,

当屏幕的方向发生改变时,设备的最小宽度不改变。

设备的最小宽度需要考虑屏幕的装饰和系统UI的占用。例如,如果设备有一些固定的UI元素要沿着

最小宽度的轴向,占用一定的屏幕空间,那么系统声明的最小宽度要比实际的屏幕尺寸要小,因为被系统占用的像素部分对用户应用程序的UI无效。因此,这个值

应该是应用程序布局所需要的最小的实际尺寸(通常,这个值是布局支持的最小宽度,而不管屏幕的当前方向)。

以下是可以使用的通用屏幕尺寸的一些值:

1.320,针对以下屏幕配置的设备:

240x320ldpi(QVGA手持设备)

320x480mdpi(手持设备)

480x800hdpi(高分辨率手持设备)

2.480,针对480x800mdpi的屏幕(平板或手持设备)

3.600,针对600x1024mdip的屏幕(7英寸平板)

4.720,针对720x1280mdip的屏幕(10英寸平板)

当应用程序提供了多个带有不同值的最小宽度限定符资源目录时,系统会使用最接近(不超出)设备最小宽度的那个资源。

这个限定符被添加在API级别13中。

还要看android:requiresSmallestWidthDp属性,它声明了与你的应用程序兼容的最小的最小宽度,并且smallestScreenWidthDp配置字段会持有这个设备最小宽度的值。

可用宽度

wdp

例如:

w720dp

w1024dp

指定最小的可用屏幕宽度,在资源中应该以dp为单位来定义的值。当方向在横向和纵向之间改变时,这个配置值会跟当前的实际的宽度相匹配。

应用程序给这个配置提供了多个不同值的资源目录时,系统会使用最接近(不超过)设备当前屏幕宽度的那个配置。这个值需要考虑屏幕装饰占据的空间,因此,如

果设备在显示的左边或右边有一些固定的UI元素,那么使用的宽度值就要比实际的屏幕尺寸小,因为这些固定UI元素的占用,使得应用程序的可用空间减少。

这个特性被添加在API级别13中

还要看screenWidthDp配置字段,它持有当前的屏幕宽度。

可用高度

hdp

例如:

h720dp

h1024dp

指定最小的可用屏幕高度,在资源中应该以dp为单位来定义的值,当方向在横向和纵向直接改变时,这个配置值应该跟当前的实际高度匹配。

应用程序给这个配置提供了不同值的多个资源目录时,系统会使用最接近(不超过)设备当前屏幕高度的那个配置。这个要考虑屏幕装饰的占用情况,因此,如果设

备在显示的上方或底部有一些固定的UI元素,那么要使用的高度值要比实际的屏幕尺寸小,因为这些固定UI元素的占用,使得应用程序的可用空间减少。不固定

的屏幕装饰(如电话的状态栏能够在全屏时被隐藏)是不考虑的,像标题栏或操作栏这样的窗口装饰也不考虑,因此应用必须准备处理比它们指定的空间要小的情

况。

这个限定符被添加在API级别13中。

还要看screenHeightDp配置字段,它持有当前屏幕的高度。

屏幕尺寸

small

normal

large

xlarge

small:这种屏类似低分辨率的QVGA屏幕。对于小屏的最小布局尺寸大约是320x426dp。例如QVGA低分辨率和VGA高分辨率。

normal:这种屏类似中等分辨率的HVGA屏幕。对于普通屏幕的最小布局尺寸大约是320x470dp。如,WQVGA低分辨率屏、HVGA中等分辨率屏、WVGA高分辨率屏。

large:这种屏类似中等分辨率的VGA屏幕,对于大屏幕的最小布局尺寸大约是480x640dp。例如VGA和WVGA的中等分辨率屏。

xlarge:这种屏被认为比传统的中等分辨率的HVGA屏幕大。针对xlarge屏的最小布局尺寸大约是720x960dp。在大多数情况下,这种超大屏幕的设备因为太大而要放到背包中来携带,而且最有可能的是平板样式的设备。

注意:使用尺寸限定符不意味着资源仅用于这个尺寸的屏幕。如果没有用限定符提供与当前设备配置相匹配的可选资源,那么系统会使用与配置最接近的资源。

警告:如果所有使用尺寸限定符的资源都比当前屏幕大,那么系统将不会使用它们,并且应用程序会在运行时崩溃(例如,如果所有的布局都被标记了xlarge限定符,而设备却是一个普通尺寸的屏幕)。

这个限定符被添加在API级别4以后的版本中。

屏幕外观

long

notlong

long:长屏幕,如WQVGA、WVGA、FWVGA

notlong:非长屏幕,如QVGA、HVGA、VGA

这个限定符被添加在API级别4以后的版本中

这个限定符完全是基于屏幕的外观比率,不相对屏幕的方向。

还要看screenLayout配置字段,它指示了屏幕是否是长屏。

屏幕方向

port

land

port:纵向设备(垂直)

land:横向设备(水平)

如果用户旋转屏幕,这个限定能够在应用程序运行期间改变。

orientation配置字段指示当前设备的方向。

泊位模式

car

desk

car:设备停靠在汽车中

desk:设备停靠在书桌中

这个限定符被添加在API级别8以后的版本中

如果用户改变了设备的停靠地点,那么能够在应用程序的运行期间改变这个限定。可以使用UiModeManager对象来启用或禁止这种模式。

夜间模式

night

notnight

night:夜间

notnight:白天

被添加在API级别8以后的版本中

如果夜间模式被保留在自动模式中(默认),那么在应用程序运行期间,会基于白天的时间来进行模式的改变。可以使用UiModeManager对象来启用或禁止这种模式。

屏幕像素密度(dpi)

ldpi

mdpi

hdpi

xhdpi

nodpi

tvdpi

ldpi:针对大约120dpi的低分辨率屏幕;

mdpi:针对大约160dpi的中等分辨率屏幕(在传统的HVGA上);

hdpi:针对大约240dpi的高分辨率屏幕;

xhdpi:针对大约320dpi的超高分辨率屏幕,被添加在API基本8以后的版本中;

nodpi:这个限定被用于不想根据匹配的设备分辨率进行缩放的位图资源。

tvdpi:

在mdpi和hdpi之间的屏幕,大约是213dpi。这种分组不是主要的分辨率,大多数是为电视来考虑的,并且大多数应用不需要它---提供mdpi和

hdpi资源就可以满足大多数应用程序需要了,并且系统会适当的缩放它们。这个限定符在API级别13以后被引入。

四种主要的分辨率之间的缩放比例是:3:4:6:8(忽略tvdpi分辨率),因此一个9x9的ldpi位图,在mdpi中是12x12、在hdpi中是18x18、在xhdpi中是24x24。

如果感觉在电视或其他某些设备上的图片资源不好看,并且想要试用tvdpi资源,那么缩放因子是1.33*mdpi。例如,一个100px x 100px的mdpi图片的图片应该被放大成133px x 133px的tvdpi图片。

注意:使用分辨率限定符不意味着资源仅适用与对应分辨率的屏幕。如果没有提供与当前设备配置匹配的可选资源,那么系统会使用最接近的资源。

触屏类型

notouch

stylus

finger

notouch:非触屏设备

stylus:有适用手写笔的电阻屏设备

finger:触屏设备

touchscreen配置字段,指示到了设备上的触屏类型。

键盘可用性

keysexposed

keyshidden

keyssoft

keysexposed:设备有可用的键盘。如果设备启用了软键盘,那么即使在硬键盘没有暴露给用户时也可以使用这个限定符。如果没有提供软键盘或者软键盘被禁用,那么只有在硬键盘被暴露给用户时才能够使用这个限定符。

keyshidden:设备有可用的硬键盘,但是被隐藏了,并且设备没有可用的软键盘。

keyssoft:设备有可用的软键盘,不管它是否可见。

如果提供了keysexposed资源,但没有keyssoft资源,那么只要系统有可用的软键盘,系统就会使用keysexposed资源而不管键盘是否可见。

如果用户打开了硬键盘,就可以在应用程序运行期间改变这个限定。

hardKeyboardHidden和keyboardHidden配置字段分别指明硬键盘的可见性以及可见的键盘类型(包括软键盘)。

主要文本输入法

nokeys

qwerty

l2key

nokeys:设备没有用于文本输入的硬键盘;

qwerty:设备有标准的硬键盘,不管用户是否可见;

12key:设备有12个键的硬键盘,不管用户是否可见。

keyboard配置字段指明可用的主要文本输入方法。

导航键的有效性

navexposed

navhidden

navexposed:导航键对用户可用;

navhidden:导航键不可用。

如果用户能够看到导航键,那么在应用程序运行时就能够改变这个限定。

navigationHidden配置字段,指示导航键是否隐藏。

主要的非触屏导航方法

nonav

dpad

trackball

wheel

nonav:除了使用触屏以外,设备没有其他导航设施。

dpad:设备有用于导航的定向板(d-pad)。

trackball:设备有用于导航的轨迹球。

wheel:设备有用于导航的定向滚轮(不常见)。

navigation配置字段指明可用的导航方法类型。

平台版本(API 级别)

例如:

v3

v4

v7

设备支持的API级别。如v1代表API级别1(带有Android1.0或更高版的设备),v4代表API级别4(带有Android1.6或更高版本的设备)

警告:Android1.5和1.6只有在限定符跟平台版本完全匹配时,才能匹配资源

android屏幕适配无效_android屏幕适配详解相关推荐

  1. android屏幕适配无效_Android屏幕适配之全面屏适配

    引言 从2017年开始,全面屏之战逐渐如火如荼的展开了,那么我们Android程序员又多了一个小事情,就是解决全面屏适配的问题. 全面屏和以前的屏幕相比,有以下几点改变 以前 16 : 9 的 比例 ...

  2. android屏幕适配无效_Android屏幕适配出现的原因

    在我们学习如何进行屏幕适配之前,我们需要先了解下为什么Android需要进行屏幕适配. 由于Android系统的开放性,任何用户.开发者.OEM厂商.运营商都可以对Android进行定制,修改成他们想 ...

  3. android 子module混淆_Android 矢量图详解

    官方文档 关于 Vector,在官方开发指南中介绍.本文章是由个人翻译官方指南然后添加个人理解完成. 由于个人精力有限,多个渠道发布,排版上可能会有问题,如果影响查看,请移步 Android 开发者家 ...

  4. android 截图 listview,Android屏幕及view的截图实例详解

    Android屏幕及view的截图实例详解 屏幕可见区域的截图 整个屏幕截图的话可以用View view = getWindow().getDecorView(); public static Bit ...

  5. android怎么把动图变成视频格式,Android 录制手机屏幕视频生成GIF图片实例详解

    Android 录制手机屏幕视频生成GIF图片实例详解 无图无真相,在我们日常的网络交流中往往需要给交流对象提供直观的显示,而视频是一个很好的方式,但是视频需要播放器,还需要当做文件进行对点传输,并不 ...

  6. Android 8.0学习(32)---Android 8.0源码目录结构详解

    Android 8.0源码目录结构详解 android的移植按如下流程:     (1)android linux 内核的普通驱动移植,让内核可以在目标平台上运行起来.     (2)正确挂载文件系统 ...

  7. Android 各大厂面试题汇总与详解(持续更新)

    介绍 目前网络中出现了好多各种面试题的汇总,有真实的也有虚假的,所以今年我将会汇总各大公司面试比较常见的问题,逐一进行解答.会一直集成,也会收集大家提供的面试题,如有错误,请大家指出,经过排查存在,会 ...

  8. Android性能优化之APK瘦身详解(瘦身73%)

    image 公司项目在不断的改版迭代中,代码在不断的累加,终于apk包不负重负了,已经到了八十多M了.可能要换种方式表达,到目前为止没有正真的往外推过,一直在内部执行7天讨论需求,5天代码实现的阶段. ...

  9. Android进阶笔记:Messenger源码详解

    Messenger可以理解为一个是用于发送消息的一个类用法也很多,这里主要分析一下再跨进程的情况下Messenger的实现流程与源码分析.相信结合前面两篇关于aidl解析文章能够更好的对aidl有一个 ...

最新文章

  1. jQueryDOM操作
  2. Learning to Rank简介
  3. wxWidgets随笔(4)-hello,world
  4. Gym 100553J Jokewithpermutation(dfs)
  5. python 自动复制分类_leetcode python 常见分类问题模板(复制粘贴就能用) 更新中......
  6. java大数据组件Kafka
  7. windows 远程 登录无操作30分钟后自动退出登录_Mac电脑如何远程Windows10
  8. 跨境电商ERP有哪些?
  9. 2018-2019-2 网络对抗技术 20165334 Exp7 网络欺诈防范
  10. vue-axios配置token,上传图片
  11. linux内核配置usb虚拟串口,霍尼韦尔是否能提供USB串口仿真的Linux驱动程序?
  12. Solidity常见问题
  13. [2018.10.31 T2] 电梯
  14. 怎樣制作线段动画_PPT如何制作简易动画
  15. linux中文件颜色,蓝色,白色等各自代表的含义
  16. 两因素身份验证增强您的Spring Security
  17. 微带线电容设计与仿真
  18. rss和css,RSS 简介
  19. QT 语言学习 day07 ui 界面 三种样式的按钮开关的制作!
  20. ArcGIS API for javascript开发笔记 —— 地图打印

热门文章

  1. DB2按照字段的指定顺序排序
  2. [牢饭吃到饱?]制作爬取某网站表情包下载器
  3. urlparse和urlsplit函数的区别 Python学习笔记
  4. 香肠派对吃鸡手游灵敏度怎么设置?全网通用香肠派对最强灵敏度
  5. java计算机毕业设计中国古诗词学习平台源码+mysql数据库+系统+lw文档+部署
  6. 【趣学算法】-Day2-贪心算法
  7. c语言分支结构程序设计课件,C语言 分支结构程序设计.ppt
  8. 授予用户在此计算机的请求登录,解决未授予用户在此计算机上的请求登录类型方法...
  9. Java 使图片旋转以及水平翻转垂直翻转(详细且可用)
  10. clickhouse之bitmap