android系统对于可以随内容拉伸的9宫格png图片处理流程分析如下:

(1)隶属于canvas and Drawables,查看官方介绍可以知道java层面的类和函数关系:

----->android.graphics.drawable.NinePatchDrawable
----->NinePatchDrawable.draw(Canvas canvas)-画图函数,把png图片画到canvas上去。

(2)在源代码frameworks\base\graphics\java\android\graphics\NinePatch.java里面有方法:

---->public void draw(Canvas canvas, Rect location)

----->nativeDraw() (本地调用,需要查看jni文件)

(3)在源代码frameworks\base\core\jni\android\graphics目录下定义:

NinePatch.cpp

---->{ "nativeDraw", "(ILandroid/graphics/RectF;I[BIII)V",(void*)SkNinePatchGlue::drawF }, (浮点边界值类型??)

---->{ "nativeDraw", "(ILandroid/graphics/Rect;I[BIII)V", (void*)SkNinePatchGlue::drawI }, (整数边界值类型??)

(4)最终调用skia图形库函数,具体算法有待进一步分析。

(5)drawI 和drawF最终调用的是NinePatchImpl.cpp中的NinePatch_Draw,里面有具体流程,有待分析。

(6)如何判断9.png图片是有区域定义的呢??分析如下:

android/graphics/BitmapFactory.java里面是解析图片流方法类,其中有一行:

private static Bitmap finishDecode(Bitmap bm,Rect outPadding,Options opts)

函数里面有判断是否是9png格式的函数:

final boolean isNinePatch=np!=null&&NinePatch.isNinePatchChunk(np);

跟踪NinePatch.isNinePatchChunk(np)函数,是本地调用,查看frameworks\base\core\jni\android\graphics里面有定义类NinePatch.cpp类,在文件最后定义了isNinePatchChunk方法。这个方法是判断9png格式文件的主要方法。

(7)查看isNinePatchChunk函数有一行:

const Res_png_9patch* chunk =reinterpret_cast<const Res_png_9patch*>(array);

看看Res_png_9patch的定义:

struct Res_png_9patch{  ...    int8_t wasDeserialized;    int8_t numXDivs;    int8_t numYDivs;    int8_t numColors;     // These tell where the next section of a patch starts.    // For example, the first patch includes the pixels from    // 0 to xDivs[0]-1 and the second patch includes the pixels    // from xDivs[0] to xDivs[1]-1.    // Note: allocation/free of these pointers is left to the caller.    int32_t* xDivs;    int32_t* yDivs;    int32_t paddingLeft, paddingRight;    int32_t paddingTop, paddingBottom;    enum {        // The 9 patch segment is not a solid color.        NO_COLOR = 0x00000001,        // The 9 patch segment is completely transparent.        TRANSPARENT_COLOR = 0x00000000    };    // Note: allocation/free of this pointer is left to the caller.    uint32_t* colors;   }
其中开头就定义了是否9png格式。







更多相关文章

  1. Android的电话功能介绍
  2. android横竖屏切换的一点感想
  3. Android与unity交互
  4. Android类加载器源码分析
  5. Android的IPC机制Binder的详解汇总
  6. Android(安卓)命名空间和自定义属性
  7. Android中的自定义主题和样式
  8. Android(安卓)自定义View(API解析+Demo)
  9. Android(安卓)自定义控件打造史上最简单的侧滑菜单

随机推荐

  1. 通过html页面打开Android本地的app
  2. 待验证内容。
  3. Android AIDL进程通信机制详解
  4. Android TextView内容居中和控件居中
  5. android设置button透明度
  6. 关于android 悬浮窗和自启动的设置, 以及
  7. Android模糊处理实现图片毛玻璃效果
  8. android获取内置和外置SD卡路径
  9. Android 自动化测试—robotium(五)Spinner
  10. Android Linux Socket 数据传输错误