Android螢幕適配原理

來源:互聯網
上載者:User

標籤:android   style   http   color   ar   使用   sp   strong   檔案   

大綱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,約為2402)螢幕尺寸:對角線長度。有small,normal,large,extra large
3)方向:橫屏和豎屏
4)解析度:一個物理螢幕上總的像素點數,如480x800等。我們應用中並不使用解析度這個概念,主要是dpi和尺寸
5)dp(density-independent pixel)獨立像素單位。一個抽象概念,用來定位UI布局,包括尺寸和位置。


1、可以在android工程目錄res下有四個檔案夾,主要是為了支援多解析度的圖片drawable-hdpidrawable-mdpidrawable-ldpidrawable-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進行自動填滿。我們需要的是一個適當的比例,而不是精確的尺寸。

Android螢幕適配原理

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.