在之前的文章中,我们已经讲到了 Android 屏幕适配的一些知识,大家感兴趣的话,可参考以下文章
鸡泽网站制作公司哪家好,找创新互联!从网页设计、网站建设、微信开发、APP开发、响应式网站设计等网站项目制作,到程序开发,运营维护。创新互联公司2013年成立到现在10年的时间,我们拥有了丰富的建站经验和运维经验,来保证我们的工作的顺利进行。专注于网站建设就选创新互联。
Android屏幕适配(1) — 概念解释
Android屏幕适配(2) — drawable与mipmap
大家都知道在 Android 资源文件夹 res/ 下,我们经常能看到 layout-sw720 , drawable-xhdpi , values-w480 等字样文件夹,那么 res/ 下到底有哪些文件夹可以命名,命名规则如何?这节我们来讲讲关于 Android 资源文件夹 res/ 下各文件夹的命名。
今天涉及的知识点有:
res/ 文件夹下常用资源文件夹类型有:
一直以来对于系统选择资源文件的流程都模糊不清,每次定义资源的时候都战战兢兢,终于忍无可忍,无需再忍,决定掏出官方文档来仔细瞧一瞧。摘要记录,以防忘记。
官方文档
一个简单的项目目录如下所示:
其中资源文件放置在res目录下,res支持的资源目录和类型如下:
对于一个资源文件,针对设备的不同,需要提供一整套的资源文件供程序运行时根据设备和运行条件(横屏或者竖屏、移动还是联通)的不同来选择合适的资源文件。
资源文件必须名称相同地放置到合适的资源文件夹下面,而 资源文件夹的命名至关重要 。资源文件夹必须严格按照“资源类型名称-配置1-配置2-...”的方式进行命名,如图2中,drawable是资源类型,hdpi是一个分辨率的配置。在drawable-hdpi和drawble文件夹中分别放置相同名称的高分辨率和默认配置的2个资源文件。
设备在运行时选择资源的标准就是按照资源文件夹的命名来匹配选择最优的资源文件。 设备按如下表的配置顺序依次匹配来选择最佳的资源(注意: 下表的配置仅为主要配置,不是全部。 ):
对于资源文件夹的命名必须按照上表中的顺序依次配置,切不可倒置。
android系统按照如图3所示进行资源的匹配选择。
例如app有以下资源文件夹:
drawable/
drawable-en/
drawable-fr-rCA/
drawable-en-port/
drawable-en-notouch-12key/
drawable-port-ldpi/
drawable-port-notouch-12key/
系统配置:
运营商 = mcc400-mnc00
语言区域 = en-rGB
屏幕方向 = port
屏幕密度 = hdpi
触屏类型 = nottouch
开始选择:
请确保 每种配置都有一个默认的资源可以进行选择 ,这样在出现设备没有任何匹配文件夹的情况下可以选择默认的文件夹中的资源而不至于导致系统崩溃。例如,如果我们只配置2种文件夹values-en,values-zh,那么在设备语言为法语(fr)的情况下,按照先移除冲突的资源文件夹的准则,这2个资源文件夹都被移除了已经没有其他可以选择的资源文件了,系统会崩溃, 所有任何资源文件夹都请保留一个默认名称的资源文件夹 。
有时候有些资源希望在不同的配置下可以服用,例如一个很大的背景图片希望在语言为中文(zh)和英文(en)的情况下都使用,这时候如果在drawable-zh和drawable-en的文件夹下面都放置一种图片当然是可以的,只是这样会造成apk的体积过大。这时候可以将此图拷贝到drawable/文件夹下命名为icon_zh_en,而在
drawable-en和drawable-zh文件夹下分别保存下面的icon.xml文件,那么同样载en和zh的配置下也可以通过引用R.drawable.icon引用到图片,从而对apk瘦身。同样对于资源文件、数组、布局文件都可以使用别名来引用以达到避免资源重复的问题。
针对大多数APK应用程序,开发人员都会提供各种不同的资源。比如对于同一张图片image.png,我们通常会提供高分辨率,中分辨率和低分辨率三个版本。
res/
drawable/
image.png
drawable-hdpi/
image.png
drawable-mdpi/
image.png
drawable-ldpi/
image.png
它们都必须以相同的名字存储在各个drawable目录下。当应用程序运行时,系统会根据当前设备的实际分辨率来选择最佳的资源。
那么系统运行时如何动态选择最合适的资源来使用呢?
理解最佳资源的匹配过程至少有两个好处:
当设计应用程序时,我们可以有针对性地提供正确的资源。
对于适配多种设备有重要的指导意义。
资源标签属性及优先级
理解最佳资源匹配过程之前,我们先来看一下资源标签的属性和优先级。所谓优先级顺序指的是Android规定的资源标签属性的优先级。
其实除了分辨率外,同种资源之间还可以有下面许多资源属性标签,它们在匹配过程中是有优先级顺序的。
以下资源标签修饰语按照优先级从高到低的顺序排列。
MCC和MNC
MCC(Mobile Country Code)和MNC(Mobile Network
Code)是网络运营商的全球唯一编号。其中MCC指国家码,MNC指网络号。
例如,MCC-310属于美国,MCC-460属于中国。460-00代表中国移动,460-01代表中国联通。一般情况下,SIM卡中存有此卡的主归属地。
用作资源标签时,可以同时使用MCC和MNC
组合,也可以只使用MCC。例如,mcc460,mcc460-mnc00。程序编码时,可以使用Configuration类中的mcc和mnc属性来获取当前设备的这两个值。
语言和地区
Android系统采用ISO
639-1国际语言码,由两个字母组成。地区代码遵循3166-1-alpha-2标准执行,也由两个字母组成,是可选的。如何组合使用需要加”r”.例如en表示英语,fr表示法语,en-rUS表示英语和美国地区。程序中可以通过Configuration类的locale属性值来获取当前设备的语言地区信息。
最小宽度(Smallest Width)
格式为 swNdp
例如用res/layout-sw600dp来标志自己的布局资源,相当于告诉系统,屏幕的可显示尺寸必须在任何时刻都大于600dp(不管横屏还是竖屏),才可以使用这一资源。与设备语言值不同的是,设备最小宽度不会随系统设置的变化而改变,它是固定的。
可以在AndroidManifest.xml中,通过指定"android:requiresSmallestWidthDp"属性值来表示此程序要求的最小宽度值。代码中可以通过Configuration类中的smallestScreenWidthDp成员变量来获取当前设备的最小宽度值。
可用宽度(Available Width)
格式为 wNdp
设备的可用宽度值随着当前是横屏还是竖屏会产生变化,即它表示的是当前真实的宽度值。如果多种可选资源中都采用了这一标签修饰,那么系统会自动选择一个最接近于(但不超过)当前值得资源。
例如w720dp,代码中可以通过Configuration类的screenWidthDp成员变量来获取当前的可用宽度值。
可用高度(Available Height)
格式为:hNdp
和可用宽度表达含义类似,只不过这里值高度。代码中可以通过Configuration类的screenHeightDp成员变量来获取当前的可用宽度值。
屏幕大小(Screen Size)
Android设备尺寸众多,大致将屏幕尺寸分为以下几类:
small
尺寸类似于QVGA-低密度和VGA-高密度的屏幕,归属于这一类。最小尺寸布局约为320*426dp。
normal
尺寸类似于HVGA-中密度,WVGA-低密度和WQVGA-低密度的屏幕属于这一类。最小尺寸约为320*470dp.
large
尺寸类似于VGA-中密度和WVGA-中密度的屏幕属于这一类。最小尺寸约为480*640dp.
xlarge
对于尺寸远超过HVGA-中密度的屏幕属于这一类。最小布局尺寸约为720*960dp,这种尺寸基本用于平板电脑而不是移动电话。
代码中通过Configuration类中的screenLayout成员变量来获取当前设备的屏幕大小。
屏幕宽高外观(Screen Aspect)
指的是当前屏幕的宽高比(aspect ratio)。分为以下两种
long
长屏幕,如WQVGA,WVGA,FWVGA等。
nolong
非长屏幕,如QVGA,HVGA,VGA等。
可以通过Configuration类中的screenLayout成员变量来获知屏幕是否为长屏。
屏幕方向(Screen Orientation)
分为两种,竖屏(port)和横屏(land)。
这个值会随着用户的操作而变化,但我们可以通过Configuration类中的orientation成员变量来获知当前设备的屏幕方向。
UI模式(UI mode)
分为以下几种:car,desk,television,appliance.
表示设备被放置在底盘(dock)时的模式,如汽车上的手机托盘,桌面托盘等。这个模式会随着用户的操作而改变,可以通过UiModeManager来开启和关闭这一功能。
夜间模式(Night Mode)
分为两种,night(处于夜间模式)和notnight(非夜间模式)。
可以通过UiModeManager来开启和关闭这一功能。
屏幕像素密度(dpi)
ldpi
低密度屏幕,大约120dpi
mdpi
中密度屏幕,大约160dpi
hdpi
高密度屏幕,大约240dpi
xhdpi
超高密度屏幕,大学320dpi
nodpi
表示这些资源不希望被改变尺寸以适应屏幕。
tvdpi
介于mdpi和hdpi之间,大约213dpi,主要用于电视产品,普通应用程序并不推荐使用。
触摸屏类型(Touchscreen Type)
分为notouch(设备不带触摸屏)和finger(触摸屏通过手指操作)。
通过Configuration类中的touchscreen成员变量来获知当前设备的触摸屏类型。
键盘可用性
分为以下三种状态
keysexposed
设备有可用键盘。如果当前的软键盘被启用,那么即便设备没有键盘或者键盘不可用,这个状态仍可能有效。
keyshidden
设备有键盘,但当前被隐藏,而且没有软键盘启用。
keysoft
设备当前软键盘启动,即便它处于可见或不可见状态。
这个值在运行过程中会发生变化,可以通过Configuration类的hardkeyboardHidden和keyboardHidden变量来获知当前状态。
售后响应及时
7×24小时客服热线数据备份
更安全、更高效、更稳定价格公道精准
项目经理精准报价不弄虚作假合作无风险
重合同讲信誉,无效全额退款