9Patch是一個(gè)對(duì)png圖片做處理的工具。經(jīng)9Patch處理過(guò)的圖片以*.9.png結(jié)尾,和普通圖片相比,四周多了一個(gè)邊框,如圖1所示。

圖1 9Patch處理過(guò)的圖片*.9.png
“*.9.png”是一種被Android os所支持的特殊圖片格式,是經(jīng)過(guò)9Patch特殊處理過(guò)的圖片。用它可以實(shí)現(xiàn)部分拉伸而不出現(xiàn)拉伸以后圖片失真等不良現(xiàn)象。為將普通的PNG圖片編輯轉(zhuǎn)化為9Patch圖片,可以使用 Android SDK/tools目錄下提供的draw9patch.bat編輯器。draw9patch.bat編輯器界面如圖2所示。

圖2 draw9Patch.bat編輯器界面
在draw9patch.bat編輯器中,可以對(duì)導(dǎo)入的png圖片進(jìn)行以下操作來(lái)達(dá)到想要的圖片目標(biāo)。
·Zoom:縮放左邊編輯區(qū)域的大小。
·Patch scale:縮放右邊預(yù)覽區(qū)域的大小。
·Show lock:當(dāng)鼠標(biāo)在圖片區(qū)域時(shí),顯示不可編輯區(qū)域。
·Show patches:在編輯區(qū)域顯示圖片拉伸的區(qū)域。
·Show content:在預(yù)覽區(qū)域顯示圖片的內(nèi)容區(qū)域。
·Show bad patches:在拉伸區(qū)域周圍用顯示可能會(huì)對(duì)拉伸后的圖片產(chǎn)生變形的區(qū)域;根據(jù)圖片的顏色值來(lái)區(qū)分是否為bad patch。
9Patch操作實(shí)例:
1.在你Android SDK 路徑下 X:/android sdk/tools ,你會(huì)找到一個(gè) 【draw9patch.bat】,提示導(dǎo)入一張png圖片,然后真正進(jìn)入"9Patch "的操作界面,如圖3所示:

圖3 9Patch "的操作界面
序列 ① :在拉伸區(qū)域周圍用紅色邊框顯示可能會(huì)對(duì)拉伸后的圖片產(chǎn)生變形的區(qū)域,如果完全消除該內(nèi)容則圖片拉伸后是沒(méi)有變形的,也就是說(shuō),不管如何縮放圖片顯示都是良 好的。 (實(shí)際試 發(fā)現(xiàn)NinePatch編輯器是根據(jù)圖片的顏色值來(lái)區(qū)分是否為bad patch的,一邊來(lái)說(shuō)只要色差不是太大不用考慮這個(gè)設(shè)置。)
序列 ② :區(qū)域是導(dǎo)入的圖片,以及可操作區(qū)域。
序列 ③ :這里 zoom:的長(zhǎng)條bar 是對(duì)導(dǎo)入的圖放大縮小操作,這里的放大縮小只是為了讓使用者更方便操作,畢竟是對(duì)像素點(diǎn)操作比較費(fèi)眼,下面的 patch scale 是序列 ④區(qū)域中的三種形態(tài)的拉伸后的一個(gè)預(yù)覽操作,可以看到操作后的圖片拉伸后的效果。
序列 ④: 區(qū)域這里從上到下,依次為:縱向拉伸的效果預(yù)覽、橫向拉伸的效果預(yù)覽,以及整體拉伸的效果預(yù)覽
序列 ⑤: 這里如果你勾選上,那么當(dāng)你鼠標(biāo)放在 ② 區(qū)域內(nèi)的時(shí)候并且當(dāng)前位置為不可操作區(qū)域就會(huì)出現(xiàn)lock的一張圖,就是顯示不可編輯區(qū)域 ;
序列 ⑥: 這里勾選上,那么在④ 區(qū)域中你就會(huì)看到當(dāng)前操作的像素點(diǎn)在拉伸預(yù)覽圖中的相對(duì)位置和效果。
序列 ⑦: 在編輯區(qū)域顯示圖片拉伸的區(qū)域;
2.具體操作:
鼠標(biāo)左鍵選取需要拉伸的像素點(diǎn); shift+鼠標(biāo)左鍵取消當(dāng)前像素點(diǎn)。
操作區(qū)域:

大家看到導(dǎo)入的png圖片默認(rèn)周圍多了一像素點(diǎn),也就是這一圈一像素點(diǎn)就是咱們的可操作區(qū)域。因?yàn)橄路胶陀曳娇刹僮鲄^(qū)域是指定內(nèi)容的顯示區(qū)域,屬于可選區(qū)域,可不予理會(huì);但是要注意內(nèi)容區(qū)域的標(biāo)記不能有間斷,也就是說(shuō)標(biāo)記要連續(xù)且僅有一處,否則.9.png圖片在放入項(xiàng)目下會(huì)報(bào)錯(cuò)。
大家需要注意Left 和 top 操作區(qū)域:
·Top操作區(qū)域的一排像素點(diǎn),表示橫向拉伸的像素點(diǎn);
·Left操作區(qū)的一排像素點(diǎn),表示縱向拉伸的像素點(diǎn);
3.使用 “*.9.png”的好處:
在我們手機(jī)游戲開(kāi)發(fā)的過(guò)程中,我們關(guān)系的是生成的安裝文件、比如j2me 的jar 包,塞班的sis、sisx 以及咱們andrid中的apk都希望打包后的包越小越好、雖然現(xiàn)在的手機(jī)趨向于智能了,但是畢竟手機(jī)的容量和內(nèi)存還是有限、身為移動(dòng)設(shè)備開(kāi)發(fā)者的我們對(duì)此都很看重,那么通過(guò)"9Patch"處理后的圖片我們就可以省去不少的內(nèi)存和容量。
·省精力和時(shí)間
如果我們有一張50*50的類似上面那種帶花邊的png圖片,那么我們?cè)赼ndroid或者大分辨率的機(jī)器上使用的畫,肯定需要對(duì)其處理,那么要不就是讓美工的mm們給咱們重新做一張,那么通過(guò)"9Patch"處理得到的“*.9.png”就會(huì)省去美工的負(fù)擔(dān)了。
·省內(nèi)存
如果不想用代碼來(lái)對(duì)其小圖進(jìn)行縮放來(lái)再次使用(因?yàn)榭紤]會(huì)失真),那么可能會(huì)多加了圖片,這樣一來(lái)游戲包的大小就會(huì)增加了,幾K—幾十K不等,而利用"9Patch"處理的就省去了這些麻煩。
·減少代碼量
有些童鞋該說(shuō)啦,我用代碼一樣能實(shí)現(xiàn)(圖2)的效果不失真,OK,我也知道。當(dāng)初我在J2ME平臺(tái)做RPG的時(shí)候也是利用設(shè)置可視區(qū)域等代碼來(lái)實(shí)現(xiàn)的,但是如果你用“.9.png”的方式就更簡(jiǎn)單!