1. 程式人生 > >Android屏適配-資原始檔夾命名與匹配規則

Android屏適配-資原始檔夾命名與匹配規則

Android螢幕適配-資原始檔夾命名與匹配規則

說明:本文件目的為分析android工程res目錄下的資原始檔夾(drawable,values,layout等)在螢幕適配方面的限定與適配方法。

1、 Res下資料夾命名方式
1. 可用的命名屬性
在文件1中的表格“Table 2. Configuration qualifier names. ”中有說明(表格太大,不方便在此張貼),表格中的"Configuration"項集就是Android全體可用命名屬性集,表格此項的排列順序即是各個屬性的優先級別順序。

2. 命名方法與要求
1) 命名不區分大小寫;
2) 命名形式:資源名-屬性1-屬性2-屬性3-屬性4-屬性5.....
資源名就是資源型別名,包括:drawable, values, layout, anim, raw, menu, color, animator, xml;
屬性1-屬性2-屬性3-屬性4-屬性5.....就是上述的屬性集內的屬性,如:-en-port-hdpi;
注意:各屬性的位置順序必須遵守優先順序從高到低排列!否則編譯不過

3. 例項說明
1) 把全部屬性都用上的例子(各屬性是按優先順序先後排列出來的)
values-mcc310-en-sw320dp-w720dp-h720dp-large-long-port-car-night-ldpi-notouch-keysexposed-nokeys-navexposed-nonav-v7
2) 上述例子屬性的中文說明
values-mcc310(sim卡運營商)-en(語言)-sw320dp(螢幕最小寬度)-w720dp(螢幕最佳寬度)-h720dp(螢幕最佳高度)-large(螢幕尺寸)-long(螢幕長短邊模式)-port(當前螢幕橫豎屏顯示模式)-car(dock模式)-night(白天或夜晚)-ldpi(螢幕最佳dpi)-notouch(觸控式螢幕模型別)-keysexposed(鍵盤型別)-nokey(硬按鍵型別)-navexposed(方向鍵是否可用)-nonav(方向鍵型別)-v7(android版本)

2、 定位最佳資料夾
1. 定位演算法

providingResource
特殊說明:關於螢幕大小size相關的屬性不在步驟1的過濾清除條件裡(dpi屬性和screen size屬性):
1) 對於dpi屬性系統的選擇方法是"best match"---即如果沒有找到準確的屬性,可以接著尋找最接近的屬性資料夾。例如:我的g7手機,應該是values-hdpi,但如果沒有values-hdpi,則可以找出最接近的資料夾(先找values-xhdpi到values-mdpi到values最後到values-ldpi,注意values在values-ldpi之前先找到,系統認為values比values-ldpi更接近我的values-hdpi屬性);

2) 對於screen size屬性系統的選擇方法是"向下best match",即如果沒找到準確的屬性,只可以接著在比自身屬性小的資料夾裡找最接近的屬性資料夾。例如:我的g7手機,應該是values-normal,但如果沒有values-normal,則可以找出最接近的資料夾(先找values再到values-small,注意,系統認為values比values-small更接近我的values-normal屬性,但之後就不會再找values-large與values-xlarge了,因為是"向下best match",large與xlarge都比normal大)。
2. 例項說明
工程有如下資料夾:
drawable/
drawable-en/
drawable-fr-rCA/
drawable-en-port/
drawable-en-notouch-12key/
drawable-port-ldpi/
drawable-port-notouch-12key/
手機屬性:
Locale = en-GB 
Screen orientation = port 
Screen pixel density = hdpi 
Touchscreen type = notouch 
Primary text input method = 12key

1) 清除包含任何與手機配置有衝突的屬性的資原始檔夾(藍色字體表現被清除)
drawable/
drawable-en/
drawable-fr-rCA/
drawable-en-port/
drawable-en-notouch-12key/
drawable-port-ldpi/
drawable-port-notouch-12key/
注意:因為dpi屬性使用"best match"選擇,所以drawable-port-ldpi/
沒被清除。
2) 選擇文件1中的表格“Table 2. Configuration qualifier names. ”最高優先順序的屬性(MCC最高,然後依次向下選擇)。
3)  有包含上述屬性的資料夾嗎?
如果沒有,跳轉步驟2,選擇下一優先順序高的屬性;
如果有,繼續步驟4;
4) 清除不包含此屬性的所有資料夾
drawable/
drawable-en/
drawable-en-port/
drawable-en-notouch-12key/
drawable-port-ldpi/
drawable-port-notouch-12key/
5) 重複步驟2和3,直到步驟4中只剩下一個資料夾則返回。例子中,螢幕方向是下一個最高優先順序的屬性,所以可以清除兩個資料夾:
drawable-en/
drawable-en-port/
drawable-en-notouch-12key/

