cocos2dx实现功能强大的RichText控件

前端之家收集整理的这篇文章主要介绍了cocos2dx实现功能强大的RichText控件前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

最近准备做一个聊天系统,开始准备使用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里面使用的,大家可以参考一下:

[plain] view plain copy
  1. functionChatUI:initRichEdit()
  2. @H_502_102@ 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,248); line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important"> self._richChat:setPosition(cc.p(20,70))
  14. widget:addChild(self._richBugle)
  15. widget:addChild(self._richChat)
  16. localfunctioncallback(sender,eventType)
  17. ifeventType==ui.RICHTEXT_ANCHOR_CLICKEDthen
  18. print(">>>>>>>>>>>addEventListenerRichText")
  19. end
  20. end
  21. self._richChat:addEventListenerRichText(callback)
  22. functionChatUI:addChatMsg(channel,roleName,chatMsg,signs)
  23. localrichText=(channel==Channel_ID_Bugle)andself._richBugleorself._richChat
  24. ifrichTextandchannelandroleNameandchatMsgthen
  25. localChannelNameSwitch=
  26. {
  27. [Channel_ID_Team]="【队伍】",
  28. [Channel_ID_Privacy]="【私聊】",
  29. [Channel_ID_Faction]="【帮会】",248); line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important"> [Channel_ID_World]="【世界】",108); list-style:decimal-leading-zero outside; color:inherit; line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important"> [Channel_ID_System]="【系统】"
  30. }
  31. localChannelColor=
  32. [Channel_ID_Team]=Color3B.ORANGE,248); line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important"> [Channel_ID_Privacy]=Color3B.ORANGE,108); list-style:decimal-leading-zero outside; color:inherit; line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important"> [Channel_ID_Faction]=Color3B.ORANGE,248); line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important"> [Channel_ID_World]=Color3B.ORANGE,108); list-style:decimal-leading-zero outside; color:inherit; line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important"> [Channel_ID_System]=Color3B.WHITE,248); line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important"> [Channel_ID_Bugle]=Color3B.ORANGE
  33. }
  34. locallinkColor=Color3B.YELLOW
  35. locallinklineColor=Color4B.YELLOW
  36. localoutlineColor=Color4B.BLACK
  37. ifchannel==Channel_ID_Buglethen
  38. richText:insertNewLine()
  39. ifChannelNameSwitch[channel]then
  40. localrc=ui.RichItemText:create(channel,ChannelColor[channel],strg2u(ChannelNameSwitch[channel]),"DFYuanW7-GB2312.ttf",25)
  41. rc:enableOutLine(outlineColor,2)
  42. richText:insertElement(rc)
  43. ifchannel~=Channel_ID_Systemthen
  44. localrcn=ui.RichItemText:create(channel,linkColor,strg2u(roleName),25)
  45. rcn:enableLinkLine(linklineColor,1)
  46. rcn:enableOutLine(outlineColor,248); line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important"> richText:insertElement(rcn)
  47. chatMsg=":"..chatMsg
  48. localrcm=ui.RichItemText:create(channel,strg2u(chatMsg),248); line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important"> richText:insertElement(rcm)
  49. ifchannel~=Channel_ID_Buglethen
  50. richText:insertNewLine()
  51. functionChatUI:initComponent()
  52. self:addChatMsg(Channel_ID_Bugle,"王小二","ThisisBugleMsg")
  53. self:addChatMsg(Channel_ID_System,"","ThisisSystemMsg")
  54. self:addChatMsg(Channel_ID_Team,"ThisisTeamMsg")
  55. self:addChatMsg(Channel_ID_World,"ThisisWorldMsg")
  56. self:addChatMsg(Channel_ID_Faction,"ThisisFactionMsg")
  57. self._channel=Channel_ID_World
  58. self:showChannel(Channel_ID_All)
  59. localbtnChannel=self:getChild("Button_Channel")
  60. ifbtnChannelthen
  61. btnChannel:setTitleText(strg2u("世界"))
  62. end

最后是效果图:

本文摘自:http://blog.csdn.net/ljxfblog/article/details/26136773

猜你在找的Cocos2d-x相关文章