Android中.9图片的说明和绘制

.9图片的理论
.9图片也是图片的一种,后缀.9.xxx,比如photo.9.png,图片的作用是用在不同布局的时候自动拉伸,以确保图片指定区域不失真,也就是不变形图形区域拉伸背景区域,从而让图片适应各种需求布局。与普通图片的区别就是适应性提高。提醒不要自己改某图片后缀.9.png,这样是没用的。.9图片扩展是自动的,也就是不允许开发人员定义扩展尺寸信息,.9图片四周比普通图片多一圈一像素的空白区域,编辑或还原可见,正常图片上不可见;图片编辑后缩小2像素,即23*23的图片编辑后为21*21大小。

利用SDK提供的工具绘制.9图片
SDK工具里已经集成了.9图绘制工具,基于jdk开发(环境变量须配置完善)。
位置示例:C:\Users\Panda\AppData\Local\Android\sdk\tools(具体根据个人SDK安装位置而定)
Android中.9图片的说明和绘制

tool工具包下有一系列的工具,我们都可以直接拿来用,其中draw9patch.bat就是我们需要找的脚本,为使用方便可以发送快捷到桌面。

修改前原图相对于屏幕布局:(均为wrap_content)
Android中.9图片的说明和绘制

如果我们要求特殊需要定义layout_width=”match_parent”
结果:(图片变形了,不是预期效果)
Android中.9图片的说明和绘制


现在我们运行draw9patch来让这个图片变身一下:

运行draw9patch.bat cmd弹窗不能关,因为是基于cmd脚本运行的,最小化就好,把需要修改的图片拖进Draw 9-patch里:

Android中.9图片的说明和绘制

左边是编辑区,图片通过zoom进行比例缩放,Patch scale是缩放尺寸,一般默认就好,跨度太大越来越模糊,当然纯色的话就没问题了。其他几个选项是方便查看操作区域和显示区域的,勾选下看看效果就明白了。右边是预览区,由上到下分别是纵向拉伸,横向拉伸,双向拉伸。

拉伸操作怎么实现呢?
记得开篇提到图片周围有一圈1像素的空白,这里就要用到了,看图片也能看到吧,看不到就放大一点,操作也方便。上下左右–》T、B、L、R(Top、Buttom、Left、Right),上边和左边是控制缩放区域的,两条线就能控制一片区域,鼠标点击或者点击拖拉标记黑色区域,只要记住标记谁谁拉伸就好,如图我标记的四个地方,预览下:
Android中.9图片的说明和绘制

拉伸的区域也就是黑色线条交叉的区域,所以中间小机器人不拉伸:
T:黑线标示图片如果横向拉伸则拉伸该区域
L:黑线标示图片如果纵向拉伸则拉伸该区域
B:黑线标示内容显示横向区域
R:黑线标示内容显示纵向区域

我们把新作的图放到上边特殊需要定义layout_width=”match_parent”
效果:
Android中.9图片的说明和绘制

我们刚刚变形的小机器人这次并没有变形,看到图示只是拉伸了我们预想的区域。我们也没有另外制作资源就实现了新的需求,是不是很方便。

前景绘制区域
T和L很好理解,平时也用到很多,但是实验过后有没有发现B和R好像完全没效果呢?B和R的黑线是有用的,你做了图片用处很多,假如要做TextView的背景吧,但是我只想在机器人上边输入文字,使用TextView的内置属性当然可以解决,但是如果屏幕适配出现区别,你设置的属性是一个固定值,效果就可想而知了。所以B和R是来做这个功能的,我们来规定绘制文字到小机器人上:
(B、R黑线交叉的区域刚好是小机器人的区域)
Android中.9图片的说明和绘制

我们在布局文件中定义TextView,并引用这个布局为背景,效果图:

Android中.9图片的说明和绘制

怎么样,没有定义文字显示位置就实现了预定位。相对位置来说是符合的,因为图片已经被拉伸了。这个不怎么常用,没有T和L用的多。

总结:
.9图片适合中心图不变的扩展图,我们可以对比下拉伸前后的图,细腻的地方比如雨点都更模糊了,当然我们的目的就是保证小机器人不变,而且拉伸过的图也挺实用,省去麻烦美工再做一套尺寸的工作了。