cocos2d-js ccui.RichText的一点总结

今天看了下ccui.RichText引擎内的c++代码,先写一点东西以示总结。
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个月左右,还有很大成长空间(即是还有很多不足),故哪位大神发现本人观点有问题,忘斧正































评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xunni_5241

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值