android屏幕的適配方法

android手機五花八門,那麼對於我們這些做android開發的人來說,屏幕適配的問題,顯然是無法躲避的問題

1.首先就是使用的單位的問題,應該儘量使用dp和sp

屏幕尺寸:  也就是我們平時所說的某某手機是幾寸屏, 比如HTC one V這款手機是3.7寸的, 這裏的寸說的是英寸(inch),國際上習慣使用的單位,1inch = 2.54cm,3.7寸指的是屏幕的對角線的長度。

屏幕分辨率: 指屏幕的寬和高的像素數, 比如HTC one V是480*800的。

屏幕密度:   每inch的像素數,比如HTC one V, 是252 px/inch。 

px:  像素。一塊顯示屏是由很多的光點組成的,每一個光點就是一個像素。由於這些光點很小很密,想想看,在上面提到的3.7寸的手機上,橫向有480個光點,縱向有800個光點,所以顯示出來的文字或者圖片才很細膩平滑。

ppi: 和屏幕密度一個意思, 全稱是pixel per inch.  是專業一點的叫法.

dpi: dot per inch,每英寸的點數。在電子顯示範疇內它和PPI是一個意思。 只有在打印時這個縮寫纔有意義,在打印領域不存在 PPI的叫法,只說DPI,它表示打印機每英寸打印幾個像素點。寬高同樣像素下,dpi越大,打印出來的圖案越小。

dip: 或者叫dp,這是Android開發中特有的一種度量,稱作屏幕無關像素, 它不表示任何具體的長度或者像素點, 這個值只有在 具體屏幕密度的手機上,纔會被轉換爲具體的像素值。 這個時候纔會有實際意義。


dip和dp是一個意思,都是Density Independent Pixels的縮寫,即密度無關像素,上面我們說過,dpi是屏幕像素密度,假如一英寸裏面有160個像素,這個屏幕的像素密度就是160dpi,那麼在這種情況下,dp和px如何換算呢?在Android中,規定以160dpi爲基準,1dip=1px,如果密度是320dpi,則1dip=2px,以此類推。

假如同樣都是畫一條320px的線,在480*800分辨率手機上顯示爲2/3屏幕寬度,在320*480的手機上則佔滿了全屏,如果使用dp爲單位,在這兩種分辨率下,160dp都顯示爲屏幕一半的長度。這也是爲什麼在Android開發中,寫佈局的時候要儘量使用dp而不是px的原因。

而sp,即scale-independent pixels,與dp類似,但是可以根據文字大小首選項進行放縮,是設置字體大小的御用單位。

雖然說dp可以去除不同像素密度的問題,使得1dp在不同像素密度上面的顯示效果相同,但是還是由於Android屏幕設備的多樣性,如果使用dp來作爲度量單位,並不是所有的屏幕的寬度都是相同的dp長度,比如說,Nexus S和Nexus One屬於hdpi,屏幕寬度是320dp,而Nexus 5屬於xxhdpi,屏幕寬度是360dp,Galaxy Nexus屬於xhdpi,屏幕寬度是384dp,Nexus 6 屬於xxxhdpi,屏幕寬度是410dp。所以說,光Google自己一家的產品就已經有這麼多的標準,而且屏幕寬度和像素密度沒有任何關聯關係,即使我們使用dp,在320dp寬度的設備和410dp的設備上,還是會有90dp的差別。

2.weight適配

通過android中線性佈局中的屬性(layout_weight權重) 按比例來分配,已達到適配效果。

<code class="language-xml hljs  has-numbering"><span class="hljs-tag"><<span class="hljs-title">Button
</span>    <span class="hljs-attribute">android:layout_width</span>=<span class="hljs-value">"0dp"</span> 
    <span class="hljs-attribute">android:layout_weight</span>=<span class="hljs-value">"1"</span> 
    <span class="hljs-attribute">android:layout_height</span>=<span class="hljs-value">"wrap_content"</span>/></span></code>
3.圖片適配

不同像素密度的手機加載工程資源文件(res)中不同的資源圖片

一般性的圖片我們只切一兩個典型密度屏幕的圖片。但是apk是有可能會運行在從ldpi到xxhdpi的各種級別的手機上。這個時候就需要根據一定的策略去尋找圖片了。

