9png图片自动缩放.doc_第1页
9png图片自动缩放.doc_第2页
9png图片自动缩放.doc_第3页
9png图片自动缩放.doc_第4页
9png图片自动缩放.doc_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

手把手让你爱上Android sdk自带“9妹” 前几天群成员讨论过关于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. packagecom.himi; 2. importandroid.content.Context; 3. importandroid.graphics.Bitmap; 4. importandroid.graphics.BitmapFactory; 5. importandroid.graphics.Canvas; 6. importandroid.graphics.Color; 7. importandroid.graphics.NinePatch; 8. importandroid.graphics.Paint; 9. importandroid.graphics.RectF; 10. importandroid.util.Log; 11. importandroid.view.SurfaceHolder; 12. importandroid.view.SurfaceView; 13. importandroid.view.SurfaceHolder.Callback; 14. publicclassMySurfaceViewextendsSurfaceViewimplementsCallback,Runnable 15. privateThreadth=newThread(this); 16. privateSurfaceHoldersfh; 17. privateCanvascanvas; 18. privatePaintpaint; 19. privateBitmapbmp_old; 20. privateBitmapbmp_9path; 21. privateNinePatchnp; 22. publicMySurfaceView(Contextcontext) 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=newNinePatch(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=newPaint(); 35. paint.setAntiAlias(true); 36. setFocusable(true); 37. 38. publicvoidsurfaceCreated(SurfaceHolderholder) 39. Log.v(Himi,surfaceCreated); 40. th.start(); 41. 42. /* 43. *authorHimi 44. */ 45. publicvoiddraw() 46. canvas=sfh.lockCanvas(); 47. canvas.drawColor(Color.BLACK); 48. RectFrectf_old_two=newRectF(0,50,bmp_old.getWidth()*2,120+bmp_old.getHeight()*2);/备注1 49. RectFrectf_old_third=newRectF(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. RectFrectf_9path_two=newRectF(250,50,250+bmp_9path.getWidth()*2,90+bmp_9path.getHeight()*2); 56. RectFrectf_9path_third=newRectF(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. publicvoidrun() 66. /TODOAuto-generatedmethodstub 67. while(true) 68. draw(); 69. try 70. Thread.sleep(100); 71. catch(Exceptionex) 72. 73. 74. 75. publicvoidsurfaceChanged(SurfaceHolderholder,intformat,in

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论