NinePatch (.9图)的原理和使用

博客围绕.9图展开,介绍其定义,即左边和上边的线分别代表垂直和水平拉伸区域,右边和下边代表文字等可显示区域。还说明了.9图的使用方法,编译时对图片格式的处理,以及加载.9图片的原理,最终调用底层实现绘制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

遇到一个奇怪的问题:提供给别人的aar的 9-patch图片都不生效了. 初始以为时图片格式的问题, 改了一阵.

后来看了一下发现别人用的时候根本没用aap编译图片, 系统无法识别9-patch. 然后还要用gradle特别帮别人编译一下...

 

.9图的定义

简单来说就是

左边的线代表垂直拉伸的区域,上边的线代表水平拉伸的区域;

右边的线代表文字等的垂直可可显示区域,下边的线代表文字等的水平可显示区域。

所以,左上重合的区域就是拉伸区域;右下重合的区域就是显示区域。

.9图现在可以在AS里面编辑, 十分方便

 

.9图的使用

一般直接当做图片资源使用即可

从服务器获取.9图时处理

如果不是编译时加入的话需要先对图片编译

执行命令:aapt.exe s -i xxx.9.png -o xxx.png

然后使用代码加载
 

Bitmap bmp = BitmapFactory.decodeFile(filepath); 

NinePatchDrawable npd = new NinePatchDrawable(context.getResource(), bmp, bmp.getNinePatchChunk, new Rect(), null); 

 

编译时对图片格式处理

 Android的编译工具aapt会把标记了拉伸区域的点9图处理成一个普通的png,并把相关的信息放入png头部的meta-data区域,即chunk。结构如下

可以编写代码读取.9图的信息

具体参考https://blog.youkuaiyun.com/u013365670/article/details/25415393

 

加载.9图片原理

调用NinePatchDrawable的draw方法实际调用了NinePatch的draw方法, 之后的代码执行依次是

canva.drawPatch > baseCanva.drawPatch > baseCanva.nDrawNinePatch > android_graphics_Canvas.drawNinePatch

可以看到最终是调用了底层实现绘制, 大概的实现原理应该是把图片分为9个区域, 然后对可以拉伸的区域拉伸绘制.

有兴趣的同学可以深入看下, 交流一下

 

 

参考: 

https://blog.youkuaiyun.com/Tencent_Bugly/article/details/52414034

https://blog.youkuaiyun.com/u013365670/article/details/25415393

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值