Android系統尋找圖片的步驟是這樣的:

1, 去屏幕密度對應的目錄去找。如果找到就拿來用。

2, 如果沒找到,就去比這個密度高一級的目錄裏面去找,如果找到就拿來用。

3, 如果沒找到就繼續往上找。以此類推。

4, 如果到了xxhdpi目錄還沒有找到的話,就會去比自身屏幕密度低一級的目錄去找,如果低一級的目錄>=hdpi,找到了就拿來用。

5, 如果沒找到, 就去mdpi目錄去找, 如果找到了,就拿來用。

6, 如果沒找到,就去默認的drawble目錄裏去找, 如果找到了就拿來用。

7 ,如果沒找到,再去最低的ldpi目錄裏去找。如果找到了,就拿來用。

8, 如果沒找到, 那就是沒找到了, 圖片無法顯示。(不過一般不會出現這種現象,因爲如果每個目錄都沒有這個圖片的話,你是編譯不過的)

這裏有兩點需要注意:

①  首先會去比自己密度高的目錄裏去找,這是因爲因爲系統相信,你在密度更高的目錄裏會放置分辨率更大的圖片,這樣的話這個圖片會被縮小,但同時顯示效果不會有損失,但是如果優先去低一級別的目錄去找的話, 找到的圖片就會被放大,這樣的話這個圖片就會被拉扯模糊了。

e.g. 同一張圖片,你在mdpi和xxhdpi目錄各放了一份, 這個應用你現在運行在hdpi的手機上, 那應用會選擇哪張圖片呢。答案是xxhdpi目錄裏的。即便hdpi離mdpi更近一點!

②,如果在mdpi裏找不到是不會直接去ldpi裏找的, 而是先去默認的drawble目錄裏找,這是drawble目錄和drawble-mdpi是一個級別的。

4.layout適配

不同分辨率的手機,加載不同的佈局文件以達到適配效果。

創建多個layout(如:layout-1280x720、layout-800x480)文件夾用於存放不同像素密度手機所需佈局文件。

5.java代碼適配

<code class="language-JAVA hljs cs has-numbering">TextView tv = (TextView) findViewById(R.id.tv); 
<span class="hljs-comment">//獲取封裝當前手機屏幕信息對象,用於存放寬高值</span>
DisplayMetrics metrics = <span class="hljs-keyword">new</span> DisplayMetrics(); 
<span class="hljs-comment">//給當前屏幕設置寬高 </span>
getWindowManager().getDefaultDisplay().getMetrics(metrics); 
<span class="hljs-comment">//獲取屏幕高度 </span>
<span class="hljs-keyword">int</span> srceenHeight = metrics.heightPixels; 
<span class="hljs-comment">//獲取屏幕寬度 </span>
<span class="hljs-keyword">int</span> srceenWidth = metrics.widthPixels; 

<span class="hljs-comment">//寬高各佔50%</span>
RelativeLayout.LayoutParamslayoutParams = <span class="hljs-keyword">new</span> RelativeLayout.LayoutParams( (<span class="hljs-keyword">int</span>)(srceenWidth*<span class="hljs-number">0.5</span>+<span class="hljs-number">0.5</span>),(<span class="hljs-keyword">int</span>)(srceenHeight*<span class="hljs-number">0.5</span>+<span class="hljs-number">0.5</span>));
tv.setLayoutParams(layoutParams);</code>
6.dimen適配
dimens.xml存在於工程資源(res)文件夾中不同values(如:value-1280x720、value-800x480、values-xhdpi)文件夾下,可用於指定控件大小,不同像素密度手機加載不同values文件夾下的dimens.xml文件,通常用dimens適配,需要寫多個文件,去適配市面上主流的機型。

還有一種就是,給1-2000dp自動生成dimen值,(3.0以上)每一套都用sw-xxxdp(最低屏幕寬度)自動計算1-2000對應的dp,在佈局文件中使用該值,這樣就是增加了新的分辨率和佈局,dimen文件會自動沿用之前的,比較方便


發佈了37 篇原創文章 · 獲贊 4 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章