最終找到的資料夾就是drawable-en-port/

由上述過程可看出,匹配是看最高優先級別的屬性,而不是一共匹配到的屬性數量,例如:values-en-normal-hdpi的手機,values-en匹配比vaues-normal-hdpi更合適。

3、 備註
1. 文件1中的表格“Table 2. Configuration qualifier names. ”列出的屬性集並不是一直不變的,有些新屬性是在高階的android version才加入的,系統在識別到此新屬性時會自動加上支援新屬性的android最低版本屬性,例如:xhdpi是android 2.2(sdk[img]/images/smiles/icon_cool.gif" alt="[/img]新加入的,則values-xhdpi系統會自動認為是values-xhdpi-v8,這樣新屬性一定不會在android舊版本中匹配到了;
2. 對於指定解析度的屬性(例如:values-hdpi-1024x600,values-hdpi-960x540,values-mdpi-1024x600),指定解析度屬性並沒出現在官網的匹配屬性集裡,也沒找到對於解析度屬性的詳細說明,經測試,這個解析度屬性匹配並不準確,例如Galaxy Nexus(1280x720 ),卻可以匹配到values-hdpi-1024x600,因此希望最好不使用解析度屬性。

在工程的default.properties中如果split.density=false,則解析度適配的時候資料夾命名不需要與scale相除

螢幕解析度:800x480
density:1.5(240)
資料夾:values-hdpi-800x480

4、 參考文件
1  :Android資源螢幕適配官方文件:
http://developer.android.com/guide/topics/resources/providing-resources.html

一、一些基本概念

1、長度(真實長度):英寸、inch

2、解析度:density 每英寸畫素數 dpi(密度)

3、畫素:px

4、dip的公式:px /dip=dpi/160 所以 dip 類似於英寸、長度(dp=dip,sp類似於dip) dip=160*inch

dip= 160/dpi * px

當dip一定時,dpi 越大,px就越大

5、廣義解析度=長px*寬px

二、常用規律

1、平時我們說 手機的解析度是 320*480的,其實的這裡的解析度是相對解析度

意思是:水平方向上的畫素數是320,垂直方向上畫素數是480,

解析度是160(預設是160,意思是每英寸畫素數160)

那麼水平方向:320 /160=2英寸

垂直方向:480/160=3英寸

於是乎 螢幕對角線 是根號下4*9=3.6(這就是常說的3.6英寸螢幕)

2、說一個手機的螢幕引數有三個:長寬畫素之積(相對解析度)、真實解析度(dpi)、對角線長度

3、模擬器的解析度都是160,所以畫素越大,屏越大

4、l、m、h 三個資料夾是按 真是解析度dpi 來對應找檔案的。

5、有三種方案解決螢幕適配

(1)按畫素比 y/開發時用的螢幕畫素=x/使用者裝置畫素

(2)按長度 用dip(假設螢幕尺寸基本不變)

(3)按密度 放在l、m、h資料夾(假設螢幕尺寸基本不變,dpi越大 px越大)

6、如果手機是hdpi,但hdpi裡沒有東西,l裡有東西,程式就會去l裡找圖片並且把它按比例放大。

7、最全的辦法:單獨適配

螢幕解析度:1024x600
density:1(160)
資料夾:values-mdpi-1024x600

螢幕解析度:1024x600
density:1.5(240)
資料夾:values-hdpi-683x400 由1024/1.5 600/1.5得到,需要四捨五入。

螢幕解析度:800x480
density:1(160)
資料夾:values-mdpi-800x480

螢幕解析度:800x480
density:1.5(240)
資料夾:values-hdpi-533x320 由800/1.5 480/1.5得到,需要四捨五入。

以此類推
一般情況下需要創建出values 、values-mdpi 、 values-hdpi資料夾,以備在一些沒有規定的尺寸螢幕上找不到資源的情況。

8、我的原則,能用拉伸圖片的就拉伸、能用相對佈局的就用相對佈局、能用程式碼計算寬度就程式碼計算。

讓美工出一份 1080*1920 放到XXH

佈局時按照:寬:320dip 高 480 dip

9、主流機型引數:

比例 0.75 1 1.5 2 3
最常見的畫素長寬 240 320 480 640*960 960*1440
dpi ~120 ~160 ~240 ~320 ~480
資料夾 L M H XH XXH
主流機 720*1280(紅米、s3、note2) 720*1280(米2)1080*1920(米3、note3、s4)
1dp =1px 1dp =2px 1dp =2.5px
主流機 note2、紅米、s3 米2、米3、s4、note3
ldpi Resources for low-density (ldpi) screens (~120dpi).
mdpi Resources for medium-density (mdpi) screens (~160dpi). (This is the baseline density.)
hdpi Resources for high-density (hdpi) screens (~240dpi).
xhdpi Resources for extra high-density (xhdpi) screens (~320dpi).

----------------------------------------------------------------

紅米:

螢幕解析度為:720 * 1280

絕對寬度:720pixels

絕對高度:1280pixels

邏輯密度:2.0

X 維 :294.96774畫素每英尺

Y 維 :285.193畫素每英尺

res/drawable下的檔案會做失真壓縮

res/drawable-nodpi下的檔案不做任何處理

\

\

\

\

=================================

10、獲取螢幕畫素的方法

String str = "";

DisplayMetrics dm = new DisplayMetrics();

dm = this.getApplicationContext().getResources().getDisplayMetrics();

int screenWidth = dm.widthPixels;

int screenHeight = dm.heightPixels;

float density = dm.density;

float xdpi = dm.xdpi;

float ydpi = dm.ydpi;

str += "螢幕解析度為:" + dm.widthPixels + " * " + dm.heightPixels + "\n";

str += "絕對寬度:" + String.valueOf(screenWidth) + "pixels\n";

str += "絕對高度:" + String.valueOf(screenHeight)

+ "pixels\n";

str += "邏輯密度:" + String.valueOf(density)

+ "\n";

str += "X 維 :" + String.valueOf(xdpi) + "畫素每英尺\n";

str += "Y 維 :" + String.valueOf(ydpi) + "畫素每英尺\n";


感謝那些寫原創部落格的兄弟,可以讓我們省去不少時間!!

相關推薦

Android原始檔命名匹配規則

Android螢幕適配-資原始檔夾命名與匹配規則 說明:本文件目的為分析android工程res目錄下的資原始檔夾(drawable,values,layout等)在螢幕適配方面的限定與適配方法。 1、 Res下資料夾命名方式 1. 可用的命名屬性 在文件1中的表格“Table 2. Configurati

Android螢幕 DP存在問題詳解

接下來我們針對google官方提供的DP適配具體分析一下:分析之前我們先補充一下一些基礎知識:基本概念:1. 螢幕尺寸:手機對角線的物理尺寸,單位:英寸(inch)。 eg:5.5寸。2. resolution(螢幕解析度):手機橫向畫素點總和 X 手機縱向畫素點總和, 單位

Android_Android工程res目錄下的原始檔螢幕

  特殊說明:關於螢幕大小size相關的屬性不在步驟1的過濾清除條件裡(dpi屬性和screen size屬性): 1) 對於dpi屬性系統的選擇方法是"best match"---即如果沒有找到準確的屬性,可以接著尋找最接近的屬性資料夾。例如:我的g7手機,應該是values-hdpi,但如果沒有value

