CocoStudio:ImageView分析

前端之家收集整理的这篇文章主要介绍了CocoStudio:ImageView分析前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
  1. 在使用CocoStudio做界面时,会大量使用到图片控件(ImageView),
  2. 我们这个来分析一下ImageView的使用:
  3. 1
  4. CocoStudio中,对于图片控件,我们可以通过把模式调整到Custom
  5. 来使用九宫格的方法,在Auto模式下是不能使用九宫格的。
  6.  
  7. 2
  8. 导出json文件ImageView的配置:
  9. {
  10. "classname": "ImageView","name": null,"children": [],"options": {
  11. "__type": "ImageViewSurrogate:#EditorCommon.JsonModel.Component.GUI","classname": "ImageView","name": "Image_9","classType": "CocoStudio.EngineAdapterWrap.CSImageView","fileNameData": {
  12. "path": "dd/04.png",//图片路径
  13. "plistFile": "","resourceType": 0
  14. },"scale9Enable": false,"scale9Height": 43,"scale9Width": 43
  15. }
  16. }
  17. 3
  18. ImageViewReader类,解析上面ImageView生成json对象的类,最终要的一个函数
  19. void ImageViewReader::setPropsFromJsonDictionary(ui::Widget *widget,const rapidjson::Value &options)
  20. {
  21. .....
  22. //jsonPath json文件存放路径,不包括json文件名,只有路径
  23. std::string jsonPath = GUIReader::shareReader()->getFilePath();
  24. ui::ImageView* imageView = (ui::ImageView*)widget;
  25. //resourceType:使用的资源类型,如两种:单独图片文件或者打包成.plist的图片文件
  26. //
  27. const rapidjson::Value& imageFileNameDic = DICTOOL->getSubDictionary_json(options,"fileNameData");
  28. int imageFileNameType = DICTOOL->getIntValue_json(imageFileNameDic,"resourceType");
  29. switch (imageFileNameType)
  30. {
  31. case 0: //单独图片
  32. {
  33. /*
  34. "fileNameData": {
  35. "path": "dd/04.png",//图片
  36. "plistFile": "","resourceType": 0
  37. },*/
  38. std::string tp_i = jsonPath;
  39. //获取资源图片path,并加上jsonPath路径,组成最终的图片全路径;
  40. //所以这里就有一个限制,就是在工程资源中,图片文件一定要和json文件放到同一个目录。
  41. //我们可以通过修改代码的方式屏蔽这个问题。
  42. const char* imageFileName = DICTOOL->getStringValue_json(imageFileNameDic,"path");
  43. const char* imageFileName_tp = NULL;
  44. if (imageFileName && (strcmp(imageFileName,"") != 0))
  45. {
  46. imageFileName_tp = tp_i.append(imageFileName).c_str();
  47. imageView->loadTexture(imageFileName_tp); //这个函数很重要,后面分析
  48. }
  49. break;
  50. }
  51. case 1: //打包的图片
  52. {
  53. /*
  54. "fileNameData": {
  55. "path": "actor_attrFontNormal.png","plistFile": "hero.plist","resourceType": 1
  56. },*/
  57. const char* imageFileName = DICTOOL->getStringValue_json(imageFileNameDic,"path");
  58. //注意:这里imageFileName只是图片path,并没有加上json文件路径
  59. imageView->loadTexture(imageFileName,ui::UI_TEX_TYPE_PLIST);
  60. break;
  61. }
  62. default:
  63. break;
  64. }
  65. //九宫格相关
  66. bool scale9EnableExist = DICTOOL->checkObjectExist_json(options,"scale9Enable");
  67. bool scale9Enable = false;
  68. if (scale9EnableExist)
  69. {
  70. scale9Enable = DICTOOL->getBooleanValue_json(options,"scale9Enable");
  71. }
  72. imageView->setScale9Enabled(scale9Enable);
  73. if (scale9Enable)
  74. {
  75. ......
  76. imageView->setCapInsets(CCRectMake(cx,cy,cw,ch));
  77. }
  78. WidgetReader::setColorPropsFromJsonDictionary(widget,options);
  79. }
  80.  
  81. 4、上面有一个loadTexture函数,这个函数很重要:
  82. loadTexture函数ImageView类的成员函数
  83. 参数:
  84. fileName图片文件
  85. texType文件类型,按照我们上面的分析,总共有两种
  86. typedef enum
  87. {
  88. UI_TEX_TYPE_LOCAL,UI_TEX_TYPE_PLIST
  89. }TextureResType;
  90.  
  91. void ImageView::loadTexture(const char *fileName,TextureResType texType)
  92. {
  93. if (!fileName || strcmp(fileName,"") == 0)
  94. {
  95. return;
  96. }
  97. _textureFile = fileName;
  98. _imageTexType = texType;
  99. switch (_imageTexType)
  100. {
  101. case UI_TEX_TYPE_LOCAL://单个图片文件
  102. if (_scale9Enabled) 如果使用九宫格,则使用CCScale9Sprite*
  103. {
  104. extension::CCScale9Sprite* imageRendererScale9 = STATIC_CAST_SCALE9SPRITE;
  105. imageRendererScale9->initWithFile(fileName);
  106. imageRendererScale9->setCapInsets(_capInsets);
  107. }
  108. else //如果不是九宫格,则使用CCSprite*
  109. {
  110. //#define STATIC_CAST_CCSPRITE static_cast<CCSprite*>(_imageRenderer)
  111. //其实ImageView就是包含了一个CCSprite*成员变量_imageRenderer,
  112. //真正显示图片的是这个成员变量。
  113. /*
  114. bool CCSprite::initWithFile(const char *pszFilename)
  115. {
  116. CCAssert(pszFilename != NULL,"Invalid filename for sprite");
  117. //这里会根据我们传进来的图片路径,去加载纹理。
  118. CCTexture2D *pTexture = CCTextureCache::sharedTextureCache()->addImage(pszFilename);
  119. if (pTexture)
  120. {
  121. CCRect rect = CCRectZero;
  122. rect.size = pTexture->getContentSize();
  123. return initWithTexture(pTexture,rect);
  124. }
  125.  
  126. // don't release here.
  127. // when load texture Failed,it's better to get a "transparent" sprite than a crashed program
  128. // this->release();
  129. return false;
  130. }
  131. */
  132. CCSprite* imageRenderer = STATIC_CAST_CCSPRITE;
  133. imageRenderer->initWithFile(fileName);
  134. }
  135. break;
  136. case UI_TEX_TYPE_PLIST://.plist图片文件
  137. if (_scale9Enabled)
  138. {
  139. extension::CCScale9Sprite* imageRendererScale9 = STATIC_CAST_SCALE9SPRITE;
  140. imageRendererScale9->initWithSpriteFrameName(fileName);
  141. imageRendererScale9->setCapInsets(_capInsets);
  142. }
  143. else
  144. {
  145. //如果是.plist格式的图片文件,则使用initWithSpriteFrameName方法初始化
  146. //使用这种方法就需要提前把.plist文件加载进来。
  147. /*
  148. bool CCSprite::initWithSpriteFrameName(const char *pszSpriteFrameName)
  149. {
  150. CCAssert(pszSpriteFrameName != NULL,"");
  151.  
  152. CCSpriteFrame *pFrame = CCSpriteFrameCache::sharedSpriteFrameCache()->spriteFrameByName(pszSpriteFrameName);
  153. return initWithSpriteFrame(pFrame);
  154. }
  155. */
  156. CCSprite* imageRenderer = STATIC_CAST_CCSPRITE;
  157. imageRenderer->initWithSpriteFrameName(fileName);
  158. }
  159. break;
  160. default:
  161. break;
  162. }
  163. _imageTextureSize = _imageRenderer->getContentSize();
  164. imageTextureScaleChangedWithSize();
  165. updateAnchorPoint();
  166. updateFlippedX();
  167. updateFlippedY();
  168. updateRGBAToRenderer(_imageRenderer);
  169. }

猜你在找的Cocos2d-x相关文章