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