I.引入
資源文件適配,其中包含衆多內容,如值適配,語言適配,
首先打開文件夾生成界面,右擊工程目錄 -> New -> Android Resource Directory
添加資源文件夾的界面如下:
Resource type | 包含所有的資源文件類型,如layout,value,mipmap,xml,color,anim...還有raw;就是所有資源文件可以適配 |
Source set | 默認爲main(),爲build.gradle 中 buildTypes和 produceFlavors 的交叉組合 |
Acailable set | 截圖中爲所有可選類型,包含屏幕寬,屏幕高,橫豎屏,版本,佈局方向,像素大小等 |
Choose qualifiers | 可以多選,條件爲合併關係,如圖 會生成 values-long-port 文件夾,表示寬屏並且豎屏時引用(迷糊?看資源介紹) |
通常 Resource type 配合 Acailable set , 即可做絕大多數適配,少數的調試值,渠道區分會使用Source set !!!
更多資源文件的內容可以看我的筆記:https://blog.csdn.net/qq_19973845/article/details/103459712
抽個重點:
Android 如何查找最佳匹配資源
當您請求要爲其提供備用資源的資源時,Android 會根據當前的設備配置選擇要在運行時使用的備用資源。爲演示 Android 如何選擇備用資源,假設以下可繪製對象目錄分別包含相同圖像的不同版本:
1.drawable/
2.drawable-en/
3.drawable-fr-rCA/
4.drawable-en-port/
5.drawable-en-notouch-12key/
6.drawable-port-ldpi/
7.drawable-port-notouch-12key/
這裏尋找資源的順序只能是7->6->5->4->3->2->1,絕不會倒過來,
那麼特別注意: layout,drawable,value,等等絕對不會升級尋找!
但是layout,drawable,value之間的的引用值卻是相對獨立的,比如layout下引用了@dimen/buttonHeight,在value和value-sw600dp下均創建該值,運行在平板中則是引用value-sw600dp下的@dimen/buttonHeight,運行在手機上則是value中的!
II.屏幕適配
屏幕適配是android 衆多適配中的重要一角,與之相照應的是value,layout,color,drawable,mipmap的配套.
1.屏幕適配的關鍵因素:橫豎屏,屏幕大小,像素密度
橫豎屏:就兩種情況,通常在適配也是在橫屏情況下做成平板一樣的左右佈局
屏幕大小: 在這裏 通常用於判斷是否爲平板,先繼續看...
下面是其他最小寬度值與典型屏幕尺寸的對應關係:
- 320dp:典型手機屏幕(240x320 ldpi、320x480 mdpi、480x800 hdpi 等)。
- 480dp:約爲 5 英寸的大手機屏幕 (480x800 mdpi)。
- 600dp:7 英寸平板電腦 (600x1024 mdpi)。 -->(註釋:我發現M3 8.4寸平板<顯示模式爲 大[有 小,中,大]>居然是534dp)
- 720dp:10 英寸平板電腦(720x1280 mdpi、800x1280 mdpi 等)。
下面提供了一個更詳細的視圖,說明了不同屏幕 dp 寬度與不同屏幕尺寸和方向的一般對應關係。
典型的平板電腦測試環境可以包含下表中每行的一種或兩種設備,採用所列的一種平臺版本、屏幕配置和硬件功能配置。
類型 | 尺寸 | 密度 | 版本 | AVD 主題 |
7 英寸平板電腦 | large 或-sw600 |
hdpi 、tvdpi |
Android 4.0 及更高版本 (API 級別 14 及更高) |
WXGA800-7in |
10 英寸平板電腦 | xlarge 或-sw800 |
mdpi 、hdpi 、xhdpi |
Android 3.2 及更高版本 (API 級別 13 及更高) |
WXGA800 |
做平板適配的根據:
在模擬器中window 爲large是就爲平板,而真機則不能正確識別,甚至xlarge都沒有效果;
這裏還是得使用 最小dp寬度來最區分,模擬器,真機均能正確識別;
像素密度: 像素密度的適配爲了 正確的加載正確大小的圖片,避免系統放大或壓縮圖片導致圖片不清晰;
有一個公式是px(像素)與dp(密度無關像素 )的轉化關係:px = dp * (dpi / 160)
dpi:圖像每英寸長度內的像素點數。
dp:xml佈局中的使用單位
px:就是像素🌶
這裏有一個示例:
在自定義View時,通常有手勢的相應,而何時響應則需要我們計算,因爲xml中我們設置的是dp,而代碼中獲取的是px,
假定用戶滑動16dp ,應當響應手勢,我們則需要計算出在設備中對應的像素值,代碼如下:
// The gesture threshold expressed in dp
private static final float GESTURE_THRESHOLD_DP = 16.0f;
// Get the screen's density scale
final float scale = getResources().getDisplayMetrics().density;
// Convert the dps to pixels, based on density scale
mGestureThreshold = (int) (GESTURE_THRESHOLD_DP * scale + 0.5f);
不同像素密度下建議的圖片文件夾(drawable,mipmap),及其大小
36x36 (0.75x) |
48x48(1.0x 基準) |
72x72 (1.5x) |
96x96 (2.0x) |
144x144 (3.0x) |
192x192 (4.0x) |
低密度 (ldpi) | 中密度 (mdpi) | 高密度 (hdpi) | 超高密度 (xhdpi) | 超超高密度 (xxhdpi) | 超超超高密度 (xxxhdpi) |