做了好多客户端软件了,突然发现里面有好多图片都是重复的,个别只是大小不一样,每次都使用大量图片,导致软件过大,项目总结的时候才发现Android已经提供了一种解决方案了,这就是NinePatchDrawable下面部分主要是翻译的官网api,后边有我总结的适用地方

NinePatchDrawable

NinePatchDrawable是一种可以调整大小的图片,用户自定义的拉伸区域,这种类型的图片被定义成一种特殊格式化的png文件

Nine-patch

NinePatchDrawable是一种可以拉伸的图片,Android可以自动调整大小去适应视图的内容区域,你已经把它作为背景。一个运用Nine-patch图片作为背景用在标准的android按钮上,按钮必须拉伸去适应各种字符的长度。一个Nine-patch是一种标准的png图片,它包含额外的一个像素的宽度。它必须保存为已.9.png为扩展名,并且放在项目的/res/drawable文件夹下。如果你是从APK解压后得到的*.9.png文件,注意它是已将周围的空白像素去掉了的,在使用时必须再加上。

边界是用来定义图片的可拉伸和静态区域。你指定一个(或多个)一像素宽度的黑线在左边或上边的边界(其他的边界像素应该完全透明或白色)指出一个可拉伸的区域。你可以有多个可以拉伸的区域:他们相对大小保持不变,所以最大的部分总是最大的。

你也可以在图片的左边和上部定义一个可选的drawable区域(实际上,内边距线)。如果一个视图对象设置NinePatch作为它的背景,然后指定视图的文本,它会伸展自己让所有的文本符合规定区域内,指定在右边和底部的线(如果包含)。当然内边距线不包括其中,Android使用左边和顶部的线去定义这个绘图区。

清楚的阐明不同线路之间的差别,左侧和顶部定义的那些像素的图像可以被复制以拉伸图像。底部和右线定义一个相对位置的图像,视图内容的放入其中。

下面是一个定义button的NinePatch文件:

这NinePatch定义了一个可伸缩的面积与左侧和顶部的线和底部和右侧线的绘制区域。在上面的图像中,虚线灰色线识别区域的图像将被复制以拉伸。粉红色的矩形区域在下面的底部图像识别的地区为视图的内容是允许的。如果内容不适应这个区域,图像将被拉伸。

Draw-9-patch工具提供了一中非常便利的方法去创建你自己的Nine-Patch图像,用一个WYSIWYG图片编辑器。它甚至提出警告,如果该地区已经定义为可伸缩的地区都处于危险的生产图纸工件由于像素复制。

XML例子

这儿有意向布局xml的例子示范怎么添加一个Nine-Patch图像在两个按钮上(NinePatch图像被保存为res/drawable/my_button_background.9.png)

Draw 9-patch工具:

下面是快速指导创建一个Nine-patch图片用Draw9-patch工具,你需要准备你想创建NinePatch的图片。

1.从终端上启动draw9patch程序从你的SDK /tools目录下

2.拖拽你的图片到draw9patch窗口(或者 File> Open 9-patch… 选择图片)你的工作空间会自动打开。

左边是你的绘画区域,也就是你可以编辑线为了拉伸区域和内容区域。右边是预览区域,你可以预览你被拉伸(上边是垂直拉伸,中间是水平拉伸,下面是同时拉伸)的图片。

3.点击1像素的周长来画线定义可拉伸区域和内容区域(可选)。右键点击(或者摁住shift键点击)去擦除已经画好的线。

4.完成后,选择File > Save 9-patch,你的图片会被保存为.9.png

注意:一个正常的png文件(*.png)会被加载一个空的1像素边界在图片的周围,以便于你可以画可拉伸区域和内容区域。一个已经被保存成9-patch的文件(*.g.png)加载时没有绘画的区域添加,因为它已经存在。

lZoom: 用来缩放左边编辑区域的大小

lPatch scale: 用来缩放右边预览区域的大小

lShow lock: 当鼠标在图片区域的时候显示不可编辑区域

lShow patches: 在编辑区域显示图片拉伸的区域(使用粉红色来标示)

lShow content: 在预览区域显示图片的内容区域(使用浅紫色来标示)

lShow bad patches: 在拉伸区域周围用红色边框显示可能会对拉伸后的图片产生变形的区域,如果完全消除该内容则图片拉伸后是没有变形的,也就是说,不管如何缩放图片显示都是良好的。(实际试发现NinePatch编辑器是根据图片的颜色值来区分是否为bad patch的,一边来说只要色差不是太大不用考虑这个设置。)

使用&范围
1、例子

原图:

画线之后的图片:

说明:勾选上Show patchs之后可以看到左边有一个粉红色的区域这个区域就是可以自动拉伸的区域,主要取决于左边(纵向拉伸)和上面(横向拉伸)黑线。

勾选上Show Content之后可以再右边的预览视图中看到三种方式的可拉伸内容填充区域。

2、其它使用

官网主要介绍了button按钮的使用,实际上项目中有很多地方都可以使用如下:

主要是拉伸左边区域,右边不需要拉伸

下图上边有一部分颜色值相同,可以适当拉伸

v这个左边的小箭头是不能拉伸的

