Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android圖片分辨率應該放到哪個文件夾的問題

Android圖片分辨率應該放到哪個文件夾的問題

編輯:關於Android編程

(1)drawable-hdpi裡面存放高分辨率的圖片,如WVGA (480x800),FWVGA (480x854)

(2)drawable-mdpi裡面存放中等分辨率的圖片,如HVGA (320x480)

(3)drawable-ldpi裡面存放低分辨率的圖片,如QVGA (240x320)

ldpi:240x320mdpi:320x480hdpi:480x800、480x854xhdpi:至少960*720xxhdpi:1280×720

android 自適應 多屏幕支持1、屏幕相關概念

1.1分辨率

是指屏幕上有橫豎各有多少個像素

1.2屏幕尺寸

指的是手機實際的物理尺寸,比如常用的2.8英寸,3.2英寸,3.5英寸,3.7英寸 .4.65英寸,5.0英寸,5.5英寸

android將屏幕大小分為四個級別(small,normal,large,and extra large)。

1.3屏幕密度

每英寸像素數

手機可以有相同的分辨率,但屏幕尺寸可以不相同,

Diagonal pixel表示對角線的像素值(=),DPI=933/3.7=252

android將實際的屏幕密度分為四個通用尺寸(low,medium,high,and extra high)

一般情況下的普通屏幕:ldpi是120dpi,mdpi是160dpi,hdpi是240dpi,xhdpi是320dpi

對於屏幕來說,dpi越大,屏幕的精細度越高,屏幕看起來就越清楚

1.4密度無關的像素(Density-independent pixel——dip)

dip是一種虛擬的像素單位

dip和具體像素值的對應公式是dip/pixel=dpi值/160,也就是px = dp * (dpi / 160)

當你定義應用的布局的UI時應該使用dp單位,確保UI在不同的屏幕上正確顯示。

手機屏幕分類和像素密度的對應關系如表1所示

手機尺寸分布情況(http://developer.android.com/resources/dashboard/screens.html)如圖所示,

目前主要是以分辨率為800*480和854*480的手機用戶居多

從以上的屏幕尺寸分布情況上看,其實手機只要考慮3-5.5寸之間密度為1和1.5的手機

2、android多屏幕支持機制

Android的支持多屏幕機制即用為當前設備屏幕提供一種合適的方式來共同管理並解析應用資源。

Android平台中支持一系列你所提供的指定大小(size-specific),指定密度(density-specific)的合適資源。

指定大小(size-specific)的合適資源是指small, normal, large, and xlarge。

指定密度(density-specific)的合適資源,是指ldpi (low), mdpi (medium), hdpi (high), and xhdpi (extra high).

Android有個自動匹配機制去選擇對應的布局和圖片資源

1)界面布局方面

根據物理尺寸的大小准備5套布局:

layout(放一些通用布局xml文件,比如界面頂部和底部的布局,不會隨著屏幕大小變化,類似windos窗口的title bar),

layout-small(屏幕尺寸小於3英寸左右的布局),

layout-normal(屏幕尺寸小於4.5英寸左右),

layout-large(4英寸-7英寸之間),

layout-xlarge(7-10英寸之間)

2)圖片資源方面

需要根據dpi值准備5套圖片資源:

drawable:主要放置xml配置文件或者對分辨率要求較低的圖片

drawalbe-ldpi:低分辨率的圖片,如QVGA (240x320)

drawable-mdpi:中等分辨率的圖片,如HVGA (320x480)

drawable-hdpi:高分辨率的圖片,如WVGA (480x800),FWVGA (480x854)

drawable-xhdpi:至少960dp x 720dp

Android有個自動匹配機制去選擇對應的布局和圖片資源。

系統會根據機器的分辨率來分別到這幾個文件夾裡面去找對應的圖片。

在開發程序時為了兼容不同平台不同屏幕,建議各自文件夾根據需求均存放不同版本圖片。

3、AndroidManifest.xml 配置

android從1.6和更高,Google為了方便開發者對於各種分辨率機型的移植而增加了自動適配的功能

android:largeScreens="true"

android:normalScreens="true"

android:smallScreens="true"

android:anyDensity="true"/>

