Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android屏幕適配原理

Android屏幕適配原理

編輯:關於Android編程

大綱 1、android中res目錄下的文件夾所對應屏幕尺寸 2、用dp表示尺寸的原理 3、對於720p尺寸的適配需要注意什麼 4、ui切圖按什麼尺寸給最好 參考:http://www.360doc.com/content/12/0301/17/5087210_190881395.shtml
幾個概念: 1) 屏幕密度(dpi) :dot per inch,即每英寸像素數。 ldpi(120),mdpi(160),hdpi(240),xhdpi(320) 計算方法: 以480x854,4.0inch手機為例,其對角線為4.0inch,對角線的像素數為:(480^2 + 854^2)開根號 = 979. 所以其dpi = 979 / 4 = 245,約為240 2)屏幕尺寸:對角線長度。有small,normal,large,extra large
3)方向:橫屏和豎屏
4)分辨率:一個物理屏幕上總的像素點數,如480x800等。我們應用中並不使用分辨率這個概念,主要是dpi和尺寸
5)dp(density-independent pixel)獨立像素單位。一個抽象概念,用來定位UI布局,包括尺寸和位置。


1、可以在android工程目錄res下有四個文件夾,主要是為了支持多分辨率的圖片 drawable-hdpi drawable-mdpi drawable-ldpi drawable-xhdpi


當設計給出切圖時,我們首先需要明確一點,設計給出的切圖是在什麼尺寸下給出的。如果是480x800的切圖,則應該放入drawable-hdpi目錄下,如果是320x480的切圖,則應該放在mdpi目錄下。如果是720x1280的切圖,則應該放在xhdpi目錄下。
當使用該圖片時,系統會根據機器的分辨率到相應的文件夾下查找圖片。
問題1:如果只放一套圖片,系統如何對圖片的分辨率進行轉換? android系統加載圖片資源遵循下面的規則:首先判斷手機的屏幕密度,然後在相應的密度下文件夾中查找圖片資源。如果找到,則進行顯示。如果找不到,則會從drawable或者其他drawable-*文件夾中尋找。找到後,將文件夾所表示的密度與手機實際密度進行比較,從而縮放圖片。例如在drawable下找到資源(等價於從drawable-mdpi),而手機又是hdpi的,這樣android在顯示圖片時會將圖片進行放大,以滿足hdpi手機顯示需要。不難想象,圖片肯定會變模糊。
系統加載圖片前先將圖片進行縮放,因此你通過getwidth得到的尺寸已經是經過縮放的尺寸了。縮放比例與密度之比保持一致。
問題2:如果切圖放錯文件夾會有什麼問題? 如果放錯文件夾,系統會進行相應的縮放,使圖片進行錯誤的縮放。例如hdpi的圖片放到mdpi中,在hdpi的手機顯示,會比原圖片大
問題3:720p圖片相關問題?
設計給切圖,最好根據那個dpi呢?是都可以嗎?一般應該給480*800的hdpi的切圖。這樣對於mdpi,可以自動縮小。圖像顯示質量不受影響。對於xdpi,放大幅度不大,圖像顯示質量影響較小。
那麼為什麼不用xhdpi呢,這樣都是縮小圖像不是更好嗎?有兩個理由,一是增大了apk的尺寸,另一個就是容易引起切圖的變形,影響顯示。主要是對於.9的圖片,有對某一方向進行了壓縮,如果設置時,拉伸區域太小,再壓縮時可能變形。當然這也不是絕對的,可以通過增大.9.png文件的拉伸區域來實現。 或許還有個理由,xhpi的機型比較不占多數。
2、dp工作原理
最關鍵要記住一個公式: android在計算pixel值時會首先判斷屏幕的密度。如果我們把mdpi設為1,則hdpi就等於1.5. 如果我們使用dp為單位,android在轉換為pixel時會依據下面公式:
px = dp * density;