下图主要是锯齿部分不能拉伸

下图主要是左上边小箭头部分不能拉伸

附录:

参考:

http://developer.android.com/guide/topics/graphics/2d-graphics.html#nine-patch

http://developer.android.com/reference/android/graphics/drawable/NinePatchDrawable.html

http://developer.android.com/tools/help/draw9patch.html

http://www.cnblogs.com/feisky/archive/2010/01/16/1649502.html

转载于:https://blog.51cto.com/zhaoyongpan/1206809

Android Nine-patch相关推荐

  1. Android Studio patch使用

    android Studio 导出patch文件分为两种方法 第一种git提交记录导出patch文件 在git上选择已经提交的记录右键选择Create Patch,选择OK就可以导出patch文件 第 ...

  2. android 9 patch

    转载于:https://www.cnblogs.com/tomkart/p/7592853.html

  3. github snap android,GitHub - albuer/heapsnap: HeapSnap 是一个定位内存泄露的工具,适用于Android平台。...

    HeapSnap 1.HeapSnap 是什么 HeapSnap 是一个定位内存泄露的工具,适用于Android平台. 主要特性如下: 对系统负载低 不需要修改目标进程的源代码 支持Andoroid上 ...

  4. Android 系统 (131)---ODM 开发用户常见需求文档(五)

    ODM 开发用户常见需求文档(五) 一:图库中的照片全屏显 (packages/apps/Gallery2/) 第一种: [java] view plaincopy diff --git a/src/ ...

  5. android堆内存解析,heapsnap HeapSnap 是一款针对 Android 进程堆内存进行追踪、定位,以便查出泄露位置的工具 @codeKK c开源站...

    1.HeapSnap 是什么 HeapSnap 是一个定位内存泄露的工具,适用于 Android 平台. 主要特性如下: 对系统负载低 不需要修改目标进程的源代码 支持 Andoroid 上的大多数 ...

  6. android之ION内存管理器(1)-- 简介

    by JHJ(jianghuijun211@gmail.com) 为什么需要ION 回顾2011年末[2],LWN审查了android kernel patch[3],以期望将这些patch合并到ke ...

  7. 使用 patch 命令打补丁

    之前的这篇文章 git 导出差异 diff 文件 写了导出 diff .patch 文件. 拿到 patch 文件,用 patch 命令可以快速的把修改内容合入,合入后在 git 上是已修改的状态,如 ...

  8. linux查看patch文件,linux – 如何知道patch命令是否正常工作?

    我正在尝试将seek-for-android项目提供的补丁应用于我从Cyanogenmod下载的代码.代码用make编译成功,所以我知道所有文件都在那里.我无法了解补丁正在做什么或者它是否正常工作.我 ...

  9. android pmem内存,android内存管理-ION/PMEM【转】

    ION debug ION 在/sys/kernel/debug/ion/ 提供一个debugfs 接口. 每个heap都有自己的debugfs目录,client内存使用状况显示在/sys/kerne ...

  10. android 微信6.2.0 AndroidManifest.xml

    <?xml version="1.0" encoding="utf-8" standalone="no"?> <manif ...

最新文章

  1. 单片机干嘛的?嵌入式是单片机吗?
  2. git bash命令_?你可能不太会用的10个Git命令
  3. Winform中设置ZedGraph的曲线为折线、点折线、散点图
  4. java 序列化 原理解析
  5. SQL注入——基于时间的盲注(九)
  6. 大括号之谜:C++的列表初始化语法解析
  7. win系统流畅度测试软件,视频对比:老电脑装Win7、Win10流畅性测试
  8. java在线聊天项目 使用SWT快速制作登录窗口,可视化窗口Design 更换窗口默认皮肤(切换Swing自带的几种皮肤如矩形带圆角)...
  9. 黑马程序员_面向对象的三大特征
  10. 讯飞输入法(原讯飞语音输入法) V2.1.1708 官方版-完美软件下载
  11. 关于Microsoft Enterprise Library的介绍
  12. SQL反模式学习笔记1 开篇
  13. 修改rocketmq nameserver的默认端口号
  14. 深圳市集体户户口簿首页pdf版获取指南
  15. 苹果开发者 - 添加App
  16. SSM实训: 2、博客中间内容(首页2)
  17. 简谈Oracle体系结构
  18. 基于asp.net028住院部病人管理系统
  19. 谢少荣到计算机学院,我院获批国家自然科学基金委人工智能代码(F06)首个重大项目...
  20. 「业务架构」定义业务能力-备忘单

热门文章

  1. CSS3 2D 转换
  2. [字符串]与[数组]的互相转换
  3. 我也来记录我的一些开发心得和笔记!
  4. 安卓APP_ 控件(9)—— PopupWindow弹窗
  5. neo4j python 算法_python操作neo4j简单实例
  6. go将服务器图片响应给客户端,Go中来自客户端和服务器的RPC
  7. java多线程售票例子
  8. 越用越快的福禄克布线认证测试仪
  9. 推荐一款免费国产远程办公神器ToDesk,TeamViewer完美替代品
  10. 大疆口袋相机美颜怎么设置_灵眸Osmo口袋云台相机评测-大疆灵眸云相机使用说明...