• Cocos2d-x串算出Size方法


    项目需要,根据所输入的字符串,的需要计算串帐户Size。

    包代码如下面。只需要传递一个字符串,您可以返回Size:

    Size ChartDemoScene::calculateFontSize(const char *str )
    {
    	std::string tempString = str;
    	log("tempString = %s",tempString.c_str());
    	size_t computeCount = tempString.size();       //假设字符串非常长每次抽取100个字符来计算size;
    	Size size = Size(0,0);
    	for (int i = 0; i<computeCount ;)
    	{
            std::string substring =  tempString.substr(i,1);
    		if ((substring.c_str()[0] & 0x80 )!=0) //是汉字
    		{
    			substring = tempString.substr(i , 3);
    			i += 3;
    		}
    		else
    		{
    			i++;
    		}
    		//CCLog("subString  = %s ",substring.c_str());
            auto tempLabel = LabelTTF::create(substring.c_str(),"",25);
            tempLabel->setHorizontalAlignment(cocos2d::TextHAlignment::LEFT);
    		Size tmpLsize = tempLabel->getContentSize();
    		size.width+=tmpLsize.width;
    	}
        
    	float fHeight= 0;
    	if( size.width > chartWidth)//大于容器的宽度
    	{
            fHeight = (size.width / 200 );//计算须要多少行
    	}
    	int nHeight =  ceil(fHeight);
    	
    	if (nHeight == 0)
    	{
    		nHeight = 1;
    	}
        
    	Size labelSize ;
    	if (size.width < chartWidth)
    	{
    		labelSize = Size(size.width,nHeight*32);//计算容器的Size
    	}
    	else
    	{
            labelSize = Size(chartWidth,nHeight*28);
    	}
    	
    	//CCLog("labelSize = (%f, %f)",labelSize.width ,labelSize.height);
    	//CCLog("fHeight = %f  nHeight = %d " ,fHeight ,nHeight);
    	return labelSize;
    }

    样例:

    1、AppDelegate.cpp中加入例如以下代码

    auto scene = ChartDemoScene::createScene();
    
        // run
        director->runWithScene(scene);
    
    (1)ChartDemoScene.hChartDemoScene.h
    //
    //  ChartDemoScene.h
    //  chartDemo
    //
    //  Created by chen on 14-9-2.
    //
    //
    
    #ifndef __chartDemo__ChartDemoScene__
    #define __chartDemo__ChartDemoScene__
    
    #include "cocos2d.h"
    #include "ui/CocosGUI.h"
    #include "../cocos2d/extensions/cocos-ext.h"
    using namespace cocos2d::ui;
    USING_NS_CC;
    USING_NS_CC_EXT;
    
    class ChartDemoScene : public cocos2d::Layer//,public cocos2d::extension::EditBoxDelegate
    {
    public:
        // there's no 'id' in cpp, so we recommend returning the class instance pointer
        static cocos2d::Scene* createScene();
        
        // Here's a difference. Method 'init' in cocos2d-x returns bool, instead of returning 'id' in cocos2d-iphone
        virtual bool init();
        
        // a selector callback
        void menuCloseCallback(cocos2d::Ref* pSender);
        
        // implement the "static create()" method manually
        CREATE_FUNC(ChartDemoScene);
        
    //    virtual void editBoxEditingDidBegin(cocos2d::extension::EditBox* editBox);
    //    virtual void editBoxEditingDidEnd(cocos2d::extension::EditBox* editBox);
    //    virtual void editBoxTextChanged(cocos2d::extension::EditBox* editBox, const std::string& text);
    //    virtual void editBoxReturn(cocos2d::extension::EditBox* editBox);
    
        void touchEvent(Ref *pSender, Widget::TouchEventType type);
        void textFieldEvent(Ref* pSender, TextField::EventType type);
        void showAlertShow(std::string contentString);
        void alertCallback(ui::Text* alert);
        
        Size calculateFontSize(const char *str);
        
        std::string getcurrTime();//获取当前年月日
        std::string getcurrMonthTime();//获取时分秒
    
    //    EditBox* editText;
        TextField* editText;
        Text* text;
        TextField* _text;//获取被删除Item的内容
        std::string file_path;//存放消息记录
        TextField* textContent;
        ui::Button* sendBtn;
        std::string str;
        Size winSize;
        float chartWidth;
        size_t length;
        ui::ListView* _listView;
        
    };
    #endif /* defined(__chartDemo__ChartDemoScene__) */
    

    (2)ChartDemoScene.cpp

    #include "ChartDemoScene.h"
    #include "stdio.h"
    
    enum alertTag
    {
        Alert_Tag = 1000
        
    }AlertTag;
    
    enum textTag
    {
        T_Tag = 100
    }TextTag;
    
    USING_NS_CC;
    int count = 1;
    int _rem = 0;
    Scene* ChartDemoScene::createScene()
    {
        // 'scene' is an autorelease object
        auto scene = Scene::create();
        scene->setColor(Color3B::BLACK);
        // 'layer' is an autorelease object
        auto layer = ChartDemoScene::create();
        layer->setAnchorPoint(Vec2::ANCHOR_MIDDLE_BOTTOM);
        layer->setContentSize(Size(640,960));
        // add layer as a child to scene
        scene->addChild(layer);
        
        // return the scene
        return scene;
    }
    
    // on "init" you need to initialize your instance
    bool ChartDemoScene::init()
    {
        bool bRet = false;
        do{
            CC_BREAK_IF(!Layer::init());
            //大背景
            winSize = Director::getInstance()->getWinSize();
            file_path = FileUtils::getInstance()->getWritablePath() + "chartContent.txt";
            
            chartWidth = winSize.width *3 / 5;
            auto sprite = Sprite::create("orange_edit.png");
            sprite->setScaleX(winSize.width / sprite->getContentSize().width);
            sprite->setScaleY(winSize.height / sprite->getContentSize().height);
            sprite->setAnchorPoint(Vec2::ANCHOR_MIDDLE);
            sprite->setPosition(Vec2(winSize.width/2,winSize.height/2));
            addChild(sprite);
            
            auto layerColor = LayerColor::create(Color4B(43, 177, 233, 255));
            layerColor->setContentSize(Size(winSize.width,100));
            layerColor->ignoreAnchorPointForPosition(false);
            layerColor->setAnchorPoint(Vec2::ANCHOR_MIDDLE_TOP);
            layerColor->setPosition(Vec2(winSize.width/2,winSize.height));
            addChild(layerColor,4);
            
            //底部输入栏
            auto layout = Layout::create();
            layout->setSize(Size(winSize.width,100));
            layout->setAnchorPoint(Vec2::ZERO);
            layout->setPosition(Vec2::ZERO);
            layout->setBackGroundColorType(cocos2d::ui::Layout::BackGroundColorType::SOLID);
            layout->setBackGroundColor(Color3B(185,185,185));
            //消息显示栏
            _listView = ListView::create();
            _listView->setDirection(ui::ScrollView::Direction::VERTICAL);
            _listView->setTouchEnabled(true);
            _listView->setBounceEnabled(true);
            _listView->setGravity(cocos2d::ui::ListView::Gravity::BOTTOM);
    //        _listView->setItemsMargin(2);
            _listView->setBackGroundColorType(cocos2d::ui::Layout::BackGroundColorType::SOLID);
            _listView->setBackGroundColor(Color3B::WHITE);
            _listView->setSize(Size(winSize.width,winSize.height-layout->getSize().height-25-100));
            _listView->setAnchorPoint(Vec2::ANCHOR_MIDDLE_BOTTOM);
            _listView->setPosition(Vec2(winSize.width/2,layout->getSize().height+25));
            addChild(_listView);
            
            //底部输入框背景
            auto bg = Sprite::create("whitebg.png");
            bg->setScaleX(winSize.width*3/5 / bg->getContentSize().width);
            bg->setScaleY(80 / bg->getContentSize().height);
            bg->setAnchorPoint(Vec2::ANCHOR_MIDDLE_LEFT);
            bg->setPosition(Vec2(winSize.width/5,layout->getSize().height/2));
            layout->addChild(bg);
            
            //
            editText = TextField::create("","",30);
            editText->ignoreContentAdaptWithSize(false);
            editText->setSize(Size(winSize.width*3/5,80));
            editText->setTextHorizontalAlignment(cocos2d::TextHAlignment::LEFT);
            editText->setTextVerticalAlignment(cocos2d::TextVAlignment::BOTTOM);
            editText->setAnchorPoint(Vec2::ANCHOR_MIDDLE_LEFT);
            editText->setPosition(Vec2(winSize.width/5,layout->getSize().height/2));
            editText->setColor(Color3B::BLACK);
            editText->addEventListener(CC_CALLBACK_2(ChartDemoScene::textFieldEvent, this));
            layout->addChild(editText);
            addChild(layout);
            
            //发送按钮
            sendBtn = ui::Button::create("orange_edit.png");
            sendBtn->setAnchorPoint(Vec2::ANCHOR_MIDDLE_RIGHT);
            sendBtn->setPosition(Vec2(winSize.width - 20,layout->getSize().height/2));
            addChild(sendBtn);
            
            sendBtn->addTouchEventListener(CC_CALLBACK_2(ChartDemoScene::touchEvent,this));
            
            auto alert_Text = ui::Text::create();
            alert_Text->setSize(Size(50, 200));
            alert_Text->setTag(Alert_Tag);
            alert_Text->setOpacity(0);
            alert_Text->setFontSize(35);
            char* userdata = "11";
            alert_Text->setUserData(userdata);
            alert_Text->setColor(Color3B::BLACK);
            alert_Text->setPosition(Vec2(winSize.width/2,winSize.height/8));
            addChild(alert_Text);
    
            bRet = true;
        }while(0);
        return bRet;
    }
    
    Size ChartDemoScene::calculateFontSize(const char *str )
    {
    	std::string tempString = str;
    	log("tempString = %s",tempString.c_str());
    	size_t computeCount = tempString.size();       //假设字符串非常长每次抽取100个字符来计算size;
    	Size size = Size(0,0);
    	for (int i = 0; i<computeCount ;)
    	{
            std::string substring =  tempString.substr(i,1);
    		if ((substring.c_str()[0] & 0x80 )!=0) //是汉字
    		{
    			substring = tempString.substr(i , 3);
    			i += 3;
    		}
    		else
    		{
    			i++;
    		}
    		//CCLog("subString  = %s ",substring.c_str());
            auto tempLabel = LabelTTF::create(substring.c_str(),"",25);
            tempLabel->setHorizontalAlignment(cocos2d::TextHAlignment::LEFT);
    		Size tmpLsize = tempLabel->getContentSize();
    		size.width+=tmpLsize.width;
    	}
        
    	float fHeight= 0;
    	if( size.width > chartWidth)
    	{
            fHeight = (size.width / 200 );
    	}
    	int nHeight =  ceil(fHeight);
    	
    	if (nHeight == 0)
    	{
    		nHeight = 1;
    	}
        
    	Size labelSize ;
    	if (size.width < chartWidth)
    	{
    		labelSize = Size(size.width,nHeight*32);
    	}
    	else
    	{
            labelSize = Size(chartWidth,nHeight*28);
    	}
    	
    	//CCLog("labelSize = (%f, %f)",labelSize.width ,labelSize.height);
    	//CCLog("fHeight = %f  nHeight = %d " ,fHeight ,nHeight);
    	return labelSize;
    }
    
    void ChartDemoScene::touchEvent(cocos2d::Ref *pSender, Widget::TouchEventType type)
    {
        switch (type) {
            case ui::Widget::TouchEventType::ENDED:
            {
                if(str.empty())
                {
                    showAlertShow("输入内容不能为空");
                    break;
                }
                
                log("str = %s",str.c_str());
                
                auto time = getcurrMonthTime().c_str();
                auto text = Text::create(time, "", 30);
                text->setAnchorPoint(Vec2::ANCHOR_MIDDLE);
                text->setColor(Color3B::BLACK);
                
                auto _timeLayout = Layout::create();
                _timeLayout->setSize(Size(_listView->getSize().width,60));
                _timeLayout->setLayoutType(cocos2d::ui::Layout::Type::RELATIVE);
                
                auto rp_time = RelativeLayoutParameter::create();
                rp_time->setAlign(cocos2d::ui::RelativeLayoutParameter::RelativeAlign::CENTER_IN_PARENT);
                text->setLayoutParameter(rp_time);
                _timeLayout->addChild(text);
                _listView->pushBackCustomItem(_timeLayout);
                
                if(count % 2)
               {
                    count++;
                    auto _lLayout = Layout::create();
                    _lLayout->setSize(Size(_listView->getSize().width,80));
                    _lLayout->setLayoutType(cocos2d::ui::Layout::Type::RELATIVE);
                   
                   auto _lHeader = ui::ImageView::create("logo_douban.png");
                   _lHeader->setAnchorPoint(Vec2::ANCHOR_MIDDLE);
                   _lHeader->setScale(0.5);
                   
                   auto rp_l = RelativeLayoutParameter::create();
                   rp_l->setMargin(Margin(10,0,0,0));
                   rp_l->setRelativeName("head");
                   rp_l->setAlign(cocos2d::ui::RelativeLayoutParameter::RelativeAlign::PARENT_LEFT_CENTER_VERTICAL);
                   _lHeader->setLayoutParameter(rp_l);
                   _lLayout->addChild(_lHeader);
                   
                    auto _lTextContent = TextField::create("","",30);
                    _lTextContent->ignoreContentAdaptWithSize(false);
                   auto size = calculateFontSize(str.c_str());
                   _lTextContent->setSize(size);
                   _lTextContent->setTextHorizontalAlignment(cocos2d::TextHAlignment::LEFT);
    
                   if(size.width < chartWidth)
                   {
                       _lTextContent->setTextHorizontalAlignment(cocos2d::TextHAlignment::RIGHT);
                   }
                    _lTextContent->setTextVerticalAlignment(cocos2d::TextVAlignment::CENTER);
                    _lTextContent->setTouchEnabled(false);
                   _lTextContent->setTag(T_Tag);
                    _lTextContent->setAnchorPoint(Vec2::ANCHOR_MIDDLE_LEFT);
                    _lTextContent->setColor(Color3B::BLACK);
                    _lTextContent->setText(str);
                   _lLayout->addChild(_lTextContent);
                   str.clear();
                   
                   auto rp_t = RelativeLayoutParameter::create();
                   rp_t->setMargin(Margin(10,0,0,0));
                   rp_t->setRelativeToWidgetName("head");
                   rp_t->setAlign(cocos2d::ui::RelativeLayoutParameter::RelativeAlign::LOCATION_RIGHT_OF_CENTER);
                   _lTextContent->setLayoutParameter(rp_t);
                   
                   _listView->pushBackCustomItem(_lLayout);
                   
               }else
               {
                   count++;
                    auto _rLayout = Layout::create();
                    _rLayout->setSize(Size(_listView->getSize().width,80));
                    _rLayout->setLayoutType(cocos2d::ui::Layout::Type::RELATIVE);
                   
                   auto _rHeader = ui::ImageView::create("logo_mingdao.png");
                   _rHeader->setAnchorPoint(Vec2::ANCHOR_MIDDLE);
                   _rHeader->setScale(0.5);
                   
                   auto rp_r = RelativeLayoutParameter::create();
                   rp_r->setMargin(Margin(0,0,10,0));
                   rp_r->setRelativeName("head");
                   rp_r->setAlign(cocos2d::ui::RelativeLayoutParameter::RelativeAlign::PARENT_RIGHT_CENTER_VERTICAL);
                   _rHeader->setLayoutParameter(rp_r);
                   _rLayout->addChild(_rHeader);
    
                   
                    auto _rTextContent = TextField::create("","",30);
                   _rTextContent->setTag(T_Tag);
                    _rTextContent->ignoreContentAdaptWithSize(false);
                   auto size = calculateFontSize(str.c_str());
                   _rTextContent->setSize(size);
                   _rTextContent->setTextHorizontalAlignment(cocos2d::TextHAlignment::LEFT);
                    _rTextContent->setTextVerticalAlignment(cocos2d::TextVAlignment::CENTER);
                    _rTextContent->setTouchEnabled(false);
                    _rTextContent->setAnchorPoint(Vec2::ANCHOR_MIDDLE_RIGHT);
                    _rTextContent->setColor(Color3B::BLACK);
                    _rTextContent->setText(str);
                   str.clear();
                   auto rp_l = RelativeLayoutParameter::create();
                   rp_l->setMargin(Margin(0,0,10,0));
                   rp_l->setRelativeToWidgetName("head");
                   rp_l->setAlign(cocos2d::ui::RelativeLayoutParameter::RelativeAlign::LOCATION_LEFT_OF_CENTER);
                   _rTextContent->setLayoutParameter(rp_l);
                   _rLayout->addChild(_rTextContent);
                   
                   _listView->pushBackCustomItem(_rLayout);
               }
                
    
    //            if(_listView->getContentSize().height > _listView->getSize().height)
    //            {
                    _listView->scrollToBottom(0.5, true);
    //            }
                editText->setText("");
                
                if(count > 3 )
                {
                    _listView->removeItem(0);//删除时间标签,此时Item(0)就是内容标签
                    auto temp = static_cast<Layout*>(_listView->getItem(0));//获取当前内容标签
                    if(_text)
                    {
                        removeChild(_text);
                    }
                    _text = static_cast<TextField*>(temp->getChildByTag(T_Tag));//获取内容标签
                    log("string = %s", _text->getStringValue().c_str());//获取内容
                    log("file_path = %s",file_path.c_str());
                    FILE* fp = std::fopen(file_path.c_str(),"at+");
                    CCASSERT(fp != NULL, "file open error");
                    length = _text->getStringValue().length();
                    log("length = %lu",length);
                    fwrite(_text->getStringValue().c_str(), length, 1, fp);
                    fclose(fp);
                    
                    _listView->removeItem(0);
                }
    
                break;
            }
            default:
                break;
        }
    }
    
    void ChartDemoScene::textFieldEvent(cocos2d::Ref *pSender, TextField::EventType type)
    {
        switch (type)
        {
            case TextField::EventType::ATTACH_WITH_IME:
            {
                TextField* textField = dynamic_cast<TextField*>(pSender);
                Size widgetSize = winSize;
                runAction(CCMoveTo::create(0.225f,Vec2(0, widgetSize.height / 2.0f)));
                textField->setTextHorizontalAlignment(TextHAlignment::LEFT);
                textField->setTextVerticalAlignment(TextVAlignment::TOP);
            }
                break;
                
            case TextField::EventType::DETACH_WITH_IME:
            {
                TextField* textField = dynamic_cast<TextField*>(pSender);
                Size widgetSize = winSize;
                runAction(CCMoveTo::create(0.175f, Vec2(0, 0)));
                textField->setTextHorizontalAlignment(TextHAlignment::LEFT);
                textField->setTextVerticalAlignment(TextVAlignment::CENTER);
                
                str = editText->getStringValue().c_str();
                str += "
    ";
            }
                break;
                
            case TextField::EventType::INSERT_TEXT:
                break;
                
            case TextField::EventType::DELETE_BACKWARD:
                break;
                
            default:
                break;
        }
    
    }
    
    void ChartDemoScene::showAlertShow(std::string contentString)
    {
        auto alert = dynamic_cast<ui::Text*>(getChildByTag(Alert_Tag));
        if (alert->getUserData() == "11") {
            alert->setOpacity(255);
            char* userdata = "110";
            alert->setUserData(userdata);
            
            alert->setString(contentString);
            auto call_func = CallFunc::create(CC_CALLBACK_0(ChartDemoScene::alertCallback, this,alert));
            auto seq = Sequence::create(FadeOut::create(1.0f),call_func, NULL);
            alert->runAction(seq);
        }
        
    }
    
    void ChartDemoScene::alertCallback(ui::Text* alert)
    {
        
        alert->setString("");
        char* userdata = "11";
        alert->setUserData(userdata);
        
    }
    
    std::string ChartDemoScene::getcurrTime()//获取当前年月日
    {
        
    #if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID || CC_TARGET_PLATFORM == CC_PLATFORM_IOS)
        
        struct timeval now;
        struct tm* time;
        
        gettimeofday(&now, NULL);
        
        
        time = localtime(&now.tv_sec);
        int year = time->tm_year + 1900;
        
        char date[32] = {0};
        sprintf(date, "%d-%02d-%02d",(int)time->tm_year + 1900,(int)time->tm_mon + 1,(int)time->tm_mday);
        return StringUtils::format("%s",date);
        
    #endif
        
    #if ( CC_TARGET_PLATFORM == CC_PLATFORM_WIN32 )
        
        struct tm* tm;
        time_t timep;
        time(timep);
        
        tm = localtime(&timep);
        char date[32] = {0};
        sprintf(date, "%d-%02d-%02d",(int)time->tm_year + 1900,(int)time->tm_mon + 1,(int)time->tm_mday);
        return StringUtils::format("%s",date);
        
    #endif
        
    }
    
    std::string ChartDemoScene::getcurrMonthTime()
    {
    #if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID || CC_TARGET_PLATFORM == CC_PLATFORM_IOS)
        
        struct timeval now;
        struct tm* time;
        
        gettimeofday(&now, NULL);
        
        
        time = localtime(&now.tv_sec);
        int year = time->tm_year + 1900;
        log("year = %d",year);
        
        char date1[24] = {0};
        char date[8] = {0};
        sprintf(date1, "%d:%02d:%02d:%02d:%02d:%02d",(int)time->tm_year + 1900,(int)time->tm_mon + 1,(int)time->tm_mday,time->tm_hour,time->tm_min,time->tm_sec);
        sprintf(date, "%02d:%02d",time->tm_hour,time->tm_min);
        return StringUtils::format("%s",date);
        
    #endif
        
    #if ( CC_TARGET_PLATFORM == CC_PLATFORM_WIN32 )
        
        struct tm* tm;
        time_t timep;
        time(timep);
        
        tm = localtime(&timep);
        char date[32] = {0};
        sprintf(date, "%d-%02d-%02d",(int)time->tm_year + 1900,(int)time->tm_mon + 1,(int)time->tm_mday);
        return StringUtils::format("%s",date);
        
    #endif
        
    }
    
    
    void ChartDemoScene::menuCloseCallback(Ref* pSender)
    {
    #if (CC_TARGET_PLATFORM == CC_PLATFORM_WP8) || (CC_TARGET_PLATFORM == CC_PLATFORM_WINRT)
    	MessageBox("You pressed the close button. Windows Store Apps do not implement a close button.","Alert");
        return;
    #endif
        
        Director::getInstance()->end();
        
    #if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS)
        exit(0);
    #endif
    }




    版权声明:本文博客原创文章,博客,未经同意,不得转载。

  • 相关阅读:
    java 新建文件夹保存
    android AppWidgwtProvider学习
    GPS定位
    android ContentProvider学习
    Android 解屏幕锁与点亮屏幕(来电时效果)
    RecyclerView 分页滑动,设置可以滑动下一页,下一个item作为起点方法
    Glide 加载图片 到动态ImageView
    一个例子了解 HandlerThread,Looper,ThreadLocal,Handler,MessageQueue,Message的关系
    android TabLayout 相关
    屏幕相关
  • 原文地址:https://www.cnblogs.com/lcchuguo/p/4613177.html
Copyright © 2020-2023  润新知