參考:Android開發(fā)使用mipmap文件夾的正確姿勢(shì): px 、dpi 、dp
軟件圖標(biāo)的適配
Android應(yīng)用圖標(biāo)微技巧,8.0系統(tǒng)中應(yīng)用圖標(biāo)的適配
系統(tǒng)會(huì)優(yōu)先選用
android:roundIcon="@mipmap/ic_img"屬性對(duì)應(yīng)的圖片
測(cè)試的在華為手機(jī)Android 9.0系統(tǒng)中,但是在切換targetSdkVersion 大于26和小于26的時(shí)候,并沒有對(duì)圖標(biāo)進(jìn)行原型切換,26前后對(duì)應(yīng)的圖標(biāo)形狀一樣??赡苁侨A為對(duì)這部分源碼進(jìn)行了修改,將mask層修改為圓角矩形。

在pixel2手機(jī)上的圖標(biāo)效果,切換
targetSdkVersion 大于26和小于26的時(shí)候顯示效果都是一樣的。如下圖:
mipmap中幾個(gè)文件夾的認(rèn)識(shí)
mipmap中的文件夾分別為
mipmap-lhdpi
mipmap-mdpi
mipmap-hdpi
mipmap-xhdpi
mipmap-xxhdpi
mipmap-xxxhdpi
新創(chuàng)建的項(xiàng)目都會(huì)有這幾個(gè)文件夾,那么這幾個(gè)文件夾是怎樣的呢?內(nèi)部的規(guī)則是什么呢?都是怎樣對(duì)應(yīng)的呢?
講解這些之前我們需要知道我們平常見到的一些尺寸單位的關(guān)系:
- px 像素點(diǎn)
- dpi 每一英寸像素點(diǎn)的密度。(看到dpi了,mipmap中的文件夾好像都以dpi結(jié)尾,應(yīng)該是有點(diǎn)關(guān)系的)
- dp 設(shè)備無關(guān)像素,可以說是根據(jù)dpi的不同而不同;
- pt
1pt=1/72 in(in是英寸) 1pt相當(dāng)于1/72英寸- sp 文字使用的單位,與設(shè)備硬件有關(guān)
px(像素點(diǎn))和dpi(像素單位密度)之間的換算公式是:
像素密度=√{(長度像素?cái)?shù)^2 + 寬度像素?cái)?shù)^2)}/ 屏幕尺寸
px,dpi和dp之間關(guān)系:
每一個(gè)設(shè)備的
dpi是固定的,但是Android的機(jī)型太多了,每個(gè)機(jī)型都可能有自己的dpi,我們?cè)趽Q算這三個(gè)單位的時(shí)候是以160為基準(zhǔn)的。比如說當(dāng)dpi為160的話,那么1px=1dp;如果dpi為320的話,1px=0.5dp。它們之間的換算公式為px=dp*(dpi/160)
上邊一些尺寸的基礎(chǔ)知識(shí),感覺很亂啊。。。
接下來就將一下mipmap下邊幾個(gè)文件夾的關(guān)系 表1-1:
| mipmap-lhdpi | mipmap-mdpi | mipmap-hdpi | mipmap-xhdpi | mipmap-xxhdpi | mipmap-xxxhdpi | |
|---|---|---|---|---|---|---|
| dpi范圍 | (0-120]dpi | (120-160]dpi | (160-240]dpi | (240-320]dpi | (320-480]dpi | (480-640]dpi |
| 1dp對(duì)應(yīng)px(luffy) | 0.75 | 1 | 1.5 | 2 | 3 | 4 |
上邊dp對(duì)應(yīng)px的比值我起名為(luffy)。
我們?cè)陂_發(fā)的過程中,對(duì)圖片的展示通常就兩種:固定寬高,不固定寬高。
固定寬高會(huì)遇到的問題是放置的圖片可能會(huì)模糊;不固定寬高可能就會(huì)和自己想要的尺寸不一樣了。
我現(xiàn)在以不固定寬高的來說,比如給一個(gè)TextView設(shè)置dropLeft,這樣就不能設(shè)置寬高,那么ui給的圖片我到底該放置到哪個(gè)dpi文件夾里邊才合適呢。因?yàn)槲议_發(fā)的是特定機(jī)器上的app,所以只需要一個(gè)mipmap文件夾就行了。
我現(xiàn)在將一張32 * 32的圖片分別放到這六個(gè)文件夾里邊,不固定尺寸的顯示圖片,并通過方法獲取圖片的寬高,測(cè)試機(jī)器的dpi是480。
記住兩個(gè)數(shù)據(jù):圖片尺寸是32 * 32;測(cè)試機(jī)是480dpi。
結(jié)果如下 表1-2:
| mipmap-lhdpi | mipmap-mdpi | mipmap-hdpi | mipmap-xhdpi | mipmap-xxhdpi | mipmap-xxxhdpi | |
|---|---|---|---|---|---|---|
| dpi范圍 | (0-120]dpi | (120-160]dpi | (160-240]dpi | (240-320]dpi | (320-480]dpi | (480-640]dpi |
| 1dp對(duì)應(yīng)px(luffy) | 0.75 | 1 | 1.5 | 2 | 3 | 4 |
| 圖片展示寬高(px) | 128*128 | 96*96 | 64*64 | 48*48 | 32*32 | 24*24 |
結(jié)果是同一張圖片放到不同的文件夾中,顯示的尺寸是不一樣的,因?yàn)闇y(cè)試機(jī)是480dpi,對(duì)應(yīng)的本命mipmap文件夾是mipmap-xxhdpi,所以這個(gè)文件夾中的圖片在這個(gè)測(cè)試機(jī)上都會(huì)原尺寸顯示。其他的文件夾中的圖片都會(huì)根據(jù)1-2表格中的dp和px的換算比例進(jìn)行換算。比如,1-2表中mipmap-xxhdpi對(duì)應(yīng)的luffy是3,mipmap-hdpi的luffy值是1.5,如果我們將32 * 32的圖片放到mipmap-hdpi文件夾中,其他文件夾中不放置,軟件展示圖片的時(shí)候就會(huì)獲取mipmap-hdpi文件夾中的圖片,顯示的效果我們知道是64 * 64,再看對(duì)應(yīng)著剛說的luffy值,是不是看出點(diǎn)什么?好像不同文件夾中的圖片顯示的效果和luffy值有關(guān)啊。
(圖片真實(shí)尺寸*測(cè)試機(jī)對(duì)應(yīng)的本命mipmap文件夾中的luffy值)/當(dāng)前mipmap文件夾中的luffy值=顯示到屏幕上的尺寸
比如 ,當(dāng)將圖片放置到mipmap-hdpi 文件夾中:
(32 * 3)/1.5=64
其中32為圖片尺寸,3為當(dāng)前我是用的測(cè)試機(jī)的luffy值,1.5為mipmap-hdpi的luffy值。
那么如果我們想不管從哪個(gè)文件夾獲取圖片,展示的都是32*32,那好說啊,按照這個(gè)公式,獲取不同文件夾中需要放置的圖片尺寸。比如mipmap-hdpi放置16 * 16的圖片,就可以在我的測(cè)試機(jī)上展示32 * 32的效果了。
聲明一下,手機(jī)上的app開發(fā)沒有這個(gè)需求,我只是找出這幾個(gè)文件夾中的關(guān)系。
我上邊一直說的展示尺寸都是px,那么在不同的機(jī)器上同時(shí)展示32 * 32的效果,根據(jù)上邊的公式可以實(shí)現(xiàn),但是展示的效果肯定各不相同。
上邊的需求是我在做特定機(jī)器時(shí),只有一種分辨率,一種dpi,那我想把所有mipmap文件夾都塞滿,而且展示的效果都一樣,就需要上邊的公式。
手機(jī)上mipmap文件夾中圖片放置規(guī)則
當(dāng)手機(jī)上不同的機(jī)器,不同的dpi展示同一種效果時(shí),也就是占用屏幕相同的比例時(shí),那表示這個(gè)效果的值就是dp,相同的dp在不同的機(jī)器上展示的效果基本相同,比如我想在480dpi的機(jī)器上展示的效果要和320dpi一樣,那就需要它們展示的dp一樣,我們展示一個(gè)32dp*32dp的圖片。根據(jù)公式: px=dp*(dpi/160)可以得到 32 * luffy=?px;那么480dpi對(duì)應(yīng)的luffy值是3,所以480dpi對(duì)應(yīng)的mipmap中的圖片尺寸是96px * 96px ,320dpi對(duì)應(yīng)的mipmap中的尺寸是64 * 64。
要在不同的機(jī)器上展示32dp*32dp的圖片一張表格展示: 1-3
| mipmap-lhdpi | mipmap-mdpi | mipmap-hdpi | mipmap-xhdpi | mipmap-xxhdpi | mipmap-xxxhdpi | |
|---|---|---|---|---|---|---|
| dpi范圍 | (0-120]dpi | (120-160]dpi | (160-240]dpi | (240-320]dpi | (320-480]dpi | (480-640]dpi |
| 1dp對(duì)應(yīng)px(luffy) | 0.75 | 1 | 1.5 | 2 | 3 | 4 |
| 所需圖片的尺寸(px) | 24*24 | 32*32 | 48*48 | 64*64 | 96*96 | 128*128 |
其他dp的圖片都可以按照這個(gè)規(guī)則展示。
mipmap文件夾圖片優(yōu)先使用規(guī)則
當(dāng)合適的mipmap文件夾中沒有對(duì)應(yīng)的圖片的時(shí)候,會(huì)優(yōu)先往高的找,會(huì)優(yōu)先找最近的