本站文章均为 李华明Himi 原创,转载务必在明显处注明:
转载自【黑米GameDev街区】 原文链接: http://www.himigame.com/android-game/321.html

前几天群成员讨论过关于9patch的工具【我比较喜欢喊它9妹子,西西(*^_^*)】、然后研究了一下,比较简单但是很实用的一个Android sdk 自带工具、这里给大家做一个分享下经验!

1.什么是“9妹”(9patch)?

它是一个对png图片做处理的一个工具,能够为我们生成一个"*.9.png"的图片;

2.何为"*.9.png"?

所谓"*.9.png"这是Android os里所支持的一种特殊的图片格式,用它可以实现部分拉伸;这种图片是经过”9妹“进行特殊处理过的,如果不处理的话,直接用PNG图就会有失真,拉伸不正常的现象出现。

3.它的用途是?

说到用途,这种特殊格式的png图,我也看了网上的相关文章但都是用一个能自适应的button举例子!(如下图)清一色抄袭.. - -、

 (此实例咱们直接无视掉,在后面我会给大家灌输游戏中实例)

    这个例子是指当button上的字体大小改变,那么文字底下的png图也会自动适应文字。

这似乎表明做Android 软件应用 使用一些组件的的时候会时常用到;

4.那么实际在游戏中到底如何使用呢?什么情况下去使用呢?

当然啦,身为做游戏我一定要”9妹“利用在咱们游戏中才行,不然岂不是白研究了、经过思考突然想到了一些情况,并且发现“9妹”确实在游戏开发中占有一定的分量!下面我们来先熟习“9妹”工具,然后再跟大家举例,贴图来说明其用途、毕竟有图有真相 呵呵~

启动9妹:

在你Android SDK 路径下 X:/android sdk/tools ,你会找到一个 【draw9patch.bat】,没错这就是9妹啦、官方名 NinePatch ;

提示导入一张png图片,然后真正进入"9妹"的操作界面(如下图): (图1)

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

序列 ② :区域是导入的图片,以及可操作区域。

序列 ③ :这里 zoom:的长条bar 是对导入的图放大缩小操作,这里的放大缩小只是为了让使用者更方便操作,毕竟是对像素点操作比较费眼,下面的 patch scale 是序列 ④区域中的三种形态的拉伸后的一个预览操作,可以看到操作后的图片拉伸后的效果。

序列 ④: 区域这里从上到下,依次为:纵向拉伸的效果预览、横向拉伸的效果预览,以及整体拉伸的效果预览

序列 ⑤: 这里如果你勾选上,那么当你鼠标放在 ② 区域内的时候并且当前位置为不可操作区域就会出现lock的一张图,就是显示不可编辑区域 ;

序列 ⑥: 这里勾选上,那么在④ 区域中你就会看到当前操作的像素点在拉伸预览图中的相对位置和效果。

序列 ⑦: 在编辑区域显示图片拉伸的区域;

如何操作:鼠标左键选取需要拉伸的像素点; shift+鼠标左键取消当前像素点。

操作区域:

大家看到导入的png图片默认周围多了一像素点,也就是这一圈一像素点就是咱们的可操作区域。因为方和右方可操作区域是指定内容的显示区域,属于可选区域,可不予理会;但是要注意内容区域的标记不能有间断,也就是说标记要连续且仅有一处,否则.9.png图片在放入项目下会报错。

主要大家注意Left 和 top 操作区域;

Top操作区域的一排像素点,表示横向拉伸的像素点;

Left操作区的一排像素点,表示纵向拉伸的像素点;

下图是我对图片的操作:(图2)

大家看到上方和左边的黑色像素了么?对,这些是我手动操作的地方,我这里是想让此png图像拉伸操作的时候,只是中间区域被拉伸。选择上方中间区域是为了横向拉伸的时候选取的拉伸像素点,左边则是纵向拉伸的;

那么大家现在回头看一眼(图1)然后对比(图2),看到区别了吧!很明显,(图1)我们没有任何操作,默认整体拉伸,那么拉伸的效果很明显的失真了...而(图2)我们指定了拉伸的像素点所以只是中间的被拉伸,图片的花边我们保留不拉伸这样看起来就好太多啦 娃哈哈、

然后通过“9妹”就可以保存出来一张“*.9.png”图片,我们放在android 项目的res 下的 drawable 下就可以拉!

现在我就可以跟大家讲下使用“*.9.png”的好处:

在我们手机游戏开发的过程中,我们最关系的是生成的安装文件、比如j2me 的jar 包,塞班的sis、sisx 以及咱们andrid中的apk都希望打包后的包越小越好、虽然现在的手机趋向于智能了,但是毕竟手机的容量和内存还是有限、身为移动设备开发者的我们对此都很看重,那么通过"9妹"处理后的图片我们就可以省去不少的内存和容量。

1. 省精力和时间!

如果我们有一张50*50的类似上面那种带花边的png图片,那么我们在android或者大分辨率的机器上使用的画,肯定需要对其处理,那么要不就是让美工的mm们给咱们重新做一张,那么通过"9妹"处理得到的“*.9.png”就会省去美工的负担了。