3.1是否支持多種不同密度的屏幕

android:anyDensity=["true" | "false"]

如果android:anyDensity="true"

指應用程序支持不同密度,會根據屏幕的分辨率自動去匹配。

如果android:anyDensity="false"

應用程序支持不同密度,系統自動縮放圖片尺寸和這個圖片的坐標。具體解釋一下系統是如何自動縮放資源的。

例如我們在hdpi,mdpi,ldpi文件夾下擁有同一種資源,那麼應用也不會自動地去相應文件夾下尋找資源,這種情況都是出現在高密度,以及低密度的手機上,比如說一部240×320像素的手機,

如果設置android:anyDensity="false",Android系統會將240 x 320(低密度)轉換為 320×480(中密度),這樣的話,應用就會在小密度手機上加載mdpi文件中的資源。

3.2是否支持大屏幕

android:largeScreens=["true" | "false"]

如果在聲明不支持的大屏幕,而這個屏幕尺寸是larger的話,系統使用尺寸為("normal")和密度為("medium)顯示,

不過會出現一層黑色的背景。

3.3是否支持小屏幕

android:smallScreens=["true" | "false"]

如果在聲明不支持的小屏幕,而當前屏幕尺寸是smaller的話,系統也使用尺寸為("normal")和密度為("medium)顯示

如果應用程序能在小屏幕上正確縮放(最低是small尺寸或最小寬度320dp),那就不需要用到本屬性。否則,就應該為最小屏幕寬度標識符設置本屬性

來匹配應用程序所需的最小尺寸。

4、Android提供3種方式處理屏幕自適應

4.1預縮放的資源(基於尺寸和密度去尋找圖片)

1)如果找到相應的尺寸和密度,則利用這些圖片進行無縮放顯示。

2)如果沒法找到相應的尺寸,而找到密度,則認為該圖片尺寸為 "medium",利用縮放顯示這個圖片。

3)如果都無法匹配,則使用默認圖片進行縮放顯示。默認圖片默認標配 "medium" (160)。

4.2自動縮放的像素尺寸和坐標(密度兼容)

1)如果應用程序不支持不同密度android:anyDensity="false",系統自動縮放圖片尺寸和這個圖片的坐標。

2)對於預縮放的資源,當android:anyDensity="false",也不生效。

3)android:anyDensity="false",只對密度兼容起作用,尺寸兼容沒效果

4.3兼容更大的屏幕和尺寸(尺寸兼容)

1)對於你在聲明不支持的大屏幕,而這個屏幕尺寸是normal的話,系統使用尺寸為 ("normal")和密度為("medium)顯示。

2.)對於你在聲明不支持的大屏幕,而這個屏幕尺寸是larger的話,系統同樣使用尺寸為("normal")和密度為("medium)顯示,

不過會出現一層黑色的背景。

5、Android系統自動適配技巧

Android系統采用下面兩種方法來實現應用的自動適配:

1)布局文件中定義長度的時候,最好使用wrap_content,fill_parent, 或者dp 進行描述,這樣可以保證在屏幕上面展示的時候有合適的大小

2)為不同屏幕密度的手機,提供不同的位圖資源,可以使得界面清晰無縮放。

對應bitmap 資源來說,自動的縮放有時會造成放大縮小後的圖像變得模糊不清,這是就需要應用為不同屏幕密度配置提供不同的資源:為高密度的屏幕提供高清晰度的圖像等。

3)不要使用AbsoluteLayout

4)像素單位都使用DIP,文本單位使用SP

6、在代碼中獲取屏幕像素、屏幕密度

DisplayMetrics metric = new DisplayMetrics();

getWindowManager().getDefaultDisplay().getMetrics(metric);

int width = metric.widthPixels; // 屏幕寬度(像素)

int height = metric.heightPixels; // 屏幕高度(像素)

float density = metric.density; // 屏幕密度(0.75 / 1.0 / 1.5)

int densityDpi = metric.densityDpi; // 屏幕密度DPI(120 / 160 / 240)

7、 一般多分辨率處理方法及其缺點

7.1 圖片縮放