Android 劉海總結

一、簡介 隨著 Apple 釋出 iPhone X 之後,各大手機廠商也開始模仿這種劉海屏的設計,而且劉海屏手機的使用者也是越來越大,前段時間將專案進行了所有主流廠商的劉海屏手機的適配,以便讓劉海屏手機的使用者也能有更好的體驗。 二、劉海屏造成的 UI 顯示問題 劉海屏手機因為比平常的手機多了一塊頂部的

android劉海

轉載請註明出處:https://blog.csdn.net/u011038298/article/details/83505697 簡單點,開車的方式簡單點   問:在什麼情況下我們需要適配劉海屏? 答:應用在安卓9.0系統中使用了全屏或者沉浸模式的時候。如果狀態列正常展示

Android APP全面手機的技術要點

關於全面屏 全面屏是手機業界對於超高屏佔比手機設計的一個寬泛的定義。從字面上解釋就是,手機的正面全部都是螢幕,四個邊框位置都是採用無邊框設計,追求接近100%的屏佔比。但受限於目前的技術,還不能做到手機正面屏佔比100%的手機。現在業內所說的全面屏手機是指真實屏佔比可以達到80%以上,擁有超窄邊

Android劉海庫NotchFit一鍵完美實現劉海!!!

    NotchFit是Android端的劉海適配庫。該庫使用簡單,劉海蔘數智慧判斷,使開發者無需再考慮手機系統和製造廠商的差異,一鍵智慧劉海蔘數回撥。你值得擁有!!! 下面對全屏劉海適配做個簡要說明: 程式碼實現方式: NotchFit.fit(this, Not

Android劉海庫NotchFit使用詳細介紹!!!

    NotchFit是一款Android端的劉海屏適配庫,適配了O版本和P版本,它遮蔽了不同廠商不同裝置不同系統版本對劉海屏適配帶來的一系列的繁雜的問題。      NotchFit可以智慧的判斷劉海的邏輯引數,所謂的劉海邏輯引數是該庫對裝置

Android劉海庫NotchFit簡介及使用方式

NotchFit 智慧劉海屏適配庫 優點:使用簡單,劉海蔘數智慧判斷,一鍵式劉海蔘數回撥,無需考慮機型差異,適配O版本和P版本。 劉海屏存在於系統O版本、P版本及以上版本,由於google P版本劉海api推出較晚,導致O版本劉海屏的不同廠商的機型有各自不同的 適配方式,再者不同

Android P優化異型全面 OPPO R15成為首批支援機型

【天極網手機頻道】5月8日,一年一度的開發者大會在如期舉行。根據慣例,谷歌在大會上給我們帶來了新版系統的訊息。在此之前,谷歌已經提前公佈了 P的開發者預覽版,這次大會上明確了更多Android P的細節,比如命名、更新、優化等。就目前開發者的版本來看,Android P主要的改進除了效能和

Android劉海精煉詳解

一、前期基礎知識儲備 話不多說,這麼多劉海屏手機今年集中爆發,所以儘管劉海屏不好看,但是還是要適配。 2017年蘋果X開啟了劉海屏時代,2018年集中爆發,紛紛採取劉海屏這一策略來實現全面屏的概念,所以Android手機對於劉海屏的適配也是比較重要的。所謂適配劉海屏,其實就是處理與

Android劉海方案

隨著iPhone X釋出,國內一些廠商也推出了劉海屏手機,即將釋出的Android p也提供了對劉海屏的支援。so,我們的app也要提前做好適配。 什麼是劉海屏? 螢幕的正上方居中位置(下圖黑色區域)會被挖掉一個孔,螢幕被挖掉的區域無法正常顯示內容,這種型別的螢幕就是劉海屏,也有其他叫法:挖

Android P預覽版體驗:為劉海新的手勢操作

昨日凌晨,為期三天的谷歌I/O開發者大會正式召開,第一天開幕自然是重頭戲。今年I/O的主要方向是人工智慧,新浪科技也做了詳細報道,詳情可點選:檢視。那麼在I/O大會中,Android系統自然是個重頭戲,這次谷歌為我們帶來了Android P系列。

詳解Android劉海

Apple一直在引領設計的潮流,自從 iPhone X 釋出之後,”劉海屏” 就一直存在爭議,本以為是一個美麗的錯誤(Bug),卻早就了一時間“劉海屏”的模仿潮。目前,國內已經推出的劉海屏”手機有 OPPO R15 和 華為 P20,並且Google也在IO大會

Android 7.0分和檔案許可權

Android 7.0分屏適配和檔案許可權 分屏適配 檔案許可權 一、分屏適配 從Android N開始,添加了分屏和畫中畫功能。 在手持裝置上,兩個應用可以在“分屏”模式中左右並排或上下並排顯示。 在電視裝置上,應用可以使用“畫中畫”模式,如

Android 全面及判斷是否為全面

一,全面屏的適配 全面屏出現後,如果不做適配,螢幕上會出現上下黑邊,影響視覺效果。 針對此問題,Android官方提供了適配方案,即提高App所支援的最大螢幕縱橫比,實現起來也比較簡單,在AndroidManifest.xml中做如下配置即可,在AndroidManife

Android劉海小結

一、關於劉海屏:        Android 9 支援最新的全面屏,其中包含為攝像頭和揚聲器預留空間的螢幕缺口。 通過 DisplayCutout 類可確定非功能區域的位置和形狀,這些區域不應顯示內容。 要確定這些螢幕缺口區域是否存在

android系列劉海

首先,在androidO系統上,官方還沒有提供正式的介面去獲取“劉海屏”的引數。。 所以在此版本上各廠為定製了介面,提供我們獲取。Android P上官方已經有了相應的介面。 這裡收集主流android大廠提供的介面適配地址~~ 1.小米: 2.華為:

無法引用android原始檔中raw資料中的檔案

參考:http://www.thinksaas.cn/group/topic/212348/ 環境:eclipse  最近要寫一個讀取txt的文字,在res目錄下新建了一個raw資料夾,並向其中加入了txt檔案,但通過R引用時無法引用。在網上查了一下原因是R和Android

Android 劉海全攻略

本文由玉剛說寫作平臺提供寫作贊助,版權歸玉剛說微信公眾號所有 原作者:四月葡萄 版權宣告:未經玉剛說許可,不得以任何形式轉載 1.前言 先吐槽一下,劉海屏真醜。然而作為苦逼的開發者,還是要去適配劉海屏的。好了,吐槽完畢,進入正題。 這裡主要是介