2.省内存!

如果不想用代码来对其小图进行缩放来再次使用(因为考虑会失真),那么可能会多加了图片,这样一来游戏包的大小就会增加了,几K—几十K不等,而利用"9妹"处理的就省去了这些麻烦。

3.减少代码量!

有些童鞋该说啦,我用代码一样能实现(图2)的效果不失真,OK,我也知道。当初我在J2ME平台做RPG的时候也是利用设置可视区域等代码来实现的,但是如果你用“.9.png”的方式就更简单!!!

不多吹 “9妹”的好处,下面我们来看看代码如何实现此格式的方式和效果吧!

  1. package com.himi;
  2. import android.content.Context;
  3. import android.graphics.Bitmap;
  4. import android.graphics.BitmapFactory;
  5. import android.graphics.Canvas;
  6. import android.graphics.Color;
  7. import android.graphics.NinePatch;
  8. import android.graphics.Paint;
  9. import android.graphics.RectF;
  10. import android.util.Log;
  11. import android.view.SurfaceHolder;
  12. import android.view.SurfaceView;
  13. import android.view.SurfaceHolder.Callback;
  14. public class MySurfaceView extends SurfaceView implements Callback, Runnable {
  15. private Thread th = new Thread(this);
  16. private SurfaceHolder sfh;
  17. private Canvas canvas;
  18. private Paint paint;
  19. private Bitmap bmp_old;
  20. private Bitmap bmp_9path;
  21. private NinePatch np;
  22. public MySurfaceView(Context context) {
  23. super(context);
  24. this.setKeepScreenOn(true);
  25. bmp_old = BitmapFactory.decodeResource(getResources(), R.drawable.himi_old);
  26. bmp_9path = BitmapFactory.decodeResource(getResources(), R.drawable.himi_9path);
  27. np = new NinePatch(bmp_9path, bmp_9path.getNinePatchChunk(), null);
  28. //创建一个ninePatch的对象实例,第一个参数是bitmap、第二个参数是byte[],这里其实要求我们传入
  29. //如何处理拉伸方式,当然我们不需要自己传入,因为“.9.png”图片自身有这些信息数据,
  30. //也就是我们用“9妹”工具操作的信息! 我们直接用“.9.png”图片自身的数据调用getNinePatchChunk()即可
  31. //第三个参数是图片源的名称,这个参数为可选参数,直接null~就OK~
  32. sfh = this.getHolder();
  33. sfh.addCallback(this);
  34. paint = new Paint();
  35. paint.setAntiAlias(true);
  36. setFocusable(true);
  37. }
  38. public void surfaceCreated(SurfaceHolder holder) {
  39. Log.v("Himi", "surfaceCreated");
  40. th.start();
  41. }
  42. /**
  43. * @author Himi
  44. */
  45. public void draw() {
  46. canvas = sfh.lockCanvas();
  47. canvas.drawColor(Color.BLACK);
  48. RectF rectf_old_two = new RectF(0, 50, bmp_old.getWidth() * 2, 120 + bmp_old.getHeight() * 2);//备注1
  49. RectF rectf_old_third = new RectF(0, 120 + bmp_old.getHeight() * 2, bmp_old.getWidth() * 3,
  50. 140 + bmp_old.getHeight() * 2 + bmp_old.getHeight() * 3);
  51. // --------下面是对正常png绘画方法-----------
  52. canvas.drawBitmap(bmp_old, 0, 0, paint);
  53. canvas.drawBitmap(bmp_old, null, rectf_old_two, paint);
  54. canvas.drawBitmap(bmp_old, null, rectf_old_third, paint);
  55. RectF rectf_9path_two = new RectF(250, 50, 250 + bmp_9path.getWidth() * 2, 90 + bmp_9path.getHeight() * 2);
  56. RectF rectf_9path_third = new RectF(250, 120 + bmp_9path.getHeight() * 2, 250 + bmp_9path.getWidth() * 3,
  57. 140 + bmp_9path.getHeight() * 2
  58. + bmp_9path.getHeight() * 3);
  59. canvas.drawBitmap(bmp_9path, 250, 0, paint);
  60. // --------下面是".9.png"图像的绘画方法-----------
  61. np.draw(canvas, rectf_9path_two);
  62. np.draw(canvas, rectf_9path_third);
  63. sfh.unlockCanvasAndPost(canvas);
  64. }
  65. public void run() {
  66. // TODO Auto-generated method stub
  67. while (true) {
  68. draw();
  69. try {
  70. Thread.sleep(100);
  71. } catch (Exception ex) {
  72. }
  73. }
  74. }
  75. public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
  76. Log.v("Himi", "surfaceChanged");
  77. }
  78. public void surfaceDestroyed(SurfaceHolder holder) {
  79. Log.v("Himi", "surfaceDestroyed");
  80. }
  81. }

下图是模拟器中的效果图、

    左边是正常png的缩放不同大小的情况,右边是咱们的9妹处理过的“*.9.png”、娃哈哈,怎么样 效果明显不一样吧!

