Android屏幕的適配,是每一個Android工程師在開發(fā)過程中都會遇到的惱人的難題,其實我們看一下android設(shè)備就知道了,千奇百怪,萬種變化,在適配的時候就有點(diǎn)怵.
屏幕適配的原因:
由于Android系統(tǒng)的開放性缴允,任何用戶轧膘、開發(fā)者虎敦、OEM廠商冷冗、運(yùn)營商都可以對Android進(jìn)行定制,修改成他們想要的樣子闰围。而隨著支持Android系統(tǒng)的設(shè)備(手機(jī)留搔、平板译红、電視、手表)的增多铃将,設(shè)備碎片化项鬼、品牌碎片化、系統(tǒng)碎片化劲阎、傳感器碎片化和屏幕碎片化的程度也在不斷地加深
重要概念:
1. 屏幕尺寸绘盟、屏幕分辨率、屏幕像素密度
屏幕尺寸:屏幕對角線長度,單位是英寸龄毡,我們常說的多少多少寸吠卷,比如4.7存手機(jī)、5.7存手機(jī)沦零,指的就是這個祭隔。
屏幕分辨率:如 1920×1080,是指在手機(jī)屏幕的像素點(diǎn)的個數(shù)路操,單位是px疾渴,1px = 1 像素點(diǎn),一般是縱向像素× 橫向像素寻拂,意味著高有1920 個像素點(diǎn)程奠,寬有1080 個像素點(diǎn)。表示物理屏幕區(qū)域內(nèi)像素點(diǎn)的總和(切記:跟屏幕適配沒有任何關(guān)系),因為我們既可以把1920*1080的分辨率做到4.0的手機(jī)上,也可以把這個分辨率做到5.0英寸的手機(jī)上面,如果分辨率相同,手機(jī)屏幕越小越清晰
屏幕像素密度:是指每英寸上的像素點(diǎn)數(shù)祭钉,單位是dpi(dotper inch)瞄沙。像素密度和屏幕尺寸和屏幕分辨率有關(guān),它是由對角線的像素點(diǎn)數(shù)除以屏幕的大小得到的慌核,關(guān)系如下:
屏幕像素密度算法
(單一變化條件下距境,屏幕尺寸越小、分辨率越高垮卓,像素密度越大垫桂,反之越小。)
dp粟按、dip诬滩、dpi、sp灭将、px(pix)
dp:是Android 特有的疼鸟,意為密度無關(guān)像素,Google 發(fā)布的BASELINE(基準(zhǔn)線)為160庙曙,以此為基準(zhǔn)空镜。
dip:Density Independent Pixels,同dp一個意思捌朴,目前廢棄了吴攒,一般都寫dp。
dpi:即為屏幕像素密度的單位
sp:Scale-IndependentPixels的縮寫砂蔽,可以根據(jù)文字大小首選項自動進(jìn)行縮放洼怔。Google推薦我們使用12sp以上的大小,通匙蠹荩可以使用12sp镣隶,14sp泽台,18sp,22sp矾缓,為避免精度損失怀酷,建議最好不要使用奇數(shù)和小數(shù)。
px(pix):就是我們常說的像素,就是屏幕中最小的一個顯示單元.不同設(shè)備顯示的效果相同
mdpi嗜闻、hdpi蜕依、xhdpi、xxhdpi琉雳、xxxhdpi
一般都是采用以下幾種解決方案:
解決方案看圖:
適配相關(guān)術(shù)語:
分辨率(eg):480X800,1280X720样眠。表示物理屏幕區(qū)域內(nèi)像素點(diǎn)的總和。(切記:跟屏幕適配沒有任何關(guān)系) 因為我們既可以把1280X720的分辨率做到4.0的手機(jī)上面翠肘。我也可以把1280X720的分辨率做到5.0英寸的手機(jī)上面檐束,如果分辨率相同,手機(jī)屏幕越小越清晰束倍。
px(pix):像素被丧,就是屏幕中最小的一個顯示單元。不同設(shè)備顯示效果相同绪妹。
dpi(像素密度):即每英寸屏幕所擁有的像素數(shù)甥桂,像素密度越大,顯示畫面細(xì)節(jié)就越豐富邮旷。計算公式:像素密度=√{(長度像素數(shù)2+寬度像素數(shù)2)}/ 屏幕尺寸
(注:屏幕尺寸單位為英寸 例:分辨率為1280*720 屏幕寬度為6英寸 計算所得像素密度約等于245黄选,屏幕尺寸指屏幕對角線的長度.)
dip: deviceindependent pixels ,設(shè)備獨(dú)立像素婶肩。不同設(shè)備有不同的顯示效果,這個和設(shè)備硬件有關(guān)办陷。
屏幕適配方式:
- 圖片適配
在我們的Android工程目錄中有如下drawable/mipmap-*dpi目錄,這些目錄是用來適配不同分辨率手機(jī)的律歼。
不同的目錄民镜,代表手機(jī)不同的像素密度:
以下是Android系統(tǒng)的適配策略:
Android應(yīng)用在查找圖片資源時會根據(jù)其分辨率自動從不同的文件目錄下查找。如果在低分辨的文件目錄中比如drawable-mdpi中沒有圖片資源苗膝,其他目錄中都有殃恒,當(dāng)我們將該應(yīng)用部署到mdpi分辨率的手機(jī)上時植旧,那么該應(yīng)用會查找分辨率較高目錄下的資源文件辱揭,如果較高分辨率目錄下也沒有資源則只好找較低目錄中的資源了。
1.尺寸適配
跟drawable目錄類似的病附,在Android工程的res目錄下有values目錄问窃,這個是默認(rèn)的目錄,同時為了適配不同尺寸手機(jī)我們可以創(chuàng)建一個values-1280x720的文件夾完沪,同時將dimens.xml文件拷貝到該目錄下域庇。
在dimens.xml中定義一個尺寸嵌戈,如下圖所示。
在values-1280x720目錄中的dimens.xml中定義同樣的尺寸名稱听皿,但是使用不同的尺寸熟呛,如下圖所示。
當(dāng)我們在布局文件中使用長或者寬度單位時尉姨,比如下圖所示庵朝,應(yīng)該使用@dimen/width來靈活的定義寬度。
- 布局適配-(這種適配幾乎不常見)
跟values一樣又厉,在Android工程目錄中l(wèi)ayout目錄也支持類似values目錄一樣的適配九府,在layout中我們可以針對不同手機(jī)的分辨率制定不同的布局,如下圖所示覆致。
權(quán)重適配(谷歌推薦)
在控件中使用屬性android:layout_weight="1"可以起到適配效果侄旬,但是該屬性的使用有如下規(guī)則: 只能用在線性控件中,比如LinearLayout煌妈。 豎直方向上使用權(quán)重的控件高度必須為0dp(Google官方的推薦用法) 水平方向上使用權(quán)重的控件寬度必須為0dp(Google官方的推薦用法)代碼適配
在java代碼中動態(tài)計算控件的寬度和高度儡羔。 注意:計算的寬度和高度,這里涉及到dp和px之間的轉(zhuǎn)化:
說明一下dp代表什么意思璧诵? dip: deviceindependent pixels(設(shè)備獨(dú)立像素)笔链。不同設(shè)備有不同的顯示效果,這個和設(shè)備硬件有關(guān)。這里指一個抽象意義上的像素腮猖,程序用它來定義界面元素鉴扫。一個與密度無關(guān),在邏輯尺寸上澈缺,與一個位于像素密度為160dpi的屏幕上的像素是一致的坪创。
要把密度無關(guān)像素轉(zhuǎn)換為屏幕像素可以用這樣一個簡單的公式:pixels=dips*(density/160)。
舉個例子姐赡,在DPI為240的屏幕上莱预,1個DIP等于1.5個物理像素。
代碼中相互換算:
- 百分比適配
該適配一般對圖片進(jìn)行適配的项滑。 比如:在同一張圖片依沮,在不同的設(shè)備中,按照圖片的寬高比例枪狂,進(jìn)行縮放顯示危喉。
- 獲取圖片的寬度和高度
- 計算圖片的寬度和高度的比例
- 根據(jù)圖片的比例,計算出圖片的在設(shè)備中的顯示的實際寬度和高度
關(guān)于切圖數(shù)量的分析:
跟UI人員要求,對于主流的手機(jī)機(jī)型分辨率,選1至2套完整的一套圖片(比如1920×1080分辨率是主流機(jī)型),這一套圖必須是完整的,但是對于平鋪整個界面的大圖需要多切幾套,比如說歡迎界面,幫助界面等之類的圖片,針對于小圖的話就只需要一套左右就夠了,因為小圖在屏幕上的稍微拉伸,人的視覺效果是很難感覺到的,在android studio圖片目錄結(jié)構(gòu)中,編譯工具找圖的順序是當(dāng)找不到的時候,先往高分辨率,再往低分辨率找.
為什么我們要將對應(yīng)分辨率的圖片放入對應(yīng)文件夾?(根據(jù)以下圖片進(jìn)行分析)
三星手機(jī)拍照有哪些bug?
攝像頭拍照后圖片數(shù)據(jù)有可能不能返回; 應(yīng)該是onActivityResult 的data為空
三星手機(jī)的相機(jī)camera強(qiáng)制切換到橫屏,導(dǎo)致Activity重啟生命周期(部分機(jī)型即使配置android:configChanges也不能阻止橫豎屏切換)
APP Activity A調(diào)用了系統(tǒng)拍照-->拍照-->在拍好照片的界面做幾次橫豎屏的轉(zhuǎn)換后-->返回APP界面時,Activity A卻被銷毀了
平時開發(fā)過程中,如何做到多分辨適配的?
- 首先明確開發(fā)設(shè)備分辨率:一般選擇1920*1080的分辨率(市面上主流的手機(jī)分辨率)
- 根據(jù)分辨率的不同建立不同分辨率的資源圖片(可以根據(jù)切圖的數(shù)量進(jìn)行分析)
- 在程序啟動的時候,獲取當(dāng)前屏幕的分辨率和密度,在代碼中進(jìn)行適配
- 根據(jù)目標(biāo)設(shè)備,為不同分辨率的寫不同的dimen文件
- 盡量使用權(quán)重分配(Google推薦)
- 根據(jù)需求可以使用代碼適配以及百分比適配
- 針對特殊的設(shè)備,進(jìn)行特殊的適配