天天看點

安卓适配問題

Android螢幕适配出現的原因

由于Android系統的開放性,任何使用者、開發者、OEM廠商、營運商都可以對Android進行定制,修改成他們想要的樣子。但是這種“碎片化”到底到達什麼程度呢?在2012年,OpenSignalMaps(以下簡稱OSM)釋出了第一份Android碎片化報告,統計資料表明,2012年,支援Android的裝置共有3997種。2013年,支援Android的裝置共有11868種。2014年,支援Android的裝置共有18796種。右邊這張圖檔所顯示的内容足以充分說明當今Android系統碎片化問題的嚴重性,因為該圖檔中的每一個矩形都代表着一種Android裝置詳細的統計資料請到這裡檢視

安卓适配問題

而随着支援Android系統的裝置(手機、平闆、電視、手表)的增多,裝置碎片化、品牌碎片化、系統碎片化、傳感器碎片化和螢幕碎片化的程度也在不斷地加深。而我們今天要探讨的,則是對我們開發影響比較大的——螢幕的碎片化。 右一是Android螢幕尺寸的示意圖 藍色矩形的大小代表不同尺寸,顔色深淺則代表所占百分比的大小。 右二隻是4,4s,5,5c,5s和平闆的尺寸,現在還應該加上新推出的iphone6和plus,但是和Android的螢幕碎片化程度相比而言,還是差的太遠

安卓适配問題

概念概述

1.什麼是螢幕尺寸、螢幕分辨率、螢幕像素密度?

螢幕尺寸:是指螢幕對角線的長度。機關是英寸,1英寸=2.54厘米;           比如常見的螢幕尺寸有2.4、2.8、3.5、3.7、4.2、5.0、5.5、6.0等 螢幕分辨率:是指在橫縱向上的像素點數,機關是px,1px=1像素點,一般是縱向像素橫向像素,如1280×720; 螢幕像素密度:是指每英寸上的像素點數,機關是dpi,即“dot per inch”的縮寫,像素密度和螢幕尺寸和螢幕分辨率有關。在單一變化條件下,螢幕尺寸越小、分辨率越高,像素密度越大,反之越小。

三者關系

安卓适配問題

例如:計算Nexus5的螢幕像素密度: 螢幕尺寸:4.95inch、分辨率:1920×1080,螢幕像素密度:445

安卓适配問題

2.dp、dip、dpi、sp、px

px我們應該是比較熟悉的,前面的分辨率就是用的像素為機關, 大多數情況下,比如UI設計、Android原生API都會以px作為統一的計量機關, dip和dp是一個意思,都是Density Independent Pixels的縮寫,即密度無關像素,上面我們說過,dpi是螢幕像素密度,假如一英寸裡面有160個像素,這個螢幕的像素密度就是160dpi,那麼在這種情況下,dp和px如何換算呢?在Android中,規定以160dpi為基準,1dip=1px,如果密度是320dpi,則1dip=2px,以此類推。 sp,即scale-independent pixels,與dp類似,但是可以根據文字大小首選項進行放縮,是設定字型大小的禦用機關。 假如同樣都是畫一條480px的線,在720*1280分辨率手機上顯示為2/3螢幕寬度,在480*800的手機上則占滿了全屏,如果使用dp為機關,在這兩種分辨率下160dp都顯示為螢幕一般的長度。這也是為什麼在Android開發中,寫布局的時候要盡量使用dp而不是px的原因。下頁圖例

安卓适配問題

3.什麼是mdpi、hdpi、xdpi、xxdpi、xxxdpi?如何計算和區分?

安卓适配問題

用于區分不同的像素密度。 現在主流的手機,都可以找到自己所在的螢幕密度檔次。比如一般來說720p的手機是xhdpi,1080p的是xxhdpi。還有一種情況,比如同樣都是4 英寸的480*800和4英寸的960*540,盡管實際算出來的dpi不一樣,但是都要歸到hdpi這一檔,dpi都變成了240,這是Android 系統做的一種近似處理,目的是為了簡化計算。也就是說,雖然實際上手機的密度有很多種,但是大家會找到自己的近似區間,然後用區間的代表值去做運算。