好啦,到这里就结篇吧,挺累的 写了三个多小时了....... 希望大家以后多多的利用 “9妹”哦、

(推荐大家订阅本博客,因为咱的更新速度可是很快的~娃哈哈)

【Android游戏开发十一】手把手让你爱上Android sdk自带“9妹”相关推荐

  1. 【Android游戏开发二十五】在Android上的使用《贝赛尔曲线》!

    首先对于<赛贝尔曲线>不是很了解的童鞋,请自觉白度百科.google等等... 为了方便偷懒的童鞋,这里给个<贝赛尔曲线>百科地址,以及一段话简述<贝赛尔曲线>: ...

  2. 《Android游戏开发详解》一导读

    前 言 Android游戏开发详解 作为对编程知之甚少或者毫无所知的初学者,开始学习Android游戏开发,可能会觉得就像是穿越陌生的星际的旅程.有太多的事情要尝试,太多的知识要学习,令人遗憾的是,还 ...

  3. Android游戏开发教程

    几个月前,我们收到了来自Java开发人员Tamas Jano的电子邮件,要求加入我们的JCG合作伙伴计划. 令我们惊讶的是,他维护了一个名为" Against The Grain " ...

  4. Android游戏开发大全

    查看书籍详细信息: Android游戏开发大全 编辑推荐 帮助读者掌握Android游戏项目的开发流程 和项目驱动的好书! 内容简介 <Android游戏开发大全>以Android手机游戏 ...

  5. 浅谈Android游戏开发基础和经验

    Android游戏开发基础和经验是本文要介绍的内容,主要是来了解并学习Android游戏开发的内容实例,具体关于Android游戏开发内容的详解来看本文. 做一个类似俄罗斯方块的android游戏开发 ...

  6. 【Android游戏开发二十七】讲解游戏开发与项目下的hdpi 、mdpi与ldpi资源文件夹以及游戏高清版本的设置...

    今天一个开发者问到我为什么游戏开发要删除项目下的hdpi.mdpi和ldpi文件夹:下面详细给大家解答一下: 首先童鞋们如果看过我写的<[Android游戏开发二十一]Android os设备谎 ...

  7. Android游戏开发Android软件开发【教程三十篇】

    Android软件开发之发送短信与系统短信库解析(三十)  New Android软件开发之获取通讯录联系人信息(二十九)  New Android软件开发之PreferenceActivity中的组 ...

  8. 【ANDROID游戏开发十六】ANDROID GESTURE之【触摸屏手势识别】操作!利用触摸屏手势实现一个简单切换图片的功能!...

    本站文章均为 李华明Himi 原创,转载务必在明显处注明: 转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/android-game/337.html - ...

  9. 《Android游戏开发详解》——第1章,第1.6节函数(在Java中称为“方法”更好)...

    本节书摘来自异步社区<Android游戏开发详解>一书中的第1章,第1.6节函数(在Java中称为"方法"更好),作者 [美]Jonathan S. Harbour,更 ...

最新文章

  1. 鲲鹏应用创新大赛山西区域赛圆满落幕,鲲鹏生态助力信创变革
  2. 每日源码分析 - lodash(debounce.js和throttle.js)
  3. nfs:client mount成功,但是进入目录时出现Permission denied
  4. 如何查询SAP Cloud for Customer系统升级和维护时间
  5. uniapp uni.request GET方式请求,不能直接传数组解决方法
  6. 汇编语言编译器masm_计算机汇编语言和指令操作
  7. ASP.NET获取IP地址与MAC地址方法
  8. Javaspring 14-18课 spring AOP
  9. linux学习笔记:yum命令的常见用法
  10. 访问ControlTemplate内部的元素
  11. Resharper:还记得NHibernate之夏中那如梦般的代码自动工具吗?
  12. 介绍PS大局观很不错的转文
  13. S5P4418iNand清空方法
  14. 办公室局域网组建计算机网络,如何组建办公室局域网
  15. 安卓优雅的svg实践绚丽效果
  16. android+百度阅读,百度阅读最新版
  17. Linux如何实现网络通信
  18. 计操实验 多级反馈队列C语言
  19. 港股通会成资金外流黑洞?伪逻辑不值一驳
  20. 利用python读取excel中的公司名称获取公司的经营范围并回填进excel中

热门文章

  1. 对使用CodeSmith模板生成NHibernate的代码的分析
  2. effective c++条款11扩展——关于拷贝构造函数和赋值运算符
  3. Connection to node 0 (/192.168.204.131:9092) could not be established
  4. linux中mysql与eclipse_Linux下eclipse CDT及mysql安装,c++访问mysql数据库
  5. 可以ping通 但ssh: connect to host 192.168.0.2 port 22: Connection refused
  6. 全国计算机等级考试题库二级C操作题100套(第03套)
  7. 计算机专业运动会口号,运动会口号押韵有气势 计算机系霸气口号
  8. java gzip 多个文件_Java Zip多文件压缩和 GZIP压缩
  9. 怎么在linux的cmd中运行c项目,如何在cmd窗口编译运行c语言程序?
  10. 利用福禄克网线/光纤测试仪规范测试BICSI标准