新聞中心
Android屏幕適配(3) — 資源文件夾命名與匹配規(guī)則
在之前的文章中,我們已經(jīng)講到了 Android 屏幕適配的一些知識(shí),大家感興趣的話,可參考以下文章
雞澤網(wǎng)站制作公司哪家好,找創(chuàng)新互聯(lián)!從網(wǎng)頁(yè)設(shè)計(jì)、網(wǎng)站建設(shè)、微信開(kāi)發(fā)、APP開(kāi)發(fā)、響應(yīng)式網(wǎng)站設(shè)計(jì)等網(wǎng)站項(xiàng)目制作,到程序開(kāi)發(fā),運(yùn)營(yíng)維護(hù)。創(chuàng)新互聯(lián)公司2013年成立到現(xiàn)在10年的時(shí)間,我們擁有了豐富的建站經(jīng)驗(yàn)和運(yùn)維經(jīng)驗(yàn),來(lái)保證我們的工作的順利進(jìn)行。專注于網(wǎng)站建設(shè)就選創(chuàng)新互聯(lián)。
Android屏幕適配(1) — 概念解釋
Android屏幕適配(2) — drawable與mipmap
大家都知道在 Android 資源文件夾 res/ 下,我們經(jīng)常能看到 layout-sw720 , drawable-xhdpi , values-w480 等字樣文件夾,那么 res/ 下到底有哪些文件夾可以命名,命名規(guī)則如何?這節(jié)我們來(lái)講講關(guān)于 Android 資源文件夾 res/ 下各文件夾的命名。
今天涉及的知識(shí)點(diǎn)有:
res/ 文件夾下常用資源文件夾類(lèi)型有:
Android 資源文件匹配
一直以來(lái)對(duì)于系統(tǒng)選擇資源文件的流程都模糊不清,每次定義資源的時(shí)候都戰(zhàn)戰(zhàn)兢兢,終于忍無(wú)可忍,無(wú)需再忍,決定掏出官方文檔來(lái)仔細(xì)瞧一瞧。摘要記錄,以防忘記。
官方文檔
一個(gè)簡(jiǎn)單的項(xiàng)目目錄如下所示:
其中資源文件放置在res目錄下,res支持的資源目錄和類(lèi)型如下:
對(duì)于一個(gè)資源文件,針對(duì)設(shè)備的不同,需要提供一整套的資源文件供程序運(yùn)行時(shí)根據(jù)設(shè)備和運(yùn)行條件(橫屏或者豎屏、移動(dòng)還是聯(lián)通)的不同來(lái)選擇合適的資源文件。
資源文件必須名稱相同地放置到合適的資源文件夾下面,而 資源文件夾的命名至關(guān)重要 。資源文件夾必須嚴(yán)格按照“資源類(lèi)型名稱-配置1-配置2-...”的方式進(jìn)行命名,如圖2中,drawable是資源類(lèi)型,hdpi是一個(gè)分辨率的配置。在drawable-hdpi和drawble文件夾中分別放置相同名稱的高分辨率和默認(rèn)配置的2個(gè)資源文件。
設(shè)備在運(yùn)行時(shí)選擇資源的標(biāo)準(zhǔn)就是按照資源文件夾的命名來(lái)匹配選擇最優(yōu)的資源文件。 設(shè)備按如下表的配置順序依次匹配來(lái)選擇最佳的資源(注意: 下表的配置僅為主要配置,不是全部。 ):
對(duì)于資源文件夾的命名必須按照上表中的順序依次配置,切不可倒置。
android系統(tǒng)按照如圖3所示進(jìn)行資源的匹配選擇。
例如app有以下資源文件夾:
drawable/
drawable-en/
drawable-fr-rCA/
drawable-en-port/
drawable-en-notouch-12key/
drawable-port-ldpi/
drawable-port-notouch-12key/
系統(tǒng)配置:
運(yùn)營(yíng)商 = mcc400-mnc00
語(yǔ)言區(qū)域 = en-rGB
屏幕方向 = port
屏幕密度 = hdpi
觸屏類(lèi)型 = nottouch
開(kāi)始選擇:
請(qǐng)確保 每種配置都有一個(gè)默認(rèn)的資源可以進(jìn)行選擇 ,這樣在出現(xiàn)設(shè)備沒(méi)有任何匹配文件夾的情況下可以選擇默認(rèn)的文件夾中的資源而不至于導(dǎo)致系統(tǒng)崩潰。例如,如果我們只配置2種文件夾values-en,values-zh,那么在設(shè)備語(yǔ)言為法語(yǔ)(fr)的情況下,按照先移除沖突的資源文件夾的準(zhǔn)則,這2個(gè)資源文件夾都被移除了已經(jīng)沒(méi)有其他可以選擇的資源文件了,系統(tǒng)會(huì)崩潰, 所有任何資源文件夾都請(qǐng)保留一個(gè)默認(rèn)名稱的資源文件夾 。
有時(shí)候有些資源希望在不同的配置下可以服用,例如一個(gè)很大的背景圖片希望在語(yǔ)言為中文(zh)和英文(en)的情況下都使用,這時(shí)候如果在drawable-zh和drawable-en的文件夾下面都放置一種圖片當(dāng)然是可以的,只是這樣會(huì)造成apk的體積過(guò)大。這時(shí)候可以將此圖拷貝到drawable/文件夾下命名為icon_zh_en,而在
drawable-en和drawable-zh文件夾下分別保存下面的icon.xml文件,那么同樣載en和zh的配置下也可以通過(guò)引用R.drawable.icon引用到圖片,從而對(duì)apk瘦身。同樣對(duì)于資源文件、數(shù)組、布局文件都可以使用別名來(lái)引用以達(dá)到避免資源重復(fù)的問(wèn)題。
Android是怎樣匹配資源的
針對(duì)大多數(shù)APK應(yīng)用程序,開(kāi)發(fā)人員都會(huì)提供各種不同的資源。比如對(duì)于同一張圖片image.png,我們通常會(huì)提供高分辨率,中分辨率和低分辨率三個(gè)版本。
res/
drawable/
? ? ? ?image.png
drawable-hdpi/
? ? ? ?image.png
drawable-mdpi/
? ? ? ?image.png
drawable-ldpi/
? ? ? ?image.png
它們都必須以相同的名字存儲(chǔ)在各個(gè)drawable目錄下。當(dāng)應(yīng)用程序運(yùn)行時(shí),系統(tǒng)會(huì)根據(jù)當(dāng)前設(shè)備的實(shí)際分辨率來(lái)選擇最佳的資源。
那么系統(tǒng)運(yùn)行時(shí)如何動(dòng)態(tài)選擇最合適的資源來(lái)使用呢?
理解最佳資源的匹配過(guò)程至少有兩個(gè)好處:
當(dāng)設(shè)計(jì)應(yīng)用程序時(shí),我們可以有針對(duì)性地提供正確的資源。
對(duì)于適配多種設(shè)備有重要的指導(dǎo)意義。
資源標(biāo)簽屬性及優(yōu)先級(jí)
理解最佳資源匹配過(guò)程之前,我們先來(lái)看一下資源標(biāo)簽的屬性和優(yōu)先級(jí)。所謂優(yōu)先級(jí)順序指的是Android規(guī)定的資源標(biāo)簽屬性的優(yōu)先級(jí)。
其實(shí)除了分辨率外,同種資源之間還可以有下面許多資源屬性標(biāo)簽,它們?cè)谄ヅ溥^(guò)程中是有優(yōu)先級(jí)順序的。
以下資源標(biāo)簽修飾語(yǔ)按照優(yōu)先級(jí)從高到低的順序排列。
MCC和MNC
MCC(Mobile Country Code)和MNC(Mobile Network
Code)是網(wǎng)絡(luò)運(yùn)營(yíng)商的全球唯一編號(hào)。其中MCC指國(guó)家碼,MNC指網(wǎng)絡(luò)號(hào)。
例如,MCC-310屬于美國(guó),MCC-460屬于中國(guó)。460-00代表中國(guó)移動(dòng),460-01代表中國(guó)聯(lián)通。一般情況下,SIM卡中存有此卡的主歸屬地。
用作資源標(biāo)簽時(shí),可以同時(shí)使用MCC和MNC
組合,也可以只使用MCC。例如,mcc460,mcc460-mnc00。程序編碼時(shí),可以使用Configuration類(lèi)中的mcc和mnc屬性來(lái)獲取當(dāng)前設(shè)備的這兩個(gè)值。
語(yǔ)言和地區(qū)
Android系統(tǒng)采用ISO
639-1國(guó)際語(yǔ)言碼,由兩個(gè)字母組成。地區(qū)代碼遵循3166-1-alpha-2標(biāo)準(zhǔn)執(zhí)行,也由兩個(gè)字母組成,是可選的。如何組合使用需要加”r”.例如en表示英語(yǔ),fr表示法語(yǔ),en-rUS表示英語(yǔ)和美國(guó)地區(qū)。程序中可以通過(guò)Configuration類(lèi)的locale屬性值來(lái)獲取當(dāng)前設(shè)備的語(yǔ)言地區(qū)信息。
最小寬度(Smallest Width)
格式為 swNdp
例如用res/layout-sw600dp來(lái)標(biāo)志自己的布局資源,相當(dāng)于告訴系統(tǒng),屏幕的可顯示尺寸必須在任何時(shí)刻都大于600dp(不管橫屏還是豎屏),才可以使用這一資源。與設(shè)備語(yǔ)言值不同的是,設(shè)備最小寬度不會(huì)隨系統(tǒng)設(shè)置的變化而改變,它是固定的。
可以在AndroidManifest.xml中,通過(guò)指定"android:requiresSmallestWidthDp"屬性值來(lái)表示此程序要求的最小寬度值。代碼中可以通過(guò)Configuration類(lèi)中的smallestScreenWidthDp成員變量來(lái)獲取當(dāng)前設(shè)備的最小寬度值。
可用寬度(Available Width)
格式為 wNdp
設(shè)備的可用寬度值隨著當(dāng)前是橫屏還是豎屏?xí)a(chǎn)生變化,即它表示的是當(dāng)前真實(shí)的寬度值。如果多種可選資源中都采用了這一標(biāo)簽修飾,那么系統(tǒng)會(huì)自動(dòng)選擇一個(gè)最接近于(但不超過(guò))當(dāng)前值得資源。
例如w720dp,代碼中可以通過(guò)Configuration類(lèi)的screenWidthDp成員變量來(lái)獲取當(dāng)前的可用寬度值。
可用高度(Available Height)
格式為:hNdp
和可用寬度表達(dá)含義類(lèi)似,只不過(guò)這里值高度。代碼中可以通過(guò)Configuration類(lèi)的screenHeightDp成員變量來(lái)獲取當(dāng)前的可用寬度值。
屏幕大小(Screen Size)
Android設(shè)備尺寸眾多,大致將屏幕尺寸分為以下幾類(lèi):
small
尺寸類(lèi)似于QVGA-低密度和VGA-高密度的屏幕,歸屬于這一類(lèi)。最小尺寸布局約為320*426dp。
normal
尺寸類(lèi)似于HVGA-中密度,WVGA-低密度和WQVGA-低密度的屏幕屬于這一類(lèi)。最小尺寸約為320*470dp.
large
尺寸類(lèi)似于VGA-中密度和WVGA-中密度的屏幕屬于這一類(lèi)。最小尺寸約為480*640dp.
xlarge
對(duì)于尺寸遠(yuǎn)超過(guò)HVGA-中密度的屏幕屬于這一類(lèi)。最小布局尺寸約為720*960dp,這種尺寸基本用于平板電腦而不是移動(dòng)電話。
代碼中通過(guò)Configuration類(lèi)中的screenLayout成員變量來(lái)獲取當(dāng)前設(shè)備的屏幕大小。
屏幕寬高外觀(Screen Aspect)
指的是當(dāng)前屏幕的寬高比(aspect ratio)。分為以下兩種
long
長(zhǎng)屏幕,如WQVGA,WVGA,FWVGA等。
nolong
非長(zhǎng)屏幕,如QVGA,HVGA,VGA等。
可以通過(guò)Configuration類(lèi)中的screenLayout成員變量來(lái)獲知屏幕是否為長(zhǎng)屏。
屏幕方向(Screen Orientation)
分為兩種,豎屏(port)和橫屏(land)。
這個(gè)值會(huì)隨著用戶的操作而變化,但我們可以通過(guò)Configuration類(lèi)中的orientation成員變量來(lái)獲知當(dāng)前設(shè)備的屏幕方向。
UI模式(UI mode)
分為以下幾種:car,desk,television,appliance.
表示設(shè)備被放置在底盤(pán)(dock)時(shí)的模式,如汽車(chē)上的手機(jī)托盤(pán),桌面托盤(pán)等。這個(gè)模式會(huì)隨著用戶的操作而改變,可以通過(guò)UiModeManager來(lái)開(kāi)啟和關(guān)閉這一功能。
夜間模式(Night Mode)
分為兩種,night(處于夜間模式)和notnight(非夜間模式)。
可以通過(guò)UiModeManager來(lái)開(kāi)啟和關(guān)閉這一功能。
屏幕像素密度(dpi)
ldpi
低密度屏幕,大約120dpi
mdpi
中密度屏幕,大約160dpi
hdpi
高密度屏幕,大約240dpi
xhdpi
超高密度屏幕,大學(xué)320dpi
nodpi
表示這些資源不希望被改變尺寸以適應(yīng)屏幕。
tvdpi
介于mdpi和hdpi之間,大約213dpi,主要用于電視產(chǎn)品,普通應(yīng)用程序并不推薦使用。
觸摸屏類(lèi)型(Touchscreen Type)
分為notouch(設(shè)備不帶觸摸屏)和finger(觸摸屏通過(guò)手指操作)。
通過(guò)Configuration類(lèi)中的touchscreen成員變量來(lái)獲知當(dāng)前設(shè)備的觸摸屏類(lèi)型。
鍵盤(pán)可用性
分為以下三種狀態(tài)
keysexposed
設(shè)備有可用鍵盤(pán)。如果當(dāng)前的軟鍵盤(pán)被啟用,那么即便設(shè)備沒(méi)有鍵盤(pán)或者鍵盤(pán)不可用,這個(gè)狀態(tài)仍可能有效。
keyshidden
設(shè)備有鍵盤(pán),但當(dāng)前被隱藏,而且沒(méi)有軟鍵盤(pán)啟用。
keysoft
設(shè)備當(dāng)前軟鍵盤(pán)啟動(dòng),即便它處于可見(jiàn)或不可見(jiàn)狀態(tài)。
這個(gè)值在運(yùn)行過(guò)程中會(huì)發(fā)生變化,可以通過(guò)Configuration類(lèi)的hardkeyboardHidden和keyboardHidden變量來(lái)獲知當(dāng)前狀態(tài)。
網(wǎng)站題目:android匹配,匹配的匹配
鏈接分享:http://fisionsoft.com.cn/article/phjjpj.html