CocoStudio:ImageView分析

来源:互联网 发布:linux 删除文件 api 编辑:程序博客网 时间:2024/06/05 15:17

<span style="font-size:14px;">在使用CocoStudio做界面时,会大量使用到图片控件(ImageView),我们这个来分析一下ImageView的使用:1、在CocoStudio中,对于图片控件,我们可以通过把模式调整到Custom,来使用九宫格的方法,在Auto模式下是不能使用九宫格的。2、导出json文件中ImageView的配置:{        "classname": "ImageView",        "name": null,        "children": [],        "options": {          "__type": "ImageViewSurrogate:#EditorCommon.JsonModel.Component.GUI",          "classname": "ImageView",          "name": "Image_9",          "classType": "CocoStudio.EngineAdapterWrap.CSImageView",                   "fileNameData": {            "path": "dd/04.png", //图片路径            "plistFile": "",            "resourceType": 0          },          "scale9Enable": false,          "scale9Height": 43,          "scale9Width": 43        }      }3、ImageViewReader类,解析上面ImageView生成json对象的类,最终要的一个函数:void ImageViewReader::setPropsFromJsonDictionary(ui::Widget *widget, const rapidjson::Value &options){    .....    //jsonPath json文件存放路径,不包括json文件名,只有路径    std::string jsonPath = GUIReader::shareReader()->getFilePath();        ui::ImageView* imageView = (ui::ImageView*)widget;        //resourceType:使用的资源类型,如两种:单独图片文件或者打包成.plist的图片文件    //    const rapidjson::Value& imageFileNameDic = DICTOOL->getSubDictionary_json(options, "fileNameData");    int imageFileNameType = DICTOOL->getIntValue_json(imageFileNameDic, "resourceType");    switch (imageFileNameType)    {        case 0: //单独图片        {    /*    "fileNameData": {    "path": "dd/04.png", //图片名    "plistFile": "",    "resourceType": 0            },    */            std::string tp_i = jsonPath;    //获取资源图片path,并加上jsonPath路径,组成最终的图片全路径;    //所以这里就有一个限制,就是在工程资源中,图片文件一定要和json文件放到同一个目录。    //我们可以通过修改代码的方式屏蔽这个问题。            const char* imageFileName = DICTOOL->getStringValue_json(imageFileNameDic, "path");            const char* imageFileName_tp = NULL;            if (imageFileName && (strcmp(imageFileName, "") != 0))            {                imageFileName_tp = tp_i.append(imageFileName).c_str();                imageView->loadTexture(imageFileName_tp); //这个函数很重要,后面分析            }            break;        }        case 1: //打包的图片        {            /*"fileNameData": {                    "path": "actor_attrFontNormal.png",                    "plistFile": "hero.plist",                    "resourceType": 1                  },        */            const char* imageFileName = DICTOOL->getStringValue_json(imageFileNameDic, "path");    //注意:这里imageFileName只是图片path,并没有加上json文件路径            imageView->loadTexture(imageFileName, ui::UI_TEX_TYPE_PLIST);            break;        }        default:            break;    }        //九宫格相关    bool scale9EnableExist = DICTOOL->checkObjectExist_json(options, "scale9Enable");    bool scale9Enable = false;    if (scale9EnableExist)    {        scale9Enable = DICTOOL->getBooleanValue_json(options, "scale9Enable");    }    imageView->setScale9Enabled(scale9Enable);        if (scale9Enable)    {        ......        imageView->setCapInsets(CCRectMake(cx, cy, cw, ch));       }        WidgetReader::setColorPropsFromJsonDictionary(widget, options);}4、上面有一个loadTexture函数,这个函数很重要:loadTexture函数是ImageView类的成员函数:参数:fileName:图片文件名texType:文件类型,按照我们上面的分析,总共有两种typedef enum{    UI_TEX_TYPE_LOCAL,    UI_TEX_TYPE_PLIST}TextureResType;void ImageView::loadTexture(const char *fileName, TextureResType texType){    if (!fileName || strcmp(fileName, "") == 0)    {        return;    }    _textureFile = fileName;    _imageTexType = texType;    switch (_imageTexType)    {        case UI_TEX_TYPE_LOCAL://单个图片文件            if (_scale9Enabled) 如果使用九宫格,则使用CCScale9Sprite*            {                extension::CCScale9Sprite* imageRendererScale9 = STATIC_CAST_SCALE9SPRITE;                imageRendererScale9->initWithFile(fileName);                imageRendererScale9->setCapInsets(_capInsets);            }            else //如果不是九宫格,则使用CCSprite*            {        //#define STATIC_CAST_CCSPRITE static_cast<CCSprite*>(_imageRenderer)//其实ImageView就是包含了一个CCSprite*成员变量_imageRenderer,//真正显示图片的是这个成员变量。/*bool CCSprite::initWithFile(const char *pszFilename){    CCAssert(pszFilename != NULL, "Invalid filename for sprite");                            //这里会根据我们传进来的图片路径,去加载纹理。    CCTexture2D *pTexture = CCTextureCache::sharedTextureCache()->addImage(pszFilename);    if (pTexture)    {CCRect rect = CCRectZero;rect.size = pTexture->getContentSize();return initWithTexture(pTexture, rect);    }    // don't release here.    // when load texture failed, it's better to get a "transparent" sprite than a crashed program    // this->release();     return false;}*/                CCSprite* imageRenderer = STATIC_CAST_CCSPRITE;                imageRenderer->initWithFile(fileName);            }            break;         case UI_TEX_TYPE_PLIST://.plist图片文件            if (_scale9Enabled)            {                extension::CCScale9Sprite* imageRendererScale9 = STATIC_CAST_SCALE9SPRITE;                imageRendererScale9->initWithSpriteFrameName(fileName);                imageRendererScale9->setCapInsets(_capInsets);            }            else            {        //如果是.plist格式的图片文件,则使用initWithSpriteFrameName方法初始化//使用这种方法就需要提前把.plist文件加载进来。/*bool CCSprite::initWithSpriteFrameName(const char *pszSpriteFrameName){    CCAssert(pszSpriteFrameName != NULL, "");    CCSpriteFrame *pFrame = CCSpriteFrameCache::sharedSpriteFrameCache()->spriteFrameByName(pszSpriteFrameName);    return initWithSpriteFrame(pFrame);}*/                CCSprite* imageRenderer = STATIC_CAST_CCSPRITE;                imageRenderer->initWithSpriteFrameName(fileName);            }            break;        default:            break;    }    _imageTextureSize = _imageRenderer->getContentSize();    imageTextureScaleChangedWithSize();    updateAnchorPoint();    updateFlippedX();    updateFlippedY();    updateRGBAToRenderer(_imageRenderer);}</span>



源引:http://blog.csdn.net/tianxiawuzhei/article/details/45849439

0 0