在android 开发中一般都会用到.9图片,那么具体它的原理是什么和如何去制作它了。
首先点9图片和其它普通的png图片是一样的会根据所放置的资源文件夹和屏幕的像素密度先进行缩放,只不过它本身加了一些特殊的处理,在显示的时候点9图会再进行局部拉伸,所以在放置点9时要将其尽量放在高的dpi文件夹中。
接下来看看下面这个图片
点9图片中真正控制图片拉伸的其实只有两个边就是上边和左边,如图所示很色线条部分就是对应的拉升地方,它在那个位置就代表那块会被拉伸,如图左边,如果当图片纵向拉伸时此事这块黑线所在区域就会被复制进行填充,同样的上边的黑色区域控制者横向拉伸的区域,,其实呢,无论是left和top,还是right和bottom都是把图片分成9块 (边角四块是不能缩放的,其他的四块则是允许缩放的),所以叫做9.PNG。那左上时控制拉伸区域的,那右下了?
那两边主要是控制显示区域的,右边的是控制纵向的显示区域,下边的是控制横向的显示区域,所以最后显示区域即两者重合部分。那说明是显示区域了?
打个比方textview ,如果设置了背景框,则文字输入的地方就只能是这块了,但是如果图片被拉伸则其显示区域也会跟随变大(相当于padding作用),且显示区域等于
1.如果只是横向拉伸 新的现实区域 = 旧的现实区域高*拉抻的宽度
2.如果只是纵向拉伸 新的现实区域 = 拉伸的高度*旧的的宽度。
3.横纵都拉伸 新的现实区域 = 拉伸的宽度*拉伸的高度;
而且另外注意,拉伸区域,可以不是连续的,可以不止一块,而且是和自定义的边框线的长度成正比。(如上图所示)
而关于点9的实现原理大家可以自己去看源码。
大致如下 Bitmap在读取图像流数据的时候,会把判断图片的NinePatchChunk(9Patch数据块),如果NinePatchChunk不为空,则是NinePatchDrawable,NinePatchDrawable则又会交给NinePatch处理。
最后关于如何制作点9android sdk有自带的工具 Draw 9-patch,大家可以自己看官网。
另外也发现一个android app 同样可以在收集上使用并预览,叫NinePng 可以下载安装试试挺好用的