android 工具 Draw 9-patch 详解
画九宫格Draw 9-patch
这个九宫格绘画工具(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键,转换窗口。对照黑边模版,画的黑边速度快,准===============================
android 制作9.png图片
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 >
|
如图,
我们修改text,
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 再来一个头部背景
谢谢大家的支持。
android 工具 Draw 9-patch 详解相关推荐
- Android自动化测试环境部署及adb sdkmanager avdmanager Monitor DDMS工具使用及命令详解
环境部署及工具使用 系列文章 前言 环境部署 硬件环境 软件环境 ADB工具 adb组成 adb命令 android命令 sdkmanager 命令 avdmanager命令 管理模拟器 monito ...
- Android Studio CPU profiler性能分析工具介绍和使用详解
Android Studio CPU profiler性能分析工具介绍和使用详解 CPU profiler介绍 Android Studio CPU 性能剖析器可实时检查应用的 CPU 使用率和线程活 ...
- python 单元测试 工具_Django单元测试工具test client使用详解
The test client test client是一个python类,来模拟一个简单的"哑"浏览器,允许你来测试你的view函数.你可以使用test client完成下列事情 ...
- Android App优化之ANR详解
引言 背景:Android App优化, 要怎么做? Android App优化之性能分析工具 Android App优化之提升你的App启动速度之理论基础 Android App优化之提升你的App ...
- Android高效率编码-第三方SDK详解系列(一)——百度地图,绘制,覆盖物,导航,定位,细腻分解!...
Android高效率编码-第三方SDK详解系列(一)--百度地图,绘制,覆盖物,导航,定位,细腻分解! 这是一个系列,但是我也不确定具体会更新多少期,最近很忙,主要还是效率的问题,所以一些有效的东西还 ...
- Android签名与校验过程详解
原文:https://blog.csdn.net/gulinxieying/article/details/78677487 目 录 一.签名与校验原理概要 2 1.数字签名简介 2 2. ...
- Android网络开发技术实战详解
<Android网络开发技术实战详解> 基本信息 作者: 朱桂英 丛书名: Android移动开发技术丛书 出版社:电子工业出版社 ISBN:9787121173493 上架时间:2012 ...
- iPhone和Android的WEB应用开发详解
iPhone和Android的WEB应用开发详解 在我们现在的生活中,移动设备的作用日益重要.我们使用它们进行交流.我们使用它们进行导航.我们甚至可以将它们用作方便的手电筒.面向 iPhone 和 A ...
- android studio gradle3.3,Android studio 3.2 升级详解及Gradle配置
Android studio 3.2 升级详解及Gradle配置 发布时间:2018-09-29 15:36, 浏览次数:618 , 标签: Android studio Gradle 一直在使用An ...
- JNI开发之-Android.mk和Application.mk 详解
Android.mk和Application.mk 详解 Android.mk 基础知识 变量和宏 NDK 定义的 include 变量 目标信息变量 模块描述变量 NDK 提供的函数宏 Applic ...
最新文章
- twig 调用php函数,twig里使用js变量的方法
- leetcode算法题--左旋转字符串
- Mongo报如下类似错误时的修改方法Cannot natively represent the long 1396367483000 on this platform...
- Window将Redis设置为开机启动
- oracle更新字段为null,OracleORA-01451:要修改为NULL的列无法修改为NULL
- STM32F103ZET6硬件资源简介
- scrcpy---Android投屏神器(使用教程)
- Frank and Hall
- python sendkeys用法_sendkeys用法详解
- mailgun php 邮件发送 实例
- 抗疫逆行者网页作业 感动人物HTML网页代码成品 网页作业带JS下拉菜单 最美逆行者网页模板 致敬疫情感动人物网页设计制作
- 华为CE6881端口联动限制
- 计算多个不同鞋码对应的脚长——C语言
- DNA测序也有批次效应?
- MFC Windows 程序设计[五十六]之开启子对话框(附源码)
- 生产企业原材料订购与运输的研究-数据处理课程设计
- 使用vue开发APICloud软件APP的教程
- 输入H.264流,输出封装格式流
- css样式内联式,外联式,嵌入式
- 平衡二叉树的左旋和右旋
热门文章
- 用户头像的背景为头像的模糊头像时候
- 启明欣欣STM32开发板闪烁LED实验
- FLUENT进行组分反应模拟
- DWH - 自动化监控BI系统的存储空间
- 大数据开发教程——企业级离线数据仓库项目实战开发
- 为什么不太建议你通过 Python 去找工作?
- 防止刷新或后退页面重复提交表单
- 三种算法求两个正整数的最大公约数和最小公倍数;求三个数的最大公约数和最小公倍数
- 查找WebSphere Application Server 管理控制台端口号
- 港科夜闻|香港科大汪扬教授轻松访谈:对话西泽投资管理主席刘央女士,倾听她跌宕起伏的30年投资生涯...