android學習10

 Android應用程序主要由兩部分內容組成:代碼和資源。資源主要就是指那些與UI相關的東西,例如UI佈局、字符串和圖片等。代碼和資源分開可以使得應用程序在運行時根據實際需要來組織UI。這樣就可使得應用程序只需要編譯一次,就可以支持不同的UI佈局。這種特性使得應用程序在運行時可以適應不同的屏幕大小和密度,以及不同的國家和語言等。在本文中,我們就簡要介紹Android的資源管理框架,以及制定學習計劃。

        在軟件開發中,說到代碼與資源分離,最容易想到的可能就是Web開發了。在Web開發中,我們一般會通過CSS文件來描述HTML頁面的展現形式,也就是通過CSS來控制HTML頁面的UI。這樣就可以很方便地進行Web開發和維護。例如,當我們要更改HTML頁面的UI時,只要修改相應的CSS文件就可以了。注意,這些CSS文件都是在運行時加載的。這樣我們就可以根據HTML頁面的運行環境來加載不同的CSS文件,例如,根據不同的地區或者語言來選擇不同的CSS文件,從而實現國際化。

        再來看PC客戶端軟件的開發。開始的時候,微軟的MFC應用程序框架非常流行。在開發MFC程序的時候,代碼和資源同樣也是分開的,例如,程序的界面一般都是通過一個RC文件來描述的。不過我們一般都是在Visual Studio裏面通過可視化界面來編輯RC文件的,即一般都不會直接手動去操作RC文件,所以我們一般都不怎麼意識到其實RC文件和CSS文件一樣,都是用來描述程序的界面的。實際上,RC文件和CSS文件一樣,都是可以看作是一個界面配置文件,而且它們的配置信息都是通過文字來描述的,只不過這些文字描述要遵循一定的規範。

        隨着PC客戶端軟件的發展,微軟的MFC應用程序框架顯得有些力不從心了,其中的一個原因就是它的界面比較醜陋。如果要對MFC應用程序的UI進行美化以及個性化的話,是要費比較大的勁的,這嚴重地影響了軟件開發效率,特別是不適合要進行快速迭代開發的互聯網客戶端軟件。微軟後來又開發了另外一套應用程序開發框架WPF。WPF同樣是使用一種稱爲XAML的文件來描述應用程序的界面的。實際上,包括現在Win 8的Metro界面,也同樣是通過XAML文件來描述應用程序界面的。XAML文件是一種XML文件,它具有更好的可讀性,非常方便編輯以及維護。

        在PC客戶端軟件的發展過程中,還有一種不得不提的應用程序框架——QT。QT最初由Trolltech公司開發,後來被Nokia收購。隨着Meego的沒落,如日沖天的Nokia也沒落了,Qt又被賣給了芬蘭的另外一家IT服務公司Digia。QT也算得是一套優秀的應用程序框架,而且它是跨平臺的。QT同樣也是通過一種稱爲QML的文件來描述應用程序的界面的,不過QML文件不是XML格式的,它的格式有點類似Web頁面的CSS。

        類似這種採用XML文件來描述界面的PC客戶端軟件開發框架其實還有很多,例如,迅雷用的Bolt界面引擎,以及騰訊QQ用的GF界面引擎,它們都同樣是通過XML文件來描述程序界面的,並且做成代碼和界面描述文件分離。

        最後看iOS應用程序的開發,它的界面和代碼同樣是分開,並且通過一種稱爲XIB的文件來描述界面。XIB文件實際上也是一個XML文件,因此,它也是非常方便編輯以及維護的。

        從上面的分析就可以看出,無論是Web應用程序,還是PC客戶端應用程序,以及移動客戶端應用程序,它們都無一例外地將代碼與界面分離,並且界面都是通過描述性的文字來描述的,這種描述性的文字越來越傾向於使用XML格式。

        Android應用程序作爲一種移動客戶端應用程序,它同樣也是毫無意外地將代碼邏輯和界面資源進行分離,但是它的資源管理方式與傳統的Web應用程序和PC客戶端應用程序以及iOS應用程序相比會更復雜一些,這是因爲Android應用程序可能會運行在各種大小和密度不等的設備之上。接下來我們就將注意力集中在Android應用程序資源的組織和管理之上。

 1. assets。assets類資源放在工程根目錄的assets子目錄下,它裏面保存的是一些原始的文件,可以以任何方式來進行組織。這些文件最終會被原裝不動地打包在apk文件中。如果我們要在程序中訪問這些文件,那麼就需要指定文件名來訪問。例如,假設在assets目錄下有一個名稱爲filename的文件,那麼就可以使用以下代碼來訪問它:

[java] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. AssetManager am= getAssets();    
  2. InputStream is = assset.open("filename");  
        2. res。res類資源放在工程根目錄的res子目錄下,它裏面保存的文件大多數都會被編譯,並且都會被賦予資源ID。這樣我們就可以在程序中通過ID來訪問res類的資源。res類資源按照不同的用途可以進一步劃分爲以下9種子類型:

        --animator。這類資源以XML文件保存在res/animator目錄下,用來描述屬性動畫。屬性動畫通過改變對象的屬性來實現動畫效果,例如,通過不斷地修改對象的座標值來實現對象移動動畫,又如,通過不斷地修改對象的Alpha通道值來實現對象的漸變效果。

        --anim。這類資源以XML文件保存在res/anim目錄下,用來描述補間動畫。補間動畫和屬性動畫不同,它不是通過修改對象的屬性來實現,而是在對象的原來形狀或者位置的基礎上實現一個變換來得到的,例如,對對象施加一個旋轉變換,就可以獲得一個旋轉動畫,又如,對對象實施一個縮放變換,就可以獲得一個縮放動畫。從數學上來講,就是在對象的原來形狀或者位置的基礎上施加一個變換矩陣來實現動畫效果。注意,在動畫的執行過程中,對象的屬性是始終保持不變的,我們看到的只不過是它的一個變形副本。

        --color。這類資源以XML文件保存在res/color目錄下,用描述對象顏色狀態選擇子。例如,我們可以定義一個選擇子,規定一個對象在不同狀態下顯示不同的顏色。對象的狀態可以劃分爲pressed、focused、selected、checkable、checked、enabled和window_focused等7種。

        --drawable。這類資源以XML或者Bitmap文件保存在res/drawable目錄下,用來描述可繪製對象。例如,我們可以在裏面放置一些圖片(.png, .9.png, .jpg, .gif),來作爲程序界面視圖的背景圖。注意,保存在這個目錄中的Bitmap文件在打包的過程中,可能會被優化的。例如,一個不需要多於256色的真彩色PNG文件可能會被轉換成一個只有8位調色板的PNG面板,這樣就可以無損地壓縮圖片,以減少圖片所佔用的內存資源。

        --layout。這類資源以XML文件保存在res/layout目錄下,用來描述應用程序界面佈局。

        --menu。這類資源以XML文件保存在res/menu目錄下,用來描述應用程序菜單,例如,Options Menu、Context Menu和Sub Menu。

        --raw。這類資源以任意格式的文件保存在res/raw目錄下,它們和assets類資源一樣,都是原裝不動地打包在apk文件中的,不過它們會被賦予資源ID,這樣我們就可以在程序中通過ID來訪問它們。例如,假設在res/raw目錄下有一個名稱爲filename的文件,並且它在編譯的過程,被賦予的資源ID爲R.raw.filename,那麼就可以使用以下代碼來訪問它:

[java] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. Resources res = getResources();  
  2. InputStream is = res .openRawResource(R.raw.filename);  

        --values。這類資源以XML文件保存在res/values目錄下,用來描述一些簡單值,例如,數組、顏色、尺寸、字符串和樣式值等,一般來說,這六種不同的值分別保存在名稱爲arrays.xml、colors.xml、dimens.xml、strings.xml和styles.xml文件中。

        --xml。這類資源以XML文件保存在res/xml目錄下,一般就是用來描述應用程序的配置信息。


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