cocos2dx实现功能强大的RichText控件

摘要:
我个人认为,一个RichText控件应该具备以下基本功能:1、多样化的文本显示功能,包括字体、颜色、字号的设置。cocos2dx只实现了基础的1和2功能,所以考虑之后还是决定自己写一个RichText控件。UIRichText的框架还是不错的,实现了文本分行显示的技术。再次,需要实现滚动功能,控件继承UIScrollView。源代码在这里,cocos2dx-3.0功能强大的richText控件最后贴一下使用的代码和效果图吧!

转自:http://blog.csdn.net/ljxfblog/article/details/26136773

最近准备做一个聊天系统,开始准备使用cocos2dx的UIRichText控件来显示聊天内容,结果在使用的时候才发现,cocos2dx的RichText功能非常有限,完全不具备实现聊天的功能,只实现了加入文本、图像和自定义控件的功能,支持不同字体、颜色、字号。

我个人认为,一个RichText控件应该具备以下基本功能:

1、多样化的文本显示功能,包括字体、颜色、字号的设置。

2、能显示图片以及一些特殊元素。

3、应该支持图片文字的超链接功能。

4、能够支持滚动的效果。

5、能够有很方便的换行功能,最好能设置行间距。

如果能够更好的实现聊天的功能,我觉得还需要加入以下功能:

1、文本特效:描边,下划线,阴影,发光等功能。

2、支持设置控件最大显示行数。

3、支持数据的分类显示,用于分频道显示聊天内容。

cocos2dx只实现了基础的1和2功能,所以考虑之后还是决定自己写一个RichText控件。UIRichText的框架还是不错的,实现了文本分行显示的技术。在他的基础上很容易扩展。

首先,扩展RichItem,用来支持多样化的文本需求。

其次,扩展Label控件,用于支持特殊的文字效果。

再次,需要实现滚动功能,控件继承UIScrollView。

最后,还需要对lua进行支持,包括使用功能以及超链接点击事件的注册。

以上是我实现控件的思路,这里就不贴代码了,很多,我会把我的控件代码共享给大家,大家在使用中有什么问题也可以向我咨询。

源代码在这里,cocos2dx-3.0功能强大的richText控件

最后贴一下使用的代码和效果图吧!

使用代码如下,我是在lua里面使用的,大家可以参考一下:

  1. functionChatUI:initRichEdit()
  2. localwidget=self:getWidget()
  3. ifwidgetthen
  4. --创建小喇叭控件
  5. self._richBugle=ui.RichTextUI:create()
  6. self._richBugle:setSize(cc.size(940,35))
  7. self._richBugle:setAnchorPoint(cc.p(0,0))
  8. self._richBugle:setPosition(cc.p(100,510))
  9. self._richBugle:setMaxLine(1)
  10. --创建聊天控件
  11. self._richChat=ui.RichTextUI:create()
  12. self._richChat:setSize(cc.size(940,420))
  13. self._richChat:setAnchorPoint(cc.p(0,0))
  14. self._richChat:setPosition(cc.p(20,70))
  15. widget:addChild(self._richBugle)
  16. widget:addChild(self._richChat)
  17. localfunctioncallback(sender,eventType)
  18. ifeventType==ui.RICHTEXT_ANCHOR_CLICKEDthen
  19. print(">>>>>>>>>>>addEventListenerRichText")
  20. end
  21. end
  22. self._richChat:addEventListenerRichText(callback)
  23. end
  24. end
  25. functionChatUI:addChatMsg(channel,roleName,chatMsg,signs)
  26. localrichText=(channel==Channel_ID_Bugle)andself._richBugleorself._richChat
  27. ifrichTextandchannelandroleNameandchatMsgthen
  28. localChannelNameSwitch=
  29. {
  30. [Channel_ID_Team]="【队伍】",
  31. [Channel_ID_Privacy]="【私聊】",
  32. [Channel_ID_Faction]="【帮会】",
  33. [Channel_ID_World]="【世界】",
  34. [Channel_ID_System]="【系统】"
  35. }
  36. localChannelColor=
  37. {
  38. [Channel_ID_Team]=Color3B.ORANGE,
  39. [Channel_ID_Privacy]=Color3B.ORANGE,
  40. [Channel_ID_Faction]=Color3B.ORANGE,
  41. [Channel_ID_World]=Color3B.ORANGE,
  42. [Channel_ID_System]=Color3B.WHITE,
  43. [Channel_ID_Bugle]=Color3B.ORANGE
  44. }
  45. locallinkColor=Color3B.YELLOW
  46. locallinklineColor=Color4B.YELLOW
  47. localoutlineColor=Color4B.BLACK
  48. ifchannel==Channel_ID_Buglethen
  49. richText:insertNewLine()
  50. end
  51. ifChannelNameSwitch[channel]then
  52. localrc=ui.RichItemText:create(channel,ChannelColor[channel],255,strg2u(ChannelNameSwitch[channel]),"DFYuanW7-GB2312.ttf",25)
  53. rc:enableOutLine(outlineColor,2)
  54. richText:insertElement(rc)
  55. end
  56. ifchannel~=Channel_ID_Systemthen
  57. localrcn=ui.RichItemText:create(channel,linkColor,255,strg2u(roleName),"DFYuanW7-GB2312.ttf",25)
  58. rcn:enableLinkLine(linklineColor,1)
  59. rcn:enableOutLine(outlineColor,2)
  60. richText:insertElement(rcn)
  61. chatMsg=":"..chatMsg
  62. end
  63. localrcm=ui.RichItemText:create(channel,ChannelColor[channel],255,strg2u(chatMsg),"DFYuanW7-GB2312.ttf",25)
  64. richText:insertElement(rcm)
  65. ifchannel~=Channel_ID_Buglethen
  66. richText:insertNewLine()
  67. end
  68. end
  69. end
  70. functionChatUI:initComponent()
  71. self:addChatMsg(Channel_ID_Bugle,"王小二","ThisisBugleMsg")
  72. self:addChatMsg(Channel_ID_System,"","ThisisSystemMsg")
  73. self:addChatMsg(Channel_ID_Team,"王小二","ThisisTeamMsg")
  74. self:addChatMsg(Channel_ID_World,"王小二","ThisisWorldMsg")
  75. self:addChatMsg(Channel_ID_Faction,"王小二","ThisisFactionMsg")
  76. self._channel=Channel_ID_World
  77. self:showChannel(Channel_ID_All)
  78. localbtnChannel=self:getChild("Button_Channel")
  79. ifbtnChannelthen
  80. btnChannel:setTitleText(strg2u("世界"))
  81. end
  82. end