基於當前屏幕的精度,平台自動加載任何未經縮放的限定尺寸和精度的圖片。如果圖片不匹配,平台會加載默認資源並且在放大或者縮小之後可以滿足當前界面的顯示要求。例如,當前為高精度屏幕,平台會加載高精度資源(如HelloAndroid中drawable-hdpi 中的位圖資源),如果沒有,平台會將中精度資源縮放至高精度,導致圖片顯示不清晰。

7.2 自動定義像素尺寸和位置

如果程序不支持多種精度屏幕,平台會自動定義像素絕對位置和尺寸值等,這樣就能保證元素能和精度160 的屏幕上一樣能顯示出同樣尺寸的效果。例如,要讓WVGA 高精度屏幕和傳統的HVGA 屏幕一樣顯示同樣尺寸的圖片,當程序不支持時,系統會對程序慌稱屏幕分辨率為320×480,在(10,10)到(100,100)的區域內繪制圖形完成之後,系統會將圖形放大到(15,15)到(150,150)的屏幕顯示區域。

7.3 兼容更大尺寸的屏幕

當前屏幕超過程序所支持屏幕的上限時,定義supportsscreens元素,這樣超出顯示的基准線時,平台在此顯示黑色的背景圖。例如,WVGA 中精度屏幕上,如程序不支持這樣的大屏幕,系統會謊稱是一個320×480 的,多余的顯示區域會被填充成黑色。

7.4 采用OpenGL 動態繪制圖片

Android 底層提供了OpenGL 的接口和方法,可以動態繪制圖片,但是這種方式對不熟悉計算機圖形學的開發者來講是一個很大的挑戰。一般開發游戲,采用OpenGL 方式。

7.5 多個apk 文件

Symbian 和傳統的J2ME 就是采用這種方式,為一款應用提供多個分辨率版本,用戶根據自己的需求下載安裝相應的可執行文件。針對每一種屏幕單獨開發應用程序不失為一種好方法,但是目前Google Market 對一個應用程序多個分辨率版本的支持還不完善,開發者還是需要盡可能使用一個apk 文件適應多個分辨率。

是根據drawable文件夾的修飾符進行選擇的。

比如drawable、drawable-ldpi、drawable-mdpi、drawable-hdpi、drawable-xhdpi、drawalbe-xxhdpi、drawable-xxxhdpi

根據修飾符進行優先匹配。

不同的dpi修飾符對應的dpi如下

drawable-ldpi 120DPI

drawable-mdpi 160DPI

drawable-hdpi 240DPI

drawable-xhdpi 320DPI

drawalbe-xxhdpi 480DPI

drawable-xxxhdpi 640DPI

dpi是根據手機的當前分辨率ppi歸一化得到的。

那麼PPI如何得來的?

如果手機的寬為X,高為Y,屏幕大小為Z英寸,那麼

公式中的X2其實是X的平方,即X*X。

比如三星手機I9260分辨率是1280*720,屏幕大小是4.65英寸,那麼計算得到的PPI就是315.8PPI

找一個最近的DPI值應該是320DPI,也就是這個設備被歸一化後就是320DPI。屬於xhdpi。

系統取圖片時會優先選擇drawable-xhdpi裡面的圖片,如果drawable-xhdpi不存在或者沒有這張圖,就會就近從其它分辨率和默認的無後綴drawable文件夾下取。

比如工程只有在draw-xxhdpi文件下有img圖片,而你的設置是xhdpi,就會從xxhdpi取完圖片再壓縮到對應大小返回給使用者。

官方介紹 圖片是放在drawable 目錄下 還是mipmap下

Mipmapping for drawables

Using a mipmap as the source for your bitmap or drawable is a simple way to provide a quality image and various image scales, which can be particularly useful if you expect your image to be scaled during an animation.

Android 4.2 (API level 17) added support for mipmaps in the Bitmap class—Android swaps the mip images in your Bitmap when you've supplied a mipmap source and have enabled setHasMipMap(). Now in Android 4.3, you can enable mipmaps for a BitmapDrawable object as well, by providing a mipmap asset and setting the android:mipMap attribute in a bitmap resource file or by calling hasMipMap().

圖片文件都建議放在mipmap中。

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved