在本教程中,將詳細(xì)介紹OPhone中引入的NinePatch圖片格式,以及如何使用NinePatch圖片來創(chuàng)建和OPhone系統(tǒng)風(fēng)格統(tǒng)一的應(yīng)用程序。在下面的教程中使用OPhone系統(tǒng)中的控件Button來作為演示。
OPhone系統(tǒng)背景圖片
首先來看看OPhone系統(tǒng)Button的背景樣式。 創(chuàng)建一個示例項目,添加幾個Button, layout代碼如下:
(為了節(jié)約篇幅,下面的布局代碼只提供Button代碼,其他代碼省略。)
程序截圖如下:
圖一:OPhone系統(tǒng)默認(rèn)按鈕背景,第二個按鈕是取得焦點時候的背景
從上圖可以看到不管按鈕有多長,背景都可以很好的展示。在有些情況下,可能系統(tǒng)提供的背景圖片不適合你的應(yīng)用程序主題,這個時候就要使用自定義背景來實現(xiàn)特殊的主題風(fēng)格了。
使用顏色做背景
通過指定View中的background值為顏色值來設(shè)置顏色背景,代碼如下:
在Button中指定了背景android:background="@color/red",red是在colors.xml文件中定義的顏色值,定義方式查看項目代碼中的res/values/colors.xml文件。現(xiàn)在程序截圖如下:
圖二:使用顏色值作為Button背景
由上圖可見,使用顏色背景得到的是一個矩形填充的背景,這和系統(tǒng)提供的圓角背景是不一樣的。因此要使應(yīng)用程序和OPhone系統(tǒng)風(fēng)格統(tǒng)一,不要使用顏色值來做組件的背景。當(dāng)然,這不是絕對的,如果使用自定義組件可以自己來繪制組件的背景,這個時候就可以自由的來控制背景如何繪制了,關(guān)于自定義組件的內(nèi)容已經(jīng)超出本教程范圍了,這里不做討論。既然使用顏色值做背景看起來不統(tǒng)一,那么使用自定義的圖片又如何呢?
自定義圖片背景
使用如下的圖片來做Button的背景,layout 代碼如下:
圖三:自定義背景圖片
程序截圖如下:
圖四:使用自定義背景圖片的Button
由上圖可見,在Button長度剛好和組件長度差不多的時候,看起來還不錯,隨著Button內(nèi)容的增加,背景圖片被拉伸變形。這時可能你會想到,對于不同長度的Button使用不同的背景圖片,這樣不就沒問題咯!是的,這樣的可以的,但是如果長度是動態(tài)變化的呢?
NinePatch背景圖片
現(xiàn)在該看看OPhone是如何實現(xiàn)組件背景的了,在OPhone中Button的默認(rèn)背景圖片為btn_default_small_normal.9.png 如下圖:
圖五:OPhone默認(rèn)Button背景圖片
Button取得焦點時候的背景圖片如下:
圖六:OPhone中Button取得焦點的背景圖片
OPhone的系統(tǒng)資源圖片可以到如下目錄下查看:
<OPhone SDK>\tools\lib\res\default\drawable
由圖片名稱就可以看出有點與眾不同,是以9.png結(jié)尾的,這是OPhone系統(tǒng)特定的圖片格式,被稱為NinePatch圖片。NinePatch圖片和普通的圖片的區(qū)別只是比普通圖片四周多了一個邊框(注意觀察上面圖片周圍的黑線)。
在NinePatch圖片中,左邊那條黑色線代表圖片垂直拉伸的區(qū)域,上邊的那條黑色線代表水平拉伸區(qū)域,右邊的黑色線代表內(nèi)容繪制的垂直區(qū)域,下邊的黑色線代表內(nèi)容繪制的水平區(qū)域,右邊和下邊的線是可選的。
NinePatch圖片編輯器
在OPhone SDK中也提供了一個編輯NinePatch圖片的工具, 在<OPhone SDK>\tools目錄下面執(zhí)行 draw9patch.bat 就可以打開該工具,下面就使用該工具來編輯自定義的Button背景圖片。
啟動編輯器,把btn_bg.png圖片拖到NinePatch編輯器窗口中(或則通過菜單:File > Open9-patch...來選擇圖片)來編輯,在編輯器的左邊是編輯區(qū)域,右邊是預(yù)覽區(qū)域,在預(yù)覽區(qū)域中顯示了水平拉伸,垂直拉伸和水平垂直都拉伸情況下的預(yù)覽圖形。
NinePatch編輯器還提供了一些操作選項:
然后設(shè)置水平和垂直拉伸區(qū)域,在需要拉伸的位置繪制像素,如下圖(使用鼠標(biāo)左鍵點擊繪制點,右鍵刪除繪制的點):
圖8:編輯后的自定義圖片
可以在右邊預(yù)覽區(qū)域看到現(xiàn)在圖片拉伸后的效果,同時還可以看到現(xiàn)在的內(nèi)容區(qū)域在沒有設(shè)置的時候是整個圖片(注意:在這里顯示的內(nèi)容區(qū)域為整個圖片,其實當(dāng)不設(shè)置內(nèi)容區(qū)域的時候,在OPhone中使用的內(nèi)容區(qū)域就是設(shè)置的拉伸區(qū)域,也就是上圖中的粉紅色區(qū)域,這個在教程后面會有示例說明)。
把這個圖片保存為NinePatch圖片(btn_bg.9.png),替換前面使用的btn_bg.png圖片后,程序截圖如下:
圖九:使用自定義NinePatch圖片的Button
由上圖可以看到NinePatch圖片在背景圖中應(yīng)用的優(yōu)勢,指定顏色值變化范圍比較小的區(qū)域為伸縮區(qū)域來防止圖片伸縮變形。由于沒有設(shè)置內(nèi)容區(qū)域(NinePatch圖片的右邊和下邊的指示線條),Button在顯示的時候默認(rèn)是使用拉伸區(qū)域的,所以這里看不出有什么不妥當(dāng)?shù)牡胤?,下面來測試的右邊和下邊指示線的作用。
現(xiàn)在編輯圖片如下:
圖十:設(shè)置了內(nèi)容區(qū)域的NinePatch圖片
為了使測試明顯,這里使用中間和上部區(qū)域作為內(nèi)容區(qū)域,保存該圖片為btn_bg.9.png,使用該圖片后的程序截圖如下:
圖十一:使用不恰當(dāng)設(shè)置的內(nèi)容區(qū)域的圖片
和前面程序截圖對比就可以發(fā)現(xiàn)內(nèi)容區(qū)域的作用了。所以現(xiàn)在再看看OPhone的默認(rèn)背景圖片btn_default_small_normal.9.png 就可以發(fā)現(xiàn)其中四周線條設(shè)置的奧妙了,同樣自定義背景設(shè)置為下圖所示就更為合理了:
圖十二:更加合理的NinePatch設(shè)置
圖十三:使用合理的NinePatch圖片的截圖
到此,你就應(yīng)該知道NinePatch圖片在OPhone系統(tǒng)中的奧妙了,在系統(tǒng)資源文件目錄中(<OPhoneSDK>\tools\lib\res\default\drawable)可以發(fā)現(xiàn)大量的NinePatch圖片,現(xiàn)在你可以使用自定義的NinePatch圖片來設(shè)置自己的應(yīng)用程序了。
最后再來驗證下前面提到過的OPhone系統(tǒng)使用不設(shè)置內(nèi)容區(qū)域NinePatch圖片的實際顯示情況,這里使用下面的圖片作為Button背景圖片:
這里設(shè)置水平拉伸比較長,垂直拉伸比較靠近上部,程序截圖如下:
由上圖可見,當(dāng)不設(shè)置內(nèi)容區(qū)域的時候,NinePatch圖片使用的就是拉伸區(qū)域作為內(nèi)容區(qū)域,而不是NinePatch編輯器中指示的圖片全部區(qū)域。
總結(jié)
要使OPhone應(yīng)用程序和系統(tǒng)具有統(tǒng)一的主題風(fēng)格,背景不要使用顏色值而盡量的使用NinePatch圖片。
NinePatchTutorial.rar中包含本教程使用的項目文件和其他自定義NinePatch圖片資源。
注:本文中的內(nèi)容完全適用于Android已經(jīng)發(fā)布的各個版本。
作者簡介
程云峰,網(wǎng)名icess,目前就職于杭州恒生電子研發(fā)中心,喜歡Java開源技術(shù)。
個人網(wǎng)站:http://www.chengyunfeng.com/
(聲明:本網(wǎng)的新聞及文章版權(quán)均屬OPhoneSDN網(wǎng)站所有,如需轉(zhuǎn)載請與我們編輯團隊聯(lián)系。任何媒體、網(wǎng)站或個人未經(jīng)本網(wǎng)書面協(xié)議授權(quán),不得進行任何形式的轉(zhuǎn)載。已經(jīng)取得本網(wǎng)協(xié)議授權(quán)的媒體、網(wǎng)站,在轉(zhuǎn)載使用時請注明稿件來源。)