在做移动中间件的过程中,遇到了背景图片自适应的问题,比如一个Button的背景图片,如何让一张图片能够在不同高宽的场景下做到不失真。

在做移动中间件的过程中,遇到了背景图片自适应的问题,比如一个Button的背景图片,如何让一张图片能够在不同高宽的场景下做到不失真。

方案一: 刚开始想到的一个方案是用android的 nine-patch (又称“九妹”),*.9.png的图片是标准的png格式的图片,只是在外边1px的区域增加了边框,定义了缩放区域,只有上方黑线和左边黑线的交会区域会被拉伸,如下图所示:

将图片放在 drawable 目录下,本文中我以一个项目为例子去比较出加载的效果,在一个页面里设置两个button,一个用点9的图片,另一个用普通的图片,运行后的效果如下,从图上可以看到,点9的图片实现了背景缩放不失真,达到了想要的效果。

但往往事情并不是那么简单就可以解决的,在我们开发过程中,我们的产品在用户使用的过程中,图片是放在自定义目录下的,而没有放在drawable目录下,发现即使是点9的图片也是没有生效,而且周围的黑线还在。后来研究发现点9的图片在apk打包的过程中,对图片进行了编译处理,而放在自定义目录下的图片并没有编译,故上述方案没有解决根本问题。

方案二:上述方案没有解决问题,后来思考到,既然android在打包的时候将图片编译处理成了没有黑线的图片,那么我可不可以对普通的图片进行类似的处理呢?

带着这个疑问,我研究了android ninepath图片的信息,发现这个.9.png的图片的头被写入了一部分信息,也就是记录了缩放位置的基本信息,即通过如下方法

byte[] chunk = bm.getNinePatchChunk();

StringBuilder sb = new StringBuilder();

int peddingLeft = getInt(chunk, 12);

int paddingRight = getInt(chunk, 16);

int paddingTop = getInt(chunk, 20);

int paddingBottom = getInt(chunk, 24);

拿到了点9图片的头信息,通过对头信息的分析处理,通过如下代码,可以看出其头信息里写入的即是 图片的padding及 x,y的值。

/**

* 生成ninepatch 图片的data区域的数据

* @param bm

* @param xBegin x开始点坐标

* @param xEnd x结束点坐标

* @param yBegin y开始点坐标

* @param yEnd y结束点坐标

* @return 缩放图片数据区

* @throws IOException

*/

public static byte[] getChunk(Bitmap bm,int xBegin,int xEnd,int yBegin,int yEnd) throws IOException{

int bmWidth = bm.getWidth();

int bmHeight = bm.getHeight();

int paddingLeft = xBegin;

int paddingRight= bmWidth-xEnd;

int paddingTop = yBegin;

int paddingBottom = bmHeight-yEnd;

ByteArrayOutputStream ooo = new ByteArrayOutputStream();

for (int i = 0; i < 32; i++) ooo.write(0);

writeInt(ooo, xBegin);

writeInt(ooo, xEnd);

writeInt(ooo, yBegin);

writeInt(ooo, yEnd);

for (int i = 0; i < 3 * 3; i++) writeInt(ooo, NO_COLOR);

byte[] data = ooo.toByteArray();

data[0] = 1;

data[1] = (byte) 2;

data[2] = (byte) 2;

data[3] = (byte) 3*3;

writeInt(data, 12, paddingLeft);

writeInt(data, 16, paddingRight);

writeInt(data, 20, paddingTop);

writeInt(data, 24, paddingBottom);

return data;

}

那么我只要将ninepatch 需要的值写入到图片中即可,经过研究,,通过给定的坐标,算出padding值写入的数

据区中,关键代码实现如下(详细见附件):

在测试demo中,我做了三个Button对比,运行效果如下图所示,第三个Button的背景图片和互一个Button是一样的,只是第三个使用了自定义拉伸,可看出圆角没有失真。

到此,对于一张普通的图片,只需要设置其拉伸区域的坐标,就可以实现圆角背景图片自适应且不失真,统一了移动平台Android和IOS对于图片缩放接口。(示例见附件testnine.zip)

