Android工程中的文件類型包括以下幾種:
一。jar包:是為了解決軟件的兼容問題。如果在低版本Android平台上開發一個應用程序,而應用程序又想使用高版本才擁有的功能,就需要使用Support庫。Android private libraries 和 Android 4.2.2 、Referenced libraries 等。其實 Android private libraries 和Referenced libraries 兩個文件夾中的都是通過configure build path 方式加入到項目中的,二者之間沒有多大區別,使用上來說也沒有什么不同,真不知道為什么要區別開來。另外就是Android 的支持庫了,Android Support v4: 這個包是為了照顧1.6及更高版本而設計的,這個包是使用最廣泛的,eclipse新建工程時,都默認帶有了。Android Support v7: 這個包是為了考慮照顧2.1及以上版本而設計的,但不包含更低,故如果不考慮1.6,我們可以采用再加上這個包,另外注意,v7是要依賴v4這個包的,即,兩個得同時被包含。Android Support v13 :這個包的設計是為了android 3.2及更高版本的,一般我們都不常用,平板開發中能用到。
- jre system library:JRE system library里面的jar是java運行依賴的類庫(很多的jar包)
- java ee 5 libraries:Java EE libraries里面的jar是運行web工程依賴的類庫(很多的jar包)。
- referenced libraries:是項目需要引用的類庫,這里直接就是lib下的東西的引用。
-
lib:放第三方的各種項目所需的jar包。添加jar包到lib里面,系統自動把jar加載到referenced libraries中。eclipse 中 構建路徑下的 order and export 是干什么用的 :
構建順序和 導出的時候要導出哪些資源,order就是使用class的順序(因為可能出現class同名的情況),export就是把用到的一些的lib和project同時發布。
在order and Export條目中,不能重復將jar包打入到APK中,現在android將導出的jar包分為Android Dependencies和Android Private libraries兩種,目的是供開發者選擇,但是一般這兩個都要打入Apk中!二、項目的包這個包包括項目的類包,也包括建立的各種工具類包;項目中自己編寫的內容的各種包集中放在 src包文件夾中,
三、res 文件夾包括各種資源文件,
1.anim 動畫
<? xml version= "1.0" encoding= "utf-8" ?>< set xmlns:android= "http://schemas.android.com/apk/res/android" ><translate android:fromYDelta = "100%" android:duration ="250" /><alpha android:interpolator ="@android:anim/decelerate_interpolator"android:fromAlpha= "0.0" android:toAlpha = "1.0" android:duration ="800" /></ set>2.color<? xml version= "1.0" encoding= "UTF-8" ?>< selectorxmlns:android= "http://schemas.android.com/apk/res/android" ><item android:state_checked = "true" android:color ="@color/white" /><item android:state_checked = "false" android:color= "#686868" /><item android:color = "#686868" /></ selector>3.drawable (主要包括中英文和hdpi mdpi xhdpi xxhdpi ,現在屏幕一般都是大屏,以hdpi 幾以上為主,沒有分辨率區別的圖片直接放在 drawable中即可)(1)drawable-hdpi里面存放高分辨率的圖片,如WVGA (480x800),FWVGA (480x854)
(2)drawable-mdpi里面存放中等分辨率的圖片,如HVGA (320x480)
(3)drawable-ldpi里面存放低分辨率的圖片,如QVGA (240x320)
ldpi:240x320 mdpi:320x480 hdpi:480x800、480x854 xhdpi:至少960*720 xxhdpi: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為了方便開發者對於各種分辨率機型的移植而增加了自動適配的功能
<supports-screens
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 文件適應多個分辨率。四、其他的文件夾materials (項目中需要使用的其他文件可以自己隨建立文件夾,但是這個文件夾不會被打包進工程,只是作為開發方便的其他輔助文件,
Android除了提供/res目錄存放資源文件外,在/assets目錄也會提供存放資源文件, 放一些比較小的文件,程序把它當作本地文件使用,因為他是當作程序的本地文件使用,所以文件不要太大,否則加載時間太長 倒至ANR錯誤。比如有些固定的數據,如全國省市、性別等都可以存在asset里面當作資源使用。跟其它的目錄最在的區別就是此文件夾下的文件不會生成ID,所以讀取assets目錄下面的資源文件需要提供路徑,我們可以通過AssetManager類來訪問這些文件。
- public void deepFile(Context ctxDealFile, String path) {
- try {
- String str[] = ctxDealFile.getAssets().list(path);
- if (str.length > 0) {//如果是目錄
- File file = new File("/data/" + path);
- file.mkdirs();