最后是效果图:

cocos2dx实现功能强大的RichText控件第3张

免责声明:文章转载自《cocos2dx实现功能强大的RichText控件》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇weblogic修改安装路径教程C#对XML、JSON等格式的解析 (转)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

随便看看

linux性能评估-磁盘io概念实战篇

看起来python是个可疑进程。avgqu-sz:平均I/O队列长度。%util:一秒中有百分之多少的时间用于I/O操作,即被io消耗的cpu百分比备注:如果%util接近100%,说明产生的I/O请求太多,I/O系统已经满负荷,该磁盘可能存在瓶颈。如果avgqu-sz比较大,也表示有当量io在等待。观察iostat的最后一列,你会看到,磁盘vda的I/O使...

关于ArcMap中的地图文档单位

在ArcMap中地图文档的单位有度分秒、千米、米、十进制等很多种,但是ArcMap中的测量距离功能的实现必须建立在图层框架具有投影坐标系的情况下才能进行正确的计算,否则是不能进行的,IPolyline的Lenth属性获取的单位为十进制,需要转换成米。...

支付宝支付api

使用:alipayDemo来配置支付宝支付接口1拿到商户号,回调地址,支付宝公钥,我的私钥---生成一个对象#给支付宝发请求,信息要用支付宝公钥加密#支付宝给我响应信息,信息会用商户的公钥加密,回来之后再拿用户私钥解密2对象.direct_pay传支付金额,支付商品描述,支付订单号---返回个加密的串3拿到加密的串拼到get请求参数部分pay_url="ht...

【01】如何在XMind中排列自由主题

如何在XMind中安排免费主题。在XMind思维导图软件中,用户可以根据需要添加免费主题。然而,由于自由主题的灵活性,它并不整洁,与需要控制界面有序排列的用户相比,这会造成一定的麻烦。首先选择要组织的所有免费主题,单击,然后在下拉框中选择以安排免费主题。有六种排列方式:左对齐、垂直居中、右对齐、顶部对齐、水平居中和底部对齐。...

安装gulp教程(整理)

所以安装nodejs。...

plsql 导出查询结果

单击青色按钮,表示所查询的所有数据都将导出到指定文件,而不仅仅是以下列表中显示的数据行;无需单击“获取最后一页”按钮。注意:选择导出到excel文件时,需要注意默认导出为*。xlsx格式。您可以选择*。xls格式,但*。xls格式只能容纳65536行数据。如果要导出的数据超过最大值,则必须更改为*。xlsx格式!如果您仍然使用此格式,后面的数据将覆盖以前的数...