cocos2d-x RichText 真实高度
2015-11-25 17:37
519 查看
cocos2d-x版本 3.8
在RichText自动换行后,发现不能得到真实高度,查看源码发现算出了实际高度,但确没用上,都多少个版本了,还没完善
只有自己动手了
在RichText.h中加
在RichText.cpp中改formarRenderers()
再实现
OK了,实际高度有了,发现getReaderSize()还是不对,继续查源码
发现adaptRenderers()是在Widget的visit()里调用的,也就是说当前桢不会被调用,这就好办了,在RichText pushBackElement 之后显示的调用一下formatText()就OK了,
在RichText自动换行后,发现不能得到真实高度,查看源码发现算出了实际高度,但确没用上,都多少个版本了,还没完善
void RichText::formarRenderers() { if (_ignoreSize) { float newContentSizeWidth = 0.0f; float newContentSizeHeight = 0.0f; Vector<Node*>* row = (_elementRenders[0]); float nextPosX = 0.0f; for (ssize_t j=0; j<row->size(); j++) { Node* l = row->at(j); l->setAnchorPoint(Vec2::ZERO); l->setPosition(nextPosX, 0.0f); this->addProtectedChild(l, 1); Size iSize = l->getContentSize(); newContentSizeWidth += iSize.width; newContentSizeHeight = MAX(newContentSizeHeight, iSize.height); nextPosX += iSize.width; } this->setContentSize(Size(newContentSizeWidth, newContentSizeHeight)); } else { float newContentSizeHeight = 0.0f; float *maxHeights = new float[_elementRenders.size()]; for (size_t i=0; i<_elementRenders.size(); i++) { Vector<Node*>* row = (_elementRenders[i]); float maxHeight = 0.0f; for (ssize_t j=0; j<row->size(); j++) { Node* l = row->at(j); maxHeight = MAX(l->getContentSize().height, maxHeight); } maxHeights[i] = maxHeight; newContentSizeHeight += maxHeights[i];//这里 算出了实际高度,但确没用上 } float nextPosY = _customSize.height; for (size_t i=0; i<_elementRenders.size(); i++) { Vector<Node*>* row = (_elementRenders[i]); float nextPosX = 0.0f; nextPosY -= (maxHeights[i] + _verticalSpace); for (ssize_t j=0; j<row->size(); j++) { Node* l = row->at(j); l->setAnchorPoint(Vec2::ZERO); l->setPosition(nextPosX, nextPosY); this->addProtectedChild(l, 1); nextPosX += l->getContentSize().width; } } delete [] maxHeights; } size_t length = _elementRenders.size(); for (size_t i = 0; i<length; i++) { Vector<Node*>* l = _elementRenders[i]; l->clear(); delete l; } _elementRenders.clear(); if (_ignoreSize) { Size s = getVirtualRendererSize(); this->setContentSize(s); } else { this->setContentSize(_customSize); } updateContentSizeWithTextureSize(_contentSize); }
只有自己动手了
在RichText.h中加
Size _renderSize; Size& getRenderSize(); void setRenderSize(const Size &size);
在RichText.cpp中改formarRenderers()
void RichText::formarRenderers() { if (_ignoreSize) { float newContentSizeWidth = 0.0f; float newContentSizeHeight = 0.0f; Vector<Node*>* row = (_elementRenders[0]); float nextPosX = 0.0f; for (ssize_t j=0; j<row->size(); j++) { Node* l = row->at(j); l->setAnchorPoint(Vec2::ZERO); l->setPosition(nextPosX, 0.0f); this->addProtectedChild(l, 1); Size iSize = l->getContentSize(); newContentSizeWidth += iSize.width; newContentSizeHeight = MAX(newContentSizeHeight, iSize.height); nextPosX += iSize.width; } this->setContentSize(Size(newContentSizeWidth, newContentSizeHeight)); this->setRenderSize(Size(newContentSizeWidth, newContentSizeHeight)); //这里加一行 } else { float newContentSizeHeight = 0.0f; float *maxHeights = new float[_elementRenders.size()]; for (size_t i=0; i<_elementRenders.size(); i++) { Vector<Node*>* row = (_elementRenders[i]); float maxHeight = 0.0f; for (ssize_t j=0; j<row->size(); j++) { Node* l = row->at(j); maxHeight = MAX(l->getContentSize().height, maxHeight); } maxHeights[i] = maxHeight; newContentSizeHeight += maxHeights[i]; } float nextPosY = _customSize.height; for (size_t i=0; i<_elementRenders.size(); i++) { Vector<Node*>* row = (_elementRenders[i]); float nextPosX = 0.0f; nextPosY -= (maxHeights[i] + _verticalSpace); for (ssize_t j=0; j<row->size(); j++) { Node* l = row->at(j); l->setAnchorPoint(Vec2::ZERO); l->setPosition(nextPosX, nextPosY); this->addProtectedChild(l, 1); nextPosX += l->getContentSize().width; } } this->setRenderSize(Size(_contentSize.width, newContentSizeHeight));//这里把没用上的newContentSizeHeight用上 delete [] maxHeights; } size_t length = _elementRenders.size(); for (size_t i = 0; i<length; i++) { Vector<Node*>* l = _elementRenders[i]; l->clear(); delete l; } _elementRenders.clear(); if (_ignoreSize) { Size s = getVirtualRendererSize(); this->setContentSize(s); } else { this->setContentSize(_customSize); } updateContentSizeWithTextureSize(_contentSize); }
再实现
Size& RichText::getRenderSize() { return this->_renderSize; } void RichText::setRenderSize(const Size &size) { _renderSize = size; }
OK了,实际高度有了,发现getReaderSize()还是不对,继续查源码
发现adaptRenderers()是在Widget的visit()里调用的,也就是说当前桢不会被调用,这就好办了,在RichText pushBackElement 之后显示的调用一下formatText()就OK了,
相关文章推荐
- 关于COCOS2d-X中截图素材局部的Rect参数
- Cocos2dx3.6屏幕适配
- 初识Cocos2d-JS (一)
- cocos2d粒子系统工具Particle Designer
- cocos2d-x 图片变灰
- cocos打包apk,编译.so文件出错解决
- Windows7+VS2012+Cocos2dx3.6环境搭建
- cocos2dx 画包围盒
- cocos2d-x中求两坐标的夹角
- cocos2d-x 使用cocostudio创建的帧动画
- cocos2d-x 使用骨骼动画
- cocos2d-x 帧动画的三种实现
- cocos2d-x: 常用组件默认参数
- 【Cocos2d-x 3.x】 动作类Action源码分析
- Cocos2d-x 3.x中新的回调函数归纳
- cocos中使用Control遇到的一点小问题
- 实习小白::(转) 使用Tui-x制作cocos能使用的界面,动画等 ---------- Tui-x 简介
- cocos2dx-JS 多行多列TableView
- cocosjs 触摸
- cocos2dx 3.6 webview背景透明(ios android)