在android 開發(fā)中一般都會(huì)用到.9圖片,那么具體它的原理是什么和如何去制作它了。
首先點(diǎn)9圖片和其它普通的png圖片是一樣的會(huì)根據(jù)所放置的資源文件夾和屏幕的像素密度先進(jìn)行縮放,只不過它本身加了一些特殊的處理,在顯示的時(shí)候點(diǎn)9圖會(huì)再進(jìn)行局部拉伸鸳粉,所以在放置點(diǎn)9時(shí)要將其盡量放在高的dpi文件夾中。
接下來看看下面這個(gè)圖片
點(diǎn)9圖片中真正控制圖片拉伸的其實(shí)只有兩個(gè)邊就是上邊和左邊园担,如圖所示很色線條部分就是對(duì)應(yīng)的拉升地方,它在那個(gè)位置就代表那塊會(huì)被拉伸枯夜,如圖左邊弯汰,如果當(dāng)圖片縱向拉伸時(shí)此事這塊黑線所在區(qū)域就會(huì)被復(fù)制進(jìn)行填充,同樣的上邊的黑色區(qū)域控制者橫向拉伸的區(qū)域湖雹,,其實(shí)呢咏闪,無論是left和top,還是right和bottom都是把圖片分成9塊 (邊角四塊是不能縮放的摔吏,其他的四塊則是允許縮放的)鸽嫂,所以叫做9.PNG纵装。那左上時(shí)控制拉伸區(qū)域的,那右下了据某?
那兩邊主要是控制顯示區(qū)域的橡娄,右邊的是控制縱向的顯示區(qū)域,下邊的是控制橫向的顯示區(qū)域癣籽,所以最后顯示區(qū)域即兩者重合部分挽唉。那說明是顯示區(qū)域了?
打個(gè)比方textview 筷狼,如果設(shè)置了背景框瓶籽,則文字輸入的地方就只能是這塊了,但是如果圖片被拉伸則其顯示區(qū)域也會(huì)跟隨變大(相當(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ù)的時(shí)候预鬓,會(huì)把判斷圖片的NinePatchChunk(9Patch數(shù)據(jù)塊)巧骚,如果NinePatchChunk不為空,則是NinePatchDrawable格二,NinePatchDrawable則又會(huì)交給NinePatch處理劈彪。
最后關(guān)于如何制作點(diǎn)9android sdk有自帶的工具 Draw 9-patch,大家可以自己看官網(wǎng)顶猜。
另外也發(fā)現(xiàn)一個(gè)android app 同樣可以在收集上使用并預(yù)覽沧奴,叫NinePng 可以下載安裝試試挺好用的