引言
在出發(fā)之前,預(yù)備好android常用圖標(biāo)、圖片的尺寸以及它們存放的位置吧!
正文
icon圖標(biāo)尺寸:
- drawable-hdpi-icon 72*72
- drawable-ldpi-icon 36*36
- drawable-mdpi-icon 48*48
- drawable-xhdpi-icon 96*96
- drawable-xxhdpi-icon 144*144
- drawable-xxxhdpi-icon 192*192
啟動(dòng)頁:
橫屏 高×寬
- drawable-land-hdpi-screen 480*800
- drawable-land-ldpi-screen 200*320
- drawable-land-mdpi-screen 320*480
- drawable-land-xhdpi-screen 720*1280
- drawable-land-xxhdpi-screen 960*1600
- drawable-land-xxxhdpi-screen 1280*1920
豎屏 高×寬
- drawable-port-hdpi-screen 800*480
- drawable-port-ldpi-screen 320*200
- drawable-port-mdpi-screen 480*320
- drawable-port-xhdpi-screen 1280*720
- drawable-port-xxhdpi-screen 1600*960
- drawable-port-xxxhdpi-screen 1920*1280
bitmap存放位置的問題
Google官方有介紹:Managing Projects Overview
drawable/For bitmap files (PNG, JPEG, or GIF), 9-Patch image files, and XML files that describe Drawable shapes or Drawable objects that contain multiple states (normal, pressed, or focused). See the Drawable resource type.
mipmap/For app launcher icons. The Android system retains the resources in this folder (and density-specific folders such as mipmap-xxxhdpi) regardless of the screen resolution of the device where your app is installed. This behavior allows launcher apps to pick the best resolution icon for your app to display on the home screen. For more information about using the mipmap folders, see Managing Launcher Icons as mipmap Resources.
圖標(biāo)放mipmap
,其他放drawable
。
mipmap
下面只是用來放icon
的。而.png 、.9.png、.jpg、.gif 的圖片資源是放到drawable文件夾下的。圖片一般是png
格式的。
構(gòu)建APK時(shí),根據(jù)目標(biāo)屏幕的分辨率大小,AAPT
會(huì)從drawable
中去掉不需要的其他分辨率圖片資源,而mipmap中的圖片資源則會(huì)保留在APK中。在“所需分辨率與目標(biāo)分辨率不同”的情況下,最典型的例子是Android啟動(dòng)器,它會(huì)在桌面顯示更大更清晰的圖標(biāo),所以不會(huì)使用當(dāng)前分辨率的圖標(biāo)資源,而是向上取更高分辨率的一個(gè)資源。如對(duì)于XXHDPI的Nexus5,它的啟動(dòng)器會(huì)拉取XXXHDPI的啟動(dòng)器圖標(biāo)。所以需要在mipmap中保留其他分辨率的圖標(biāo)資源。
注:aapt即AndroidAssetPackagingTool,在SDK的build-tools目錄下。該工具可以查看,創(chuàng)建,更新ZIP格式的文檔附件(zip,jar,apk)。也可將資源文件編譯成二進(jìn)制文件,盡管你可能沒有直接使用過aapt工具,但是buildscripts和IDE插件會(huì)使用這個(gè)工具打包apk文件構(gòu)成一個(gè)Android應(yīng)用程序。在使用aapt之前需要在環(huán)境變量里面配置SDK-tools路徑,或者是路徑+aapt的方式進(jìn)入aapt。
Android 自適應(yīng) 多屏幕支持
1. 屏幕相關(guān)概念
1.1分辨率
分辨率是指屏幕上有橫豎各有多少個(gè)像素
1.2屏幕尺寸
屏幕尺寸指的是手機(jī)實(shí)際的物理尺寸,比如常用的2.8英寸,3.2英寸,3.5英寸,3.7英寸 .4.65英寸,5.0英寸,5.5英寸。
Android將屏幕大小分為四個(gè)級(jí)別(small,normal,large,and extra large)。
1.3屏幕密度
每英寸像素?cái)?shù)
手機(jī)可以有相同的分辨率,但屏幕尺寸可以不相同,
Diagonal pixel表示對(duì)角線的像素值(=),DPI=933/3.7=252
Android將實(shí)際的屏幕密度分為四個(gè)通用尺寸(low,medium,high,and extra high)
一般情況下的普通屏幕:ldpi是120dpi,mdpi是160dpi,hdpi是240dpi,xhdpi是320dpi
對(duì)于屏幕來說,dpi越大,屏幕的精細(xì)度越高,屏幕看起來就越清楚
1.4密度無關(guān)的像素
dip是一種虛擬的像素單位,dip 全稱是Density-independent pixel 翻譯過來就是:像素?zé)o關(guān)密度。他的大小就是一個(gè)1個(gè)dpi 有160個(gè)像素的屏幕大小
dip和具體像素值的對(duì)應(yīng)公式是
dip = 160px/dpi
px = dip*dpi/160
當(dāng)你定義應(yīng)用的布局的UI時(shí)應(yīng)該使用dp單位,確保UI在不同的屏幕上正確顯示。
試想現(xiàn)在有2個(gè)屏幕,屏幕的大小都是1寸,A屏幕密度為160,B屏幕密度為320。要去顯示一個(gè)為寬度為80按鈕button。如果用px為單位,A屏幕上button占屏幕的一半0.5寸,B屏幕上button占屏幕的四分之一 0.25寸,小了一半。如果用dip 為單位 80dip
A屏幕上的大小是:80160/160=80px,
B屏幕上的大小 : 80320/160 = 160px 。
由于B的密度是A的2倍,現(xiàn)在B屏幕上button的大小自動(dòng)增加了一倍,這樣在A和B屏幕上button可以顯示相同的大小了。使用dip這個(gè)單位也就達(dá)到了適配的目的,順便說一句dip原本是dip,為了和sp這個(gè)單位統(tǒng)一,改名成了dp。
2. Android多屏幕支持機(jī)制
Android的支持多屏幕機(jī)制即:為當(dāng)前設(shè)備屏幕提供一種合適的方式來共同管理并解析應(yīng)用資源。
Android平臺(tái)中支持一系列你所提供的指定大小(size-specific),指定密度(density-specific)的合適資源。
指定大小(size-specific)的合適資源是指small, normal, large, and xlarge。
指定密度(density-specific)的合適資源,是指ldpi (low), mdpi (medium), hdpi (high), and xhdpi (extra high).
Android有個(gè)自動(dòng)匹配機(jī)制去選擇對(duì)應(yīng)的布局和圖片資源
1)界面布局方面
根據(jù)物理尺寸的大小準(zhǔn)備5套布局:
layout(放一些通用布局xml文件,比如界面頂部和底部的布局,不會(huì)隨著屏幕大小變化,類似windows窗口的title bar),
layout-small(屏幕尺寸小于3英寸左右的布局),
layout-normal(屏幕尺寸小于4.5英寸左右),
layout-large(4英寸-7英寸之間),
layout-xlarge(7-10英寸之間)
2)圖片資源方面
需要根據(jù)dpi值準(zhǔn)備5套圖片資源:
drawable:主要放置xml配置文件或者對(duì)分辨率要求較低的圖片
drawalbe-ldpi:低分辨率的圖片,如QVGA (240x320)
drawable-mdpi:中等分辨率的圖片,如HVGA (320x480)
drawable-hdpi:高分辨率的圖片,如WVGA (480x800),FWVGA (480x854)
drawable-xhdpi:至少960dp x 720dp
Android有個(gè)自動(dòng)匹配機(jī)制去選擇對(duì)應(yīng)的布局和圖片資源。
系統(tǒng)會(huì)根據(jù)機(jī)器的分辨率分別到這幾個(gè)文件夾里面去找對(duì)應(yīng)的圖片。
在開發(fā)程序時(shí)為了兼容不同平臺(tái)不同屏幕,建議各自文件夾根據(jù)需求均存放不同版本圖片。
3. AndroidManifest.xml 配置
android從1.6和更高,Google為了方便開發(fā)者對(duì)于各種分辨率機(jī)型的移植而增加了自動(dòng)適配的功能
android:largeScreens="true"
android:normalScreens="true"
android:smallScreens="true"
android:anyDensity="true"/>
4. Android提供3種方式處理屏幕自適應(yīng)
4.1預(yù)縮放的資源(基于尺寸和密度去尋找圖片)
1)如果找到相應(yīng)的尺寸和密度,則利用這些圖片進(jìn)行無縮放顯示。
2)如果沒法找到相應(yīng)的尺寸,而找到密度,則認(rèn)為該圖片尺寸為 "medium",利用縮放顯示這個(gè)圖片。
3)如果都無法匹配,則使用默認(rèn)圖片進(jìn)行縮放顯示。默認(rèn)圖片默認(rèn)標(biāo)配 "medium" (160)。
5. Android系統(tǒng)自動(dòng)適配技巧
Android系統(tǒng)采用下面兩種方法來實(shí)現(xiàn)應(yīng)用的自動(dòng)適配:
1)布局文件中定義長度的時(shí)候,最好使用wrap_content,fill_parent, 或者dp 進(jìn)行描述,這樣可以保證在屏幕上面展示的時(shí)候有合適的大小
2)為不同屏幕密度的手機(jī),提供不同的位圖資源,可以使得界面清晰無縮放。
對(duì)應(yīng)bitmap 資源來說,自動(dòng)的縮放有時(shí)會(huì)造成放大縮小后的圖像變得模糊不清,這時(shí)就需要應(yīng)用為不同屏幕密度配置提供不同的資源:為高密度的屏幕提供高清晰度的圖像等。
3)不要使用AbsoluteLayout
4)像素單位都使用DIP,文本單位使用SP
6. 在代碼中獲取屏幕像素、屏幕密度
獲取屏幕分辨率有2種方法:
方法一 :
Display mDisplay = getWindowManager().getDefaultDisplay();
int W = mDisplay.getWidth();
int H = mDisplay.getHeight();
這里的w,h 就是屏幕的寬高分辨率
方法二 :
DisplayMetrics mDisplayMetrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(mDisplayMetrics);
int W = mDisplayMetrics.widthPixels;
int H = mDisplayMetrics.heightPixels;
同樣這里的w,h 就是屏幕的寬高分辨率
既然我們已經(jīng)學(xué)習(xí)了dpi當(dāng)然也要知道怎么去獲取也很簡(jiǎn)單
DisplayMetrics dm = new DisplayMetrics();
dm = getResources().getDisplayMetrics();
int dpi = dm.densityDpi;
dpi就是屏幕密度了。下面用一個(gè)簡(jiǎn)單的例子總結(jié)
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
DisplayMetrics dm = new DisplayMetrics();
dm = getResources().getDisplayMetrics();
int dpi = dm.densityDpi;
int widthPx = dm.widthPixels;
int heightPx = dm.heightPixels;
Log.d("MainActivity", "dpi : "+dpi);
Log.d("MainActivity", "widthPx : "+widthPx);
Log.d("MainActivity", "heightPx : "+heightPx);
}
}
7. 一般多分辨率處理方法及其缺點(diǎn)
7.1 圖片縮放
基于當(dāng)前屏幕的精度,平臺(tái)自動(dòng)加載任何未經(jīng)縮放的限定尺寸和精度的圖片。如果圖片不匹配,平臺(tái)會(huì)加載默認(rèn)資源并且在放大或者縮小之后可以滿足當(dāng)前界面的顯示要求。例如,當(dāng)前為高精度屏幕,平臺(tái)會(huì)加載高精度資源(如HelloAndroid中drawable-hdpi 中的位圖資源),如果沒有,平臺(tái)會(huì)將中精度資源縮放至高精度,導(dǎo)致圖片顯示不清晰。
7.2 兼容更大尺寸的屏幕
當(dāng)前屏幕超過程序所支持屏幕的上限時(shí),定義supportsscreens元素,這樣超出顯示的基準(zhǔn)線時(shí),平臺(tái)在此顯示黑色的背景圖。例如,WVGA 中精度屏幕上,如程序不支持這樣的大屏幕,系統(tǒng)會(huì)謊稱是一個(gè)320×480 的,多余的顯示區(qū)域會(huì)被填充成黑色。
7.4 采用OpenGL 動(dòng)態(tài)繪制圖片
Android 底層提供了OpenGL 的接口和方法,可以動(dòng)態(tài)繪制圖片,但是這種方式對(duì)不熟悉計(jì)算機(jī)圖形學(xué)的開發(fā)者來講是一個(gè)很大的挑戰(zhàn)。一般開發(fā)游戲,采用OpenGL 方式。
7.5 多個(gè)apk 文件
Symbian 和傳統(tǒng)的J2ME 就是采用這種方式,為一款應(yīng)用提供多個(gè)分辨率版本,用戶根據(jù)自己的需求下載安裝相應(yīng)的可執(zhí)行文件。針對(duì)每一種屏幕單獨(dú)開發(fā)應(yīng)用程序不失為一種好方法,但是目前Google Market 對(duì)一個(gè)應(yīng)用程序多個(gè)分辨率版本的支持還不完善,開發(fā)者還是需要盡可能使用一個(gè)apk 文件適應(yīng)多個(gè)分辨率。
根據(jù)drawable文件夾的修飾符進(jìn)行選擇的。
比如drawable、drawable-ldpi、drawable-mdpi、drawable-hdpi、drawable-xhdpi、drawalbe-xxhdpi、drawable-xxxhdpi
根據(jù)修飾符進(jìn)行優(yōu)先匹配。
不同的dpi修飾符對(duì)應(yīng)的dpi如下
drawable-ldpi 120DPI
drawable-mdpi 160DPI
drawable-hdpi 240DPI
drawable-xhdpi 320DPI
drawalbe-xxhdpi 480DPI
drawable-xxxhdpi 640DPI
比如三星手機(jī)I9260分辨率是1280*720,屏幕大小是4.65英寸,那么計(jì)算得到的PPI就是315.8PPI
找一個(gè)最近的DPI值應(yīng)該是320DPI,也就是這個(gè)設(shè)備被歸一化后就是320DPI。屬于xhdpi。
系統(tǒng)取圖片時(shí)會(huì)優(yōu)先選擇drawable-xhdpi里面的圖片,如果drawable-xhdpi不存在或者沒有這張圖,就會(huì)就近從其它分辨率和默認(rèn)的無后綴drawable文件夾下取。
比如工程只有在draw-xxhdpi文件下有img圖片,而你的設(shè)置是xhdpi,就會(huì)從xxhdpi取完圖片再壓縮到對(duì)應(yīng)大小返回給使用者。