转自: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. function ChatUI:initRichEdit()
  2. local widget = self:getWidget()
  3. if widget then
  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. local function callback(sender, eventType)
  18. if eventType == ui.RICHTEXT_ANCHOR_CLICKED then
  19. print(">>>>>>>>>>>addEventListenerRichText")
  20. end
  21. end
  22. self._richChat:addEventListenerRichText(callback)
  23. end
  24. end
  25. function ChatUI:addChatMsg(channel, roleName, chatMsg, signs)
  26. local richText = (channel == Channel_ID_Bugle) and self._richBugle or self._richChat
  27. if richText and channel and roleName and chatMsg then
  28. local ChannelNameSwitch =
  29. {
  30. [Channel_ID_Team] = "【队伍】",
  31. [Channel_ID_Privacy] = "【私聊】",
  32. [Channel_ID_Faction] = "【帮会】",
  33. [Channel_ID_World] = "【世界】",
  34. [Channel_ID_System] = "【系统】"
  35. }
  36. local ChannelColor =
  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. local linkColor = Color3B.YELLOW
  46. local linklineColor = Color4B.YELLOW
  47. local outlineColor = Color4B.BLACK
  48. if channel == Channel_ID_Bugle then
  49. richText:insertNewLine()
  50. end
  51. if ChannelNameSwitch[channel] then
  52. local rc = 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. if channel ~= Channel_ID_System then
  57. local rcn = 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. local rcm = ui.RichItemText:create(channel, ChannelColor[channel], 255, strg2u(chatMsg), "DFYuanW7-GB2312.ttf", 25)
  64. richText:insertElement(rcm)
  65. if channel ~= Channel_ID_Bugle then
  66. richText:insertNewLine()
  67. end
  68. end
  69. end
  70. function ChatUI:initComponent()
  71. self:addChatMsg(Channel_ID_Bugle, "王小二", "This is Bugle Msg")
  72. self:addChatMsg(Channel_ID_System, "", "This is System Msg")
  73. self:addChatMsg(Channel_ID_Team, "王小二", "This is Team Msg")
  74. self:addChatMsg(Channel_ID_World, "王小二", "This is World Msg")
  75. self:addChatMsg(Channel_ID_Faction, "王小二", "This is Faction Msg")
  76. self._channel = Channel_ID_World
  77. self:showChannel(Channel_ID_All)
  78. local btnChannel = self:getChild("Button_Channel")
  79. if btnChannel then
  80. btnChannel:setTitleText(strg2u("世界"))
  81. end
  82. end

最后是效果图:

cocos2dx实现功能强大的RichText控件的更多相关文章

  1. Cocos2dx 把 glview 渲染到 Qt 控件上(Mac 环境)

    本文原链接:http://www.cnblogs.com/zouzf/p/4423256.html 环境:Mac 10.9.2   Xcode5.1.1  Qt5.3  cocos2dx-2.2.4 ...

  2. .Net强大的列表控件XPTable [转]

    .Net强大的列表控件XPTable http://blog.csdn.net/bodybo/article/details/7359531 XPTable的大名,想必C#开发的人都有所耳闻,使用下来 ...

  3. SharePoint 2013 新功能探索 之 标注控件

    SharePoint 2013 引入了新的UI,同时也跟进了网络潮流,把应用最广泛的标注控件也引入到了SharePoint,先看两个应用    以上是两个开发当中经常会用到,下面就介绍一下如何开发相同 ...

  4. jsp日期插件My97DatePicker 强大的日期控件 使用方便简单

    本文属转载(希望对编程爱好者有所帮助)详情请访问官方网站 http://www.my97.net/dp/index.asp 一. 简介 1. 简介 目前的版本是:4.7 2. 注意事项 My97Dat ...

  5. 多功能版vue日历控件

    下载地址:https://pan.baidu.com/s/1nvpx0tB5cIvvqHuApz_MpQ 之前写了一个简单的vue日历控件:https://www.cnblogs.com/mrzhu/ ...

  6. jsp日期插件My97DatePicker 强大的日期控件 使用方便简单(转)

    本文属转载(希望对编程爱好者有所帮助)详情请访问官方网站 http://www.my97.net/dp/index.asp 一. 简介 1. 简介 目前的版本是:4.7 2. 注意事项 My97Dat ...

  7. Flutter 强大的MediaQuery控件

    注意:无特殊说明,Flutter版本及Dart版本如下: Flutter版本: 1.12.13+hotfix.5 Dart版本: 2.7.0 MediaQuery 通常情况下,不会直接将MediaQu ...

  8. js非常强大的日历控件fullcalendar.js, 日期时间库: moment.js

    日历控件: https://fullcalendar.io/docs/ https://fullcalendar.io/docs/event_data/events_function/ https:/ ...

  9. 动态创建的文本框想要加上jQuery的datepicker功能变成日期选择控件该怎么办?

    通常页面输入控件想得到日期选择功能,借助jQuery是这样实现的: 1.载入css和js <script src="jqueryui/jquery-ui.js" type=& ...

随机推荐

  1. .NET动态加载用户控件并传值的方法

    ASPX.CS里的代码: VoteChat.GetType().GetProperty("vid").SetValue(VoteChat, model.id.ToString(), ...

  2. JQuery Highcharts图表控件多样式显示多组数据

    具体实现的效果如图: 具体代码: ASP.NET前台脚本代码: <%@ Page Language="C#" AutoEventWireup="true" ...

  3. 关于Qt

    什么是Qt Qt是一个针对桌面.嵌入式.移动设备的一个跨平台的应用程序开发框架,支持的平台包括Linux.OS X.Windows.VxWorks.QNX.Android.iOS.BlackBerry ...

  4. Java中String 的equals 和==详解

    一.Java中数据存储区域包括: 1.寄存器:最快的存储区,由编译器根据需求进行分配,我们在程序中无法控制. 2. 栈:存放基本类型的变量数据和对象的引用,但对象本身不存放在栈中,而是存放在堆(new ...

  5. 使用 github.io 免费建站

    /*************************************************************************** * 使用 github.io 免费建站 * 说 ...

  6. delete archivelog all 无法彻底删除归档日志?

    最近在因归档日志暴增,使用delete archivelog all貌似无法清除所有的归档日志,到底是什么原因呢? 1.演示环境 SQL> select * from v$version whe ...

  7. Hadoop Hive基础sql语法

     目录 Hive 是基于Hadoop 构建的一套数据仓库分析系统,它提供了丰富的SQL查询方式来分析存储在Hadoop 分布式文件系统中的数据,可以将结构 化的数据文件映射为一张数据库表,并提供完整的 ...

  8. Android 线程与消息 机制 15问15答

    1.handler,looper,messagequeue三者之间的关系以及各自的角色? 答:MessageQueue就是存储消息的载体,Looper就是无限循环查找这个载体里是否还有消息.Handl ...

  9. Android SurfaceView使用详解

    1. SurfaceView的定义前面已经介绍过View了,下面来简单介绍一下SurfaceView,参考SDK文档和网络资料:SurfaceView是View的子类,它内嵌了一个专门用于绘制的Sur ...

  10. 一种Javascript解释ajax返回的json的好方法

    通常ajax请求返回的格式为json或者xml,如果返回的是json,则可以通过转换成javascript对象进行操作,如下: 1.ajax请求的controller实现 @RequestMappin ...