热门标签 | HotTags
当前位置:  开发笔记 > 前端 > 正文

关于安卓9patch图片的探究

关于安卓9patch图片的探究1.什么是“9妹”(9patch)?它是一个对png图片做处理的一个工具,能够为我们生成一个*.9.png的图片;2.何为*.9
关于安卓9patch图片的探究

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

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

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

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

  3.它的用途是?

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

        

 

现在我就可以跟大家讲下使用“*.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妹”的好处,下面我们来看看代码如何实现此格式的方式和效果吧!

 

  

[java:showcolumns] view plaincopy
 
·········10········20········30········40········50········60········70········80········90········100·······110·······120·······130·······140·······150
  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. }  

 

 

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

 

 

                        var cpro_id = "u6885494";

推荐阅读
author-avatar
萌新求学
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有