android如何设置自适应大小的背景图片,Android 背景图片自适应方案相关推荐

  1. Android Studio设置字体大小

    Android studio字体设置分为两种:一种是软件字体设置,另一种是代码字体设置.此处以Android Studio 2.2 正式版为例做说明. 1.  软件字体设置 1.1  从File--- ...

  2. android qq 设置界面大小设置,怎么设置手机腾讯QQ的字体大小

    怎么设置手机腾讯QQ的字体大小 许多手机app都会用字体的设置,来方便我们更好的使用这些应用,那么我们怎么设置手机腾讯QQ的字体大小呢,接下来就让小编来教你们吧. 具体如下: 1. 第一步,打开手机上 ...

  3. 手机android主题设置在哪里,手机如何安装Android主题

    手机如何安装Android主题 很多人用的智能手机用的是Android系统,那么大家知道要手机如何安装Android主题呢?下面一起来看看! 1.使用数据线连接计算机和手机,并运行91手机助手,点击界 ...

  4. android中设置ListView的选中的Item的背景颜色(附源码)

    http://longyi-java.iteye.com/blog/976067 ListView中没有默认的选择颜色,只有选择Item后的焦点颜色,鼠标点击时Item有颜色,放开鼠标后颜色也就没有了 ...

  5. android对话框字体大小,Android Dialog 设置字体大小的具体方法

    先看下面图片: 这是我在做登录页面的时候,调用系统的progressdialog 进行等待,可是看起来很不协调,左边的等待图片过大,右边文字过小,看起来老别扭,虽然功能上不存在什么问题,但是我有强迫症 ...

  6. Android 关于设置Dialog大小宽高和动画详解

    近期有的小伙伴需要对Dialog设置一些属性,例如它的宽高,是否全屏,位置,包括动画等,我最近的项目中刚好用到了这些,下面就将这些功能贴出来分享给大家 设置dialog对象的宽高 public voi ...

  7. Android BLE设置MTU大小

    MTU是什么? MTU是指在一个协议数据单元中(Protocol Data Unit, PDU) 有效的最大传输Byte. MTU默认是23byte,但是供我们使用的只有20byte.所以有时候不能满 ...

  8. android camera分辨率设置,android CAMERA 设置照片大小

    最近在 REAL210 android 上调试 CAMERA 驱动. 发现原来的开发板只支持 640*320 以及 320*240 , 但是用的是 OV3640 300W 的摄像头,应该可以拍照到 2 ...

  9. Android app设置字体大小和字体样式不随系统设置改变而改变

    字体大小 在BaseActivity和BaseApplication里重写方法或者在基类里重写方法: /设置字体为默认大小,不随系统字体大小改而改变@Overridepublic void onCon ...

  10. android glide设置缓存大小,Glide4-入门教程-5-缓存机制(内存缓存和磁盘缓存)

    一.简介 这一节,主要是讲glide4的缓存机制.Glide的缓存设计是非常的先进的,考虑的场景也很周全.Glide 的缓存分为两种,一是内存缓存,另一个是硬盘缓存. 这两种缓存的作用各不相同,内存缓 ...

最新文章

  1. 计算机系统结构研究分支,“计算机系统结构” 课程教学探讨[J] 电子科技大学.doc...
  2. 560. 和为K的子数组 974. 和可被 K 整除的子数组 (哈希表)
  3. python自加_浅谈:为什么python没有自增运算符?
  4. SQL Servr 2008空间数据应用系列一:空间信息基础
  5. CentOS 安装JDK跟TOMCAT
  6. 关于cell中添加子视图 复用重叠问题的解决方法
  7. jquery ajax 访问 mysql_使用ajax+jquery+php访问mysql数据库,并且达到不跳转页面的效果。。。...
  8. python必背入门代码-初学Python必背手册
  9. 遗传算法优化的bp神经网络_【首发推荐】农学:基于遗传BP神经网络的采摘机器人手眼标定研究...
  10. CSS3自定义下拉框菜单
  11. 周末DIY,三花聚顶,练就静音功夫!
  12. 华为核心交换机绑定IP+MAC+端口案例
  13. java程序员 .net 程序员_Java 程序员 和 .NET 程序员
  14. 了解一下这几款实用的小众软件,相信你会有意想不到的收获
  15. Python100道练习题(1-50)
  16. UE4Material_RainEffect(雨的效果)
  17. tp5.1 db助手与db::name混合使用数据库操作失效
  18. 图解Java服务端Socket建立原理
  19. Java 垃圾回收机制算法分析
  20. pandas 入门:DataFrame的创建,读写,插入和删除

热门文章

  1. 微信小游戏上传设置成体验版或者提交审核
  2. java地铁最短距离_地铁线路最短路径(项目实现)
  3. oeasy教您玩转vim - 4 - # 深入帮助
  4. linux pbs 安装包,【Linux】单计算机安装PBS系统(Torque)与运维
  5. 手机无线可以上网 电脑却没网络连接服务器,电脑连接手机热点不能上网怎么办 值得一看...
  6. 图像识别用什么神经网络,图神经网络可以做什么
  7. docker network create
  8. 【生活日记】  路在脚下,更在心中,心随路转,心路常宽
  9. 古诗词与代码之间不得不说的二三事。
  10. Gopher协议与ssrf