在android 開發(fā)中一般都會用到.9圖片,那么具體它的原理是什么和如何去制作它了。
首先點(diǎn)9圖片和其它普通的png圖片是一樣的會根據(jù)所放置的資源文件夾和屏幕的像素密度先進(jìn)行縮放,只不過它本身加了一些特殊的處理,在顯示的時候點(diǎn)9圖會再進(jìn)行局部拉伸,所以在放置點(diǎn)9時要將其盡量放在高的dpi文件夾中。
接下來看看下面這個圖片
點(diǎn)9圖片中真正控制圖片拉伸的其實(shí)只有兩個邊就是上邊和左邊,如圖所示很色線條部分就是對應(yīng)的拉升地方,它在那個位置就代表那塊會被拉伸,如圖左邊,如果當(dāng)圖片縱向拉伸時此事這塊黑線所在區(qū)域就會被復(fù)制進(jìn)行填充,同樣的上邊的黑色區(qū)域控制者橫向拉伸的區(qū)域,,其實(shí)呢,無論是left和top,還是right和bottom都是把圖片分成9塊 (邊角四塊是不能縮放的,其他的四塊則是允許縮放的),所以叫做9.PNG。那左上時控制拉伸區(qū)域的,那右下了?
那兩邊主要是控制顯示區(qū)域的,右邊的是控制縱向的顯示區(qū)域,下邊的是控制橫向的顯示區(qū)域,所以最后顯示區(qū)域即兩者重合部分。那說明是顯示區(qū)域了?
打個比方textview ,如果設(shè)置了背景框,則文字輸入的地方就只能是這塊了,但是如果圖片被拉伸則其顯示區(qū)域也會跟隨變大(相當(dāng)于padding作用),且顯示區(qū)域等于
1.如果只是橫向拉伸 新的現(xiàn)實(shí)區(qū)域 = 舊的現(xiàn)實(shí)區(qū)域高*拉抻的寬度
2.如果只是縱向拉伸 新的現(xiàn)實(shí)區(qū)域 = 拉伸的高度*舊的的寬度。
3.橫縱都拉伸 新的現(xiàn)實(shí)區(qū)域 = 拉伸的寬度*拉伸的高度;

而且另外注意,拉伸區(qū)域,可以不是連續(xù)的,可以不止一塊,而且是和自定義的邊框線的長度成正比。(如上圖所示)
而關(guān)于點(diǎn)9的實(shí)現(xiàn)原理大家可以自己去看源碼。
大致如下 Bitmap在讀取圖像流數(shù)據(jù)的時候,會把判斷圖片的NinePatchChunk(9Patch數(shù)據(jù)塊),如果NinePatchChunk不為空,則是NinePatchDrawable,NinePatchDrawable則又會交給NinePatch處理。
最后關(guān)于如何制作點(diǎn)9android sdk有自帶的工具 Draw 9-patch,大家可以自己看官網(wǎng)。
另外也發(fā)現(xiàn)一個android app 同樣可以在收集上使用并預(yù)覽,叫NinePng 可以下載安裝試試挺好用的