这个九宫格绘画工具(draw9patch.bat)可以让你很容易的通过一个所见即所得(WYS|WYG)的编辑器来创建一个九宫格NinePatch图。
关于九宫格图以及它是如何工作的,请阅读九宫格图像Ninepatch Images主题的相关章节。
面是一个便捷指南。你需要PNG图像来创建一个九宫格。
1. 从一个终端(比如windows浏览器),启动这个draw9patch应用程序,该程序位于你的SDK /tools 目录下。
2. 把你的PNG图像拖放到这个工具的窗口中(或者通过File->Open 9-patch... 来定位文件)。你的工作台将被打开。
左边的窗格是你的绘画区域,你可以在里面编辑可延伸的宫格和内容区域。右边窗格是预览区域,从中你可以预览图形的拉伸。
3. 在1个像素周长里点击,绘制线条来定义可延伸宫格以及(可选的)内容区域。点击右键(或者在苹果机上,按住Shift并点击)取消之前画的线。
4. 这些完成后,选择File > Save 9-patch...
你的图片将以.9.png 文件名保存。
注意: 一个通常的PNG文件(*.png) 加载时,将以一个空的单像素边界补充在图片周围,你可以在里面画可延伸宫格和内容区域。一个前面保存的九宫格文件(*.9.png)将以原样加载,因为这个已经存在。
可选控制包括:
·缩放Zoom: 调整图片大小
·宫格比例Patch scale: 调整预览视图中图像的比例
·显示锁定区域Show lock: 使不可画区域在鼠标移动到该区域上时显示出来。
·显示宫格Show patches: 预览这个绘图区中的可延伸宫格(粉红色代表一个可延伸宫格)。
·显示内容Show content: 预览视图中的高亮内容区域(紫色部分)。
·显示坏宫格Show bad patches: 在宫格区域四周增加一个红色边界,这可能会在图像被延伸时产生人工痕迹。如果你消除所有的坏宫格,延伸视图的视觉一致性将得到维护。
转载于http://dev.10086.cn/cmdn/wiki.index.php?editon-view-2471-1.html#1
一、什么是9.png:
可能做过任务栏美化的同学都会知道,我靠,framework-res.apk\res\drawable-hdpi 目录下有非常非常多的XXXXXX.9.png图片。
千万不要以为这个9只是png格式图片的命名区分,其实他是一种特殊的格式,在png图片的基础上动了些手脚,而且这种手脚你会
看不见摸不着(详情见下面具体内容)。
9.png格式的图片是安卓平台上新创的一种被拉伸却不失真的玩意(挺高级的吧),也许有
的同学在做美化的时候很喜欢一个图片素材,重命名替换了drawable-hdpi下的素材,但是运行系统后发现,怎么被拉伸得不像样子
了,哈哈,这就是9.png图片不能轻易碰的神奇所在,不过不要紧,下面看完你就会了,安卓美化大师就是你了。
首先我们还是得介绍一下,9.png图片他的具体不同之处,它的四周与普通的png图片相比多了一个像素位的白色区域,该区域
只有在图片被还原和制造的时候才能看到,当打包后无法看见,并且图片的总像素会缩小2个像素,比如23x23像素的9.png图片被
打包后会变成21x21像素。所以我们在制作的时候要注意掌握尺寸。
当我们制作出9.png图片的时候你还有惊奇的发现一个几KB或者几十KB的图片,变得非常的小,一般只有几百个字节那么大,
系统加载起来当然会更加的流畅咯。
重要声明,该制作工具均需要搭建java运行环境,就是下载jdk安装,并在计算机属性中搭建环境变量,具体操作本帖就不讲了,
网上找一下如何搭建环境变量就有了。
二、如何制作9.png图片素材:
1、下载工具: draw9patch.zip 该工具SDK中自带。
2、解压,执行draw9patch.bat,会出现如图:
3、将你用PS制作的图片素材,拖到该窗口中,出现如图:
解释:中间黑红条纹部分表示不能编辑,边缘白色透明框就是上述介绍的增加的一像素边框。
4、将鼠标放在白色边框,点住左键不放拖动,会出现黑色线条如图:
解释:1号黑色条位置向下覆盖的区域表示图片横向拉伸时,只拉伸该区域
2号黑色条位置向右覆盖的区域表示图片纵向拉伸时,只拉伸该区域
3号黑色条位置向左覆盖的区域表示图片纵向显示内容的区域
4号黑色条位置向上覆盖的区域表示图片横向显示内容的区域
没有黑色条的位置覆盖的区域是图片拉伸时保持不变(比如,如果图片的四角为弧形的时候,当图片被任意拉伸时,四角的弧形都不会发生改变)
5、如果失误多选了部分,可按住shift键,点击鼠标左键去掉黑色条
6、右边3个黑色图形区域为显示当前拉伸效果
7、选择好区域后,点击左上file-》save 9-path,保存图片,后缀名为xxx.9.png,此时图片效果为:
解释:我们可以看见图片的周围多了4个黑色条,不要急这个图片还不能用,这就是原始的9.png图片,当我们进行下一步操作后,这个图片就变得正常了。
去黑边:
解压xUltimate-d9pc-x86.rar压缩包
1.把预处理黑边的图片到目录example1\res\drawable-hdpi下
2.双击xUltimate-d9pc.exe,听到电脑滴的一声,即可完成去黑边(此时的9.png图片内部加载了黑边信息)
3.根目下会自动生成done文件,在done\example1\res\drawable-hdpi下,就是我们经过处理的9.PNG图片
4.这个图片就是我们要美化替换的图片
====================================== 反编辑出来的图片作黑边模版 =====================================
解压 apktool.zip 压缩包
点安装.bat”,此时会在系统c盘生成几个文件。
3、将你要修改的framework-res.apk(当然也可以是其他系统程序apk文件,如music.apk)重命名为update.apk,并放到c:盘根目录
(必须放c:,因为后面执行的批处理文件编写的是在c:工作)
4、执行c:根目录下unpack.bat,此时会在c:生成一个update的文件夹,里面的内容就是你要修改的APK文件,并且当你打开drawable-hdpi
文件夹时你会发现里面的9.png图片变得和我们上面 制作的相像了,都有4条黑边,这就是该工具将其还原了。
======================= 按AIT+TAB键,转换窗口。对照黑边模版,画的黑边速度快,准 ===============================
1.背景自适应且不失真问题的存在
制作自适应背景图片是UI开发的一个广泛问题,也是界面设计师渴望解决的问题,我相信我们彼此都深有体会。
比如,列表的背景图一定,但是列表的高度随着列表数据项会发生变化;标题栏的背景,无论横屏还是竖屏,高分辨率还是低分辨率,都能自动填充满,而且不失真等等背景问题。
根据以往的经验,我们一般采用先切图后拼凑的做法,这种做法本来我想在这里和大家介绍一下,其实有的时候还是很有用的,但是说起来会比较麻烦,就不说这个非重点了,略去,如果大家真的要介绍,在回复中说明,我再考虑一下。
Android针对这种情况,专门制作了一种.9.PNG格式来解决这个问题。
2.9.PNG格式。
我不想在这里过多的讨论PNG格式的定义问题。但是.9.PNG确实是标准的PNG格式,只是在最外面一圈额外增加1px的边框,这个1px的边框就是用来定义图片中可扩展的和静态不变的区域。特别说明,left和top边框中交叉部分是可拉伸部分,未选中部分是静态区域部分。right和bottom边框中交叉部分则是内容部分(变相的相当于定义看一个内边距,神似padding功能,后面我会单独介绍一下),这个参数是可选的, 如下图。
在Android中以9.PNG格式的图片未背景,则能够自定义拉伸而不失真,比如系统的Button就是一个典型的例子。
其实呢,无论是left和top,还是right和bottom都是把图片分成9块 (边角四块是不能缩放的,其他的四块则是允许缩放的),所以叫做9.PNG。
3. 使用Draw9Patch.jar制作9.PNG图片之定义拉伸区域。
前面已经了解到9.PNG格式的工作方式,下面我们使用谷歌提供的Draw9Patch(运行android-sdk-windows\tools目录下的Draw9Patch.bat)来制作.9.PNG图片。
第一步:准备要拉伸的图片。
非常小的一张图片,我希望以此为背景,中间部分填充文章内容。
第二步:制作.9.PNG图片。
打开Draw9Patch,把图片拖进去,如下:
默认的拉伸是整体拉伸,其实边框部分我们并不想拉伸,好,我们自己来定义拉伸区域,如下图:
然后点击File,导出为content.9.png。
第三步:在layout文件中使用制作的 .9.PNG图片.
新建工程Draw9Patch,默认主Activity为Draw9PatchActivity.java:
1
2
3
4
5
6
|
@Override
public
void
onCreate(Bundle savedInstanceState)
{
super
.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
|
我们把content.9.png文件拷贝到/res/drawable文件夹下,打开/res/layout目录下的main.xml,申明如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
<?
xml
version="1.0" encoding="utf-8"?>
<
LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="#777"
android:padding="8dip"
>
<
TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="正文:A NinePatchDrawable graphic is a stretchable bitmap image."
android:background="@drawable/content"
android:textColor="#000"
/>
</
LinearLayout
>
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
<?
xml
version="1.0" encoding="utf-8"?>
<
LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="#777"
android:padding="8dip"
>
<
TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="正文:A NinePatchDrawable graphic is a stretchable bitmap image, which Android will automatically resize to accommodate the contents of the View in which you have placed it as the background. A NinePatch drawable is a standard PNG image that includes an extra 1-pixel-wide border."
android:background="@drawable/content"
android:textColor="#000"
/>
</
LinearLayout
>
|
可以看出,边框非常的清晰。下图是未使用.9.PNG的对比图,而且也不是我们要的效果:
到这里为止,我们已经基本会制作.9.PNG图片了。为了知识体系的全面性和深入性,我们继续。
4.使用Draw9Patch.jar制作9.PNG图片之定义内容区域。
是不是觉得文字和边距挨的太近,好,我们使用right和bottom边的线来定义内容区域,来达到增大内边距的目的。
我们定义了一个很小的内容区域,其他的地方则自动充当边框,从而使内边距显的很大,如下图,
在这里,我要特别说明,一开始为了增大内边距,很容易惯性思维,在<TextView>中申明android:padding="10dip" 之类的,我在这里劝告朋友们不要这么做,一是你将无法预知你的显示,二是这比较混淆,因为设置内容区域就是确定padding,所以我在前面部分说他们是神似。我个人认为通过内容区域设定padding比在布局xml中定义padding更优雅,更简洁!
关于Draw9Patch工具的其他使用说明,我在次不再累述,因为要说的话太多,为了节省篇幅,请参考官方文档。
5.制作.9.PNG的高级技巧。
对于初学Draw9Patch的人来说,这可以算是高级技巧,那就是:拉伸区域,可以不是连续的,可以不止一块,而且是和自定义的边框线的长度成正比。
直接上图说明:
6.SDK中如何处理9.PNG图片。
SDK专门针对9.PNG做了定义和处理,这里我们只是做个简单的流程分析,Bitmap在读取图像流数据的时候,会把判断图片的NinePatchChunk(9Patch数据块),如果NinePatchChunk不为空,则是NinePatchDrawable,NinePatchDrawable则又会交给NinePatch处理:
1
2
3
|
setNinePatchState(
new
NinePatchState(
new
NinePatch(bitmap, bitmap.getNinePatchChunk(),
"XML 9-patch"
),
padding, dither), r);
|
NinePatch检验成功则调用本地方法,绘制出最终的图片:
1
2
3
|
nativeDraw(canvas.mNativeCanvas, location,
mBitmap.ni(), mChunk, paint !=
null
? paint.mNativePaint :
0
,
canvas.mDensity, mBitmap.mDensity);
|
7.android系统中大量应用了9.PNG图片。
通过解压随便一个rom,找到里面的framework_res.apk,里面有大量的9.PNG格式文件,被广泛的应用起来,比如常见的有:
按钮:
解锁:
下拉框:
标题栏:
Toast:
还有搜索,键盘,放大缩小控件,时间加减等等,我就不一一列举。
8.最后送上一些图例,以飨读者,以做后鉴:
赏图1 本人之作
赏图2 下拉按钮
赏图3 文章头部背景
赏图4 系统头部背景
赏图5 再来一个头部背景
谢谢大家的支持。