dp表示獨立像素密度,所謂獨立,就是不依賴與屏幕的密度。 從本質上來看,dp其實表示是相同的物理長度,注:不是以像素為單位,而是以inch為單位。 例如對於mdpi,長度為m inch的屏幕,其像素數為n1,dp數為n2. 對於hdpi,也是長度為m inch,包含的像素數為n1 * 1.5. 根據公式可以算出,其dp值為n1 * 1.5 / 1.5 = n1. 對於xhdpi的也是n1.
即:相同的物理長度其dp值相同。

從表象上看,dp可以表示一個相同的比例 也就是在ldpi、mdpi、hdpi和xdpi的屏幕密度中,用同一個dp值,可以表示相同的比例。
請注意:是比例而不是尺寸。因為UI設計中,我們最關心的是一個視圖相對於整個屏幕的比例,例如:在mdpi中,某TextView的長度占屏幕寬度的1/2,假設屏幕的寬度像素為320pixel,那麼TextView為160pixel。而在hdpi中,我們需要該TextView也占到屏幕的1/2,才能稱之為適應了不同的屏幕密度。為了實現這個目標,Android提供了dp的概念。
我們把dip為160(mdpi)的屏幕與dp一一對應起來,即mdpi屏幕中,1個pixel就等於1個dp。通常,mdpi的屏幕寬度為320pixel,所以其屏幕寬度為320dp。
那麼在hdpi屏幕中,其寬度通常為480pixel。其1/2為240pixel。如果用pixel表示,我們就需要使用兩個值(mdpi:160px,hdpi:240px),而我們又只能輸入1個值。這個問題該如何解決?


這樣對於mdpi,160dp對應的px為160*1 = 160,為屏幕寬度320px的一半。而對於hdpi,160dp對應的px為160*1.5 = 240px,也為屏幕寬度480px的一半。這樣,我們用一個值:160dp,實際上表示了兩個像素:160px和240dp。
再進一步分析:由於相同長度下(1inch),hdpi和mdpi的像素數比值為一個定值(1.5),那麼hdpi和mdpi都截取相同的比例(n/m),其比值還是1.5.這時,我們把mdpi的一個像素看成單位1,則hdpi就是1.5.也就是說要表示相同的比例,那麼hdpi和mdpi的像素比值必須為1.5.現在,我們讓android操作系統替我們記錄下這個比值,我們就用以mdpi為單位1進行計數(重新創建一個單位:dp)。當使用時,我們只寫出dp值,然後由操作系統自動乘上這個比值。這樣,1個dp表示的數值可以表示一個標准的比例了。
簡單的說:其實dp表示的是一個比例。在mdpi中1dp表示1/320, 在hdpi中1dp也表示1/320.由android操作系統利用density在後台重新計算保證了相同的dp值能夠表示相同的比例。
注:上述說法也是有限制的。dp表示比例還必須要有一個前提,那就是屏幕的尺寸和密度必須滿足下面的條件: mdpi:3.5inch,320*480, hdpi:4.0inch,480*800或480*854,xhdpi:4.5inch,720*1280.即使是這樣,也只能保證mdpi和hdpi有相同的比例,而xhdpi則不能。以滿屏寬度為例,mdpi和hdpi都是320dp,而xhdpi為360dp。
那麼既然dp也僅僅是特殊情況才能保持相同的比例,那麼是不是用處就大打折扣了呢?
要記住,android屏幕適配終究是相對的,因為尺寸太多,不可能完全適配,所以我們只適配大眾的,數量最多的。現在數量最多也就是上述尺寸,其他的都是小眾。因此針對上述屏幕進行ui設計,可以滿足大部分手機的ui正常。
其他尺寸的手機怎麼辦? 我們應該記住這個原則:盡量少用dp定義具體寬度。
為什麼是寬度?因為我們常見的ui元素,其寬度都是不固定的。高度可以固定。如各種button。我們盡量用dp來表示間隔,而用fill_parent、wrap_parent、weight等屬性來使UI進行自動填充。我們需要的是一個適當的比例,而不是精確的尺寸。
  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved