什么是9Patch圖?
Android系統(tǒng)由于系統(tǒng)和分辨率的多樣性,界面適配是讓開發(fā)者頭疼的問題,很多控件的切圖文件在不同屏幕上被放大拉伸后,邊角會模糊失真,十分丑陋. 對不同的分辨率制作多個切圖,又增大了安裝包的大小. 于是Android專門制作了一種.9.PNG格式來解決這個問題. 這種格式的圖片能按照設(shè)定來拉伸特定區(qū)域,而不是整體放大或縮小,從而保證了圖片在各個分辨率的屏幕上都可以完美展示,這種圖也被稱作9Patch圖.
如何繪制9Patch圖?
一. 打開9Patch繪圖工具
Android其實已經(jīng)在sdk包中提供了繪制9Patch圖的工具, 具體路徑如下: sdk\tools\draw9patch.bat
圖2-1-1 9patch工具路徑
雙擊打開draw9patch.bat文件, 可以進入如下可視化界面:
圖2-1-2 9patch主界面
二. 添加待繪制的圖片
將需要改造的普通png圖片拖拽到draw9patch的工作區(qū)域, 可看到如下效果:
圖2-2-1 9patch工作區(qū)間
工作區(qū)間大體可以分為3個區(qū)域, 如圖標示為:紅色區(qū)域, 綠色區(qū)域, 藍色區(qū)域.
紅色區(qū)域: 主要的工作區(qū)域,將來對圖片的修改操作都在此處完成.
綠色區(qū)域: 效果展示區(qū)域, 用于展示修改后圖片的拉伸效果.我們可以看到有3種拉伸效果,從上至下依次是豎直拉伸效果,水平拉伸效果和整體拉伸效果.
藍色區(qū)域: 設(shè)置區(qū)域,可以對當前界面展示效果進行調(diào)整. 我們可以明顯的看到有兩個拖動條, 上側(cè)名為Zoom的拖動條是用來對紅色區(qū)域圖片進行縮放的, 而下側(cè)的Patch scale拖動條是對綠色區(qū)域的圖片進行縮放的. 通過這兩個拖動條的設(shè)置,我們就可以更加方便的對工作區(qū)域圖片進行修改, 也可以了解在各個方向經(jīng)過不同程度拉伸后的展示效果.
三. 開始繪制
如果我們不對圖片進行任何修改, 那么圖片在各個方向拉伸時都是整體縮放的. 縮放同時,圖片圓角也會跟著縮放,導(dǎo)致最終展示效果很差.
這是豎直拉伸的效果:
圖2-3-1 豎直拉伸效果
這是水平拉伸效果:
圖2-3-2 水平拉伸效果
為了讓豎直和水平拉伸不包括圓角, 我們可以這樣對圖片進行處理:
我們來到工作區(qū)域, 按住鼠標左鍵, 在圖片最上方的一個像素的格子中, 繪制一條水平線, 這條線的寬度,就表示該圖片水平拉伸的區(qū)域. 如下圖所示:
圖2-3-3 水平拉伸
下圖的淺紅色區(qū)域就是圖片水平拉伸的區(qū)域.
圖2-3-4 水平拉伸區(qū)域
同理, 我們來到圖片最右側(cè)的一個像素的邊線中,按住鼠標左鍵繪制一條豎直線, 這條線的長度,就是圖片豎直拉伸的區(qū)域.
圖2-3-5 豎直拉伸
下圖的淺紅色區(qū)域就是圖片將來豎直拉伸的區(qū)域.
圖2-3-6 豎直拉伸區(qū)域
當我們同時通過上邊線和右邊線規(guī)定了水平和豎直的拉伸區(qū)域后, 圖片就可以按照我們的設(shè)定自由拉伸了. 下圖的紅色區(qū)域就是拉伸區(qū)域, 可以看出,拉伸區(qū)域沒有包括4個圓角, 從而保證了圓角不被隨意拉伸.
圖2-3-7 整體拉伸區(qū)域
注意: 如果在繪制黑線的過程中, 由于操作失誤, 想擦除之前繪制的內(nèi)容, 可以按住鼠標右鍵進行擦除, 也可以按住Shift鍵的同時, 使用鼠標左鍵進行擦除.
最后,我們看一下修改后的圖片拉伸效果:
豎直拉伸效果:
圖2-3-9 修改后的豎直拉伸效果
水平拉伸效果:
圖2-3-10 修改后的水平拉伸效果
整體拉伸效果:
圖2-3-11 修改后的整體拉伸效果
四. 知識拓展
我們剛剛聊了上邊線和左邊線來控制水平和豎直拉伸效果的問題, 那么, 下邊線和右邊線又是來控制什么的呢? 實際上下邊線和右邊線并不是控制拉伸, 而是控制內(nèi)容的填充區(qū)域.
什么叫做內(nèi)容填充區(qū)域呢? 比如說, 我們把圖片制作好之后,以背景的方式設(shè)置給了一個按鈕, 而按鈕一般都是要展示文字的吧? 如下圖所示:
圖2-4-1 給按鈕設(shè)置文字
但是, 文字可大可小, 如果文字特別大的話, 可能會出現(xiàn)下面這種情況:
圖2-4-2 給按鈕設(shè)置較大文字
很明顯, 文字左右兩側(cè)太靠近圖片邊緣了, 感覺很不美觀, 所以我們可以通過9Patch圖來提前規(guī)定好文字的填充區(qū)域.
圖2-4-3 設(shè)置內(nèi)容填充區(qū)域
如上圖所示, 右邊線表示豎直填充區(qū)域, 下邊線表示水平填充區(qū)域, 綠線交匯后的矩形區(qū)域就是最終的內(nèi)容區(qū)域.
五. 保存9Patch圖片
點擊工具左上角File, 選擇Save 9-patch, 保存圖片.
圖2-5-1 保存圖片
保存之后, 文件擴展名會自動變?yōu)?9.png. 到這里, 我們就已經(jīng)成功的將一個普通的png圖片改造成了可以隨意拉伸不變形的9patch圖片啦.
如何使用9Patch圖?
使用9patch圖很簡單, 和普通png完全一樣. 如下圖, 新建一個項目, 將我們剛剛制作好的9Patch圖demo.9.png導(dǎo)入到drawable-hdpi的目錄下.
圖3-1 項目結(jié)構(gòu)
修改activity_main.xml, 添加幾個Button, 背景使用demo.9.png, 字體大小逐步增大.
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/demo"
android:text="
傳智播客
" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/demo"
android:text="
傳智播客
"
android:textSize="25sp" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/demo"
android:text="
傳智播客
"
android:textSize="40sp" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/demo"
android:text="
傳智播客
"
android:textSize="60sp" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/demo"
android:text="
傳智播客
"
android:textSize="75sp" />
</LinearLayout>
直接運行項目, 看效果:
圖3-2 項目運行效果
總結(jié)
9Patch圖給我們屏幕適配帶來了很大的便利,所以非常實用. 如何快速掌握9Patch圖的繪制要領(lǐng)呢, 其實很簡單, 只需要記住上下左右四條線分別代表什么就可以了. 上邊線控制水平拉伸, 左邊線控制豎直拉伸, 下邊線控制水平填充區(qū)域, 右邊線控制豎直填充區(qū)域. 很簡單吧? 讓我們一起愉快地和9Patch玩耍吧!
本文版權(quán)歸傳智播客Android培訓(xùn)學(xué)院所有,歡迎轉(zhuǎn)載,轉(zhuǎn)載請注明作者出處。謝謝!
作者:傳智播客Android培訓(xùn)學(xué)院
首發(fā):http://xamj520.com/android/