根據前面講的螢幕密度區間,你可以記住這樣一個簡單的計算方法:

安卓适配問題

dp 是一個虛拟的概念,是在程式運作的時候算出來的。怎麼了解呢?Android裝置那麼多,分辨率也那麼多,直接學iOS用px做機關肯定不行的。為此 Google搞了一個叫dp的東西,換算公式是dp=(dpi/160)*px。也就是說,在密度為160dpi的螢幕上,1px就是1dp。依次類推, 在320dpi的螢幕上,1dp就是2px。螢幕密度越大,1個dp對應的px也就越多。

二,解決方案-螢幕适配

1、圖檔适配

圖檔的查找順序: ldpi 、mdpi 、 hdpi 、xhdpi、xxhdpi、xxxhdpi 先找自己對應的檔案夾,再往大的找,大的檔案夾中沒有圖檔,就再往小的找 例如mdpi(480*320)的手機,查找順序如下     mdpi 、drawable 、 hdpi 、xhdpi、、xxhdpi、xxxhdpi、ldip

2、尺寸适配

根據分辨率建立相應values檔案夾, 比如 values-1280x720 (大值在前)

在values檔案夾下建立:dimens xml檔案

在values-800x480檔案夾下建立:dimens xml檔案

在values-1280x720檔案夾下建立:dimens xml檔案              

安卓适配問題
安卓适配問題
安卓适配問題

代碼示範螢幕寬度的一半。

相應的,在開發的時候,Google提供了一些資源目錄,你可以把對應大小的圖檔放進去。

安卓适配問題

舉個例子,你想展示一張100dp*100dp的圖檔,那麼 在mdpi目錄下,你需要放100px*100px的原圖。 在xxxhdpi下,這張圖檔就得是 300px*300px。你的APP在運作的時候,如果需要加載這張圖檔,系統就會根據目前手機的密度,去相應的資源目錄下去找。你可能會問,找不到怎麼辦呢?比如目前是mdpi的手機,系統發現mdpi下沒有這張圖,就會去比mdpi更大的目錄找,然後進行縮放。實在找不到就去比mdpi更小的目錄找, 找到之後再拉伸。那麼設計師在出圖的時候,有兩種方法可以選。 一是按照官方的推薦方法,在上面所有目錄下各放置一份同樣的圖檔,根據dp和px的換算關系切成不同的大小,讓系統自動去尋找最合适的圖檔。這種方法成倍的增加設計師的工作量不說,還會增加安裝包的體積,使用者下載下傳的時候要多耗費流量。 第二種方法是選一個基準的螢幕密度,比如xhdpi,720p。所有的資源都放在這裡,讓系統自動 去縮放。這種方法呢,對于小螢幕的手機來說,因為要在運作的時候把一張大圖縮放成小圖,不如直接用小圖節省記憶體。對大螢幕的手機呢,比如你720p的圖拿 到1080p的手機去顯示,肯定會因為縮放而失真。 綜合起來的話,我更傾向于第二種方法。具體選擇哪種螢幕密度做标準,你可以參考下Google官方的統計或者友盟上面的主流分辨率。

3、布局适配

和圖檔适配差不多。我們可以為不同的螢幕建立 不同的layout檔案夾     如果我們想讓大螢幕的手機顯示布局和别的手機不一樣,就可以再為大屏建立一個layout。 根據分辨率建立layout檔案夾:比如layout-1280x720

4、代碼适配

應用場景: 1,有些公司為了反編譯,把布局用代碼生成,而不寫布局檔案 2,有些廣告公司需要給開發者提供jar包,而jar包中不能直接寫布局,是以需要用代碼寫布局,需要用到代碼适配

安卓适配問題

5、權重适配

weight:權重 線上性布局中可以使用weight屬性設定控件所占的比例

安卓适配問題

繼續閱讀