今天看了下ccui.RichText引擎内的c++代码,先写一点东西以示总结。
ccui.RichText的使用示例:
在这里就能看出来ccui.RichText的大小是在事后进行设置的,这样在list容器下加载ccui.RichText控件的时候就需要知道每一个文本的大小,虽然ccui.RichText看似可以设置ignoreContentAdaptWithSize,但这个设置无法实现限定宽度不限定高度的text文本,下面说句题外话ccui.Text可以实现这个功能,代码如下:
上面的代码可以实现text文本的固定宽度不固定长度的显示(且可以英文按照单词来进行分割),上面的参数content为需要显示的字符串;fontSize为字号大小;fontName为字体名称;textShowWidth为限定宽度。
出现这个问题后我查看了ccui.RichText,想在c++中用text的高度来设置richText.height 最后经过查看发现可以在void RichText::formarRenderers()中进行设置,这个函数中计算了text的高宽度,但是在这进行纠正richText.height 后发现一个问题是text开始显示的时候还是以上面手动设置的width与height为准,然后才会纠正过来,并且最后一个text不进行纠正,最后发现这个原因是由于,在text显示绘制出来后,调用void RichText::adaptRenderers()这样继而调用
formatText();才会调用到void RichText::formarRenderers()。而到这时才进行纠正height其实已经晚了。
对了上面richText.width = 100;richText.height = 80;这个值在ccui.RichText中的体现为_customSize。其实上面这些的总结还是暂时没有解决自己需求,在这里先把暂时总结到的部分总结下,到时再有新的发现再来总结。
===================================================
上面开始作为分界线,下面又经过思考决定手动绑定一个函数再渲染绘制完成回调函数formatText()前主动调用一下,具体方法如下(由于本人水平有限,故将所有需要改动代码的部分都记下来,以备自己回忆所用)
1 UIRichText.h中
2 UIRichText.cpp中,在void RichText::formarRenderers() 函数中添加代码获取其当前大小
上面的代码添加在delete [] maxHeights;之前即可。
3 UIRichText.cpp中,添加如下函数:
通过上面的代码变动,已经可以获取到富文本的真正大小,下面需要做的工作就是需要将js代码与c++代码进行绑定处理。
4 jsb_cocos2dx_ui_auto.hpp中声明绑定函数,在js_cocos2dx_ui_RichText_******相应函数声明的位置进行声明:
5 jsb_cocos2dx_ui_auto.cpp中进行函数的现实,函数写在bool js_cocos2dx_ui_RichText_******相关函数实现的位置即可:
6 在staticJSFunctionSpec funcs[] 中添加
JS_FN("getRealSize",js_cocos2dx_ui_RichText_getRealSize,0, JSPROP_PERMANENT |JSPROP_ENUMERATE),添加上面的时候一定要注意写在RichText的funcs中,判断方法也是察看js_cocos2dx_ui_RichText_****
经过以上步骤也就实现了richtext的富文本大小的获取并将其与js进行绑定,在js端调用一下代码即可实现:
经过这第二次的总结,基本已实现所需需求,故总结。
本人接触cocos2dx的引擎尚且只有4个月左右,还有很大成长空间(即是还有很多不足),故哪位大神发现本人观点有问题,忘斧正
ccui.RichText的使用示例:
var richText = new ccui.RichText();
richText.initWithXML(content);
richText.setAnchorPoint(0,0.5);
richText.ignoreContentAdaptWithSize(false);
richText.width = 100;
richText.height = 80;
在这里就能看出来ccui.RichText的大小是在事后进行设置的,这样在list容器下加载ccui.RichText控件的时候就需要知道每一个文本的大小,虽然ccui.RichText看似可以设置ignoreContentAdaptWithSize,但这个设置无法实现限定宽度不限定高度的text文本,下面说句题外话ccui.Text可以实现这个功能,代码如下:
var txt = new ccui.Text();
txt.setAnchorPoint(0, 0.5);
txt.setString(content);
txt.setFontSize(fontSize);
txt.setFontName(fontName);
txt.ignoreContentAdaptWithSize(true)
txt.setTextAreaSize(cc.size(textShowWidth, 0));
上面的代码可以实现text文本的固定宽度不固定长度的显示(且可以英文按照单词来进行分割),上面的参数content为需要显示的字符串;fontSize为字号大小;fontName为字体名称;textShowWidth为限定宽度。
出现这个问题后我查看了ccui.RichText,想在c++中用text的高度来设置richText.height 最后经过查看发现可以在void RichText::formarRenderers()中进行设置,这个函数中计算了text的高宽度,但是在这进行纠正richText.height 后发现一个问题是text开始显示的时候还是以上面手动设置的width与height为准,然后才会纠正过来,并且最后一个text不进行纠正,最后发现这个原因是由于,在text显示绘制出来后,调用void RichText::adaptRenderers()这样继而调用
formatText();才会调用到void RichText::formarRenderers()。而到这时才进行纠正height其实已经晚了。
对了上面richText.width = 100;richText.height = 80;这个值在ccui.RichText中的体现为_customSize。其实上面这些的总结还是暂时没有解决自己需求,在这里先把暂时总结到的部分总结下,到时再有新的发现再来总结。
===================================================
上面开始作为分界线,下面又经过思考决定手动绑定一个函数再渲染绘制完成回调函数formatText()前主动调用一下,具体方法如下(由于本人水平有限,故将所有需要改动代码的部分都记下来,以备自己回忆所用)
1 UIRichText.h中
public:
Size myRealSize;
Size getRealSize();
2 UIRichText.cpp中,在void RichText::formarRenderers() 函数中添加代码获取其当前大小
//得到RichText真实大小
this->myRealSize.height = newContentSizeHeight;//(也可为_customSize.height-nextPosY)
this->myRealSize.width = _customSize.width;//由于我使用的限定宽度,故宽度没有求真值,但也可实现
上面的代码添加在delete [] maxHeights;之前即可。
3 UIRichText.cpp中,添加如下函数:
//获得富文本大小
Size RichText::getRealSize()
{
this->formatText(); //需要手动调用
return this->myRealSize;
}
通过上面的代码变动,已经可以获取到富文本的真正大小,下面需要做的工作就是需要将js代码与c++代码进行绑定处理。
4 jsb_cocos2dx_ui_auto.hpp中声明绑定函数,在js_cocos2dx_ui_RichText_******相应函数声明的位置进行声明:
bool js_cocos2dx_ui_RichText_getRealSize(JSContext *cx, uint32_t argc, jsval *vp);
5 jsb_cocos2dx_ui_auto.cpp中进行函数的现实,函数写在bool js_cocos2dx_ui_RichText_******相关函数实现的位置即可:
// 绑定ccui.RichText中添加的函数
bool js_cocos2dx_ui_RichText_getRealSize(JSContext *cx, uint32_t argc, jsval *vp)
{
JS::CallArgs args = JS::CallArgsFromVp(argc, vp);
JS::RootedObject obj(cx, args.thisv().toObjectOrNull());
js_proxy_t *proxy = jsb_get_js_proxy(obj);
cocos2d::ui::RichText* cobj = (cocos2d::ui::RichText *)(proxy ? proxy->ptr : NULL);
JSB_PRECONDITION2( cobj, cx, false, "js_cocos2dx_ui_RichText_getRealSize : Invalid Native Object");
if (argc == 0) {
cocos2d::Size ret = cobj->getRealSize();
jsval jsret = JSVAL_NULL;
jsret = ccsize_to_jsval(cx, ret);
args.rval().set(jsret);
return true;
}
JS_ReportError(cx, "js_cocos2dx_ui_RichText_getRealSize : wrong number of arguments");
return false;
}
6 在staticJSFunctionSpec funcs[] 中添加
JS_FN("getRealSize",js_cocos2dx_ui_RichText_getRealSize,0, JSPROP_PERMANENT |JSPROP_ENUMERATE),添加上面的时候一定要注意写在RichText的funcs中,判断方法也是察看js_cocos2dx_ui_RichText_****
经过以上步骤也就实现了richtext的富文本大小的获取并将其与js进行绑定,在js端调用一下代码即可实现:
var richText = new ccui.RichText();
richText.initWithXML(content);
richText.setAnchorPoint(0,0.5);
richText.ignoreContentAdaptWithSize(false);
richText.width = 800;
//richText.height = 60;
richText.height = 10;
cc.log("x="+richText.width + " y="+richText.height);
var mSize = richText.getRealSize();
cc.log("mSize-x="+mSize.width + " mSize-y="+mSize.height);
richText.width = mSize.width;
richText.height = mSize.height;
经过这第二次的总结,基本已实现所需需求,故总结。
本人接触cocos2dx的引擎尚且只有4个月左右,还有很大成长空间(即是还有很多不足),故哪位大神发现本人观点有问题,忘斧正