cocos2dx实现功能强大的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里面使用的,大家可以参考一下:
- function ChatUI:initRichEdit()
- local widget = self:getWidget()
- if widget then
- --创建小喇叭控件
- self._richBugle = ui.RichTextUI:create()
- self._richBugle:setSize(cc.size(940, 35))
- self._richBugle:setAnchorPoint(cc.p(0, 0))
- self._richBugle:setPosition(cc.p(100, 510))
- self._richBugle:setMaxLine(1)
- --创建聊天控件
- self._richChat= ui.RichTextUI:create()
- self._richChat:setSize(cc.size(940, 420))
- self._richChat:setAnchorPoint(cc.p(0, 0))
- self._richChat:setPosition(cc.p(20, 70))
- widget:addChild(self._richBugle)
- widget:addChild(self._richChat)
- local function callback(sender, eventType)
- if eventType == ui.RICHTEXT_ANCHOR_CLICKED then
- print(">>>>>>>>>>>addEventListenerRichText")
- end
- end
- self._richChat:addEventListenerRichText(callback)
- end
- end
- function ChatUI:addChatMsg(channel, roleName, chatMsg, signs)
- local richText = (channel == Channel_ID_Bugle) and self._richBugle or self._richChat
- if richText and channel and roleName and chatMsg then
- local ChannelNameSwitch =
- {
- [Channel_ID_Team] = "【队伍】",
- [Channel_ID_Privacy] = "【私聊】",
- [Channel_ID_Faction] = "【帮会】",
- [Channel_ID_World] = "【世界】",
- [Channel_ID_System] = "【系统】"
- }
- local ChannelColor =
- {
- [Channel_ID_Team] = Color3B.ORANGE,
- [Channel_ID_Privacy] = Color3B.ORANGE,
- [Channel_ID_Faction] = Color3B.ORANGE,
- [Channel_ID_World] = Color3B.ORANGE,
- [Channel_ID_System] = Color3B.WHITE,
- [Channel_ID_Bugle] = Color3B.ORANGE
- }
- local linkColor = Color3B.YELLOW
- local linklineColor = Color4B.YELLOW
- local outlineColor = Color4B.BLACK
- if channel == Channel_ID_Bugle then
- richText:insertNewLine()
- end
- if ChannelNameSwitch[channel] then
- local rc = ui.RichItemText:create(channel, ChannelColor[channel], 255, strg2u(ChannelNameSwitch[channel]), "DFYuanW7-GB2312.ttf", 25)
- rc:enableOutLine(outlineColor, 2)
- richText:insertElement(rc)
- end
- if channel ~= Channel_ID_System then
- local rcn = ui.RichItemText:create(channel, linkColor, 255, strg2u(roleName), "DFYuanW7-GB2312.ttf", 25)
- rcn:enableLinkLine(linklineColor, 1)
- rcn:enableOutLine(outlineColor, 2)
- richText:insertElement(rcn)
- chatMsg = ":" .. chatMsg
- end
- local rcm = ui.RichItemText:create(channel, ChannelColor[channel], 255, strg2u(chatMsg), "DFYuanW7-GB2312.ttf", 25)
- richText:insertElement(rcm)
- if channel ~= Channel_ID_Bugle then
- richText:insertNewLine()
- end
- end
- end
- function ChatUI:initComponent()
- self:addChatMsg(Channel_ID_Bugle, "王小二", "This is Bugle Msg")
- self:addChatMsg(Channel_ID_System, "", "This is System Msg")
- self:addChatMsg(Channel_ID_Team, "王小二", "This is Team Msg")
- self:addChatMsg(Channel_ID_World, "王小二", "This is World Msg")
- self:addChatMsg(Channel_ID_Faction, "王小二", "This is Faction Msg")
- self._channel = Channel_ID_World
- self:showChannel(Channel_ID_All)
- local btnChannel = self:getChild("Button_Channel")
- if btnChannel then
- btnChannel:setTitleText(strg2u("世界"))
- end
- end
最后是效果图:
cocos2dx实现功能强大的RichText控件的更多相关文章
- 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 ...
- .Net强大的列表控件XPTable [转]
.Net强大的列表控件XPTable http://blog.csdn.net/bodybo/article/details/7359531 XPTable的大名,想必C#开发的人都有所耳闻,使用下来 ...
- SharePoint 2013 新功能探索 之 标注控件
SharePoint 2013 引入了新的UI,同时也跟进了网络潮流,把应用最广泛的标注控件也引入到了SharePoint,先看两个应用 以上是两个开发当中经常会用到,下面就介绍一下如何开发相同 ...
- jsp日期插件My97DatePicker 强大的日期控件 使用方便简单
本文属转载(希望对编程爱好者有所帮助)详情请访问官方网站 http://www.my97.net/dp/index.asp 一. 简介 1. 简介 目前的版本是:4.7 2. 注意事项 My97Dat ...
- 多功能版vue日历控件
下载地址:https://pan.baidu.com/s/1nvpx0tB5cIvvqHuApz_MpQ 之前写了一个简单的vue日历控件:https://www.cnblogs.com/mrzhu/ ...
- jsp日期插件My97DatePicker 强大的日期控件 使用方便简单(转)
本文属转载(希望对编程爱好者有所帮助)详情请访问官方网站 http://www.my97.net/dp/index.asp 一. 简介 1. 简介 目前的版本是:4.7 2. 注意事项 My97Dat ...
- Flutter 强大的MediaQuery控件
注意:无特殊说明,Flutter版本及Dart版本如下: Flutter版本: 1.12.13+hotfix.5 Dart版本: 2.7.0 MediaQuery 通常情况下,不会直接将MediaQu ...
- js非常强大的日历控件fullcalendar.js, 日期时间库: moment.js
日历控件: https://fullcalendar.io/docs/ https://fullcalendar.io/docs/event_data/events_function/ https:/ ...
- 动态创建的文本框想要加上jQuery的datepicker功能变成日期选择控件该怎么办?
通常页面输入控件想得到日期选择功能,借助jQuery是这样实现的: 1.载入css和js <script src="jqueryui/jquery-ui.js" type=& ...
随机推荐
- typedef struct trx_struct trx_t;
/* The transaction handle; every session has a trx object which is freed only when the session is fr ...
- 抛出自定义异常,spring AOP事务不回滚的解决方案
spring AOP 默认对RuntimeException()异常或是其子类进行事务回滚,也就是说 事务回滚:throw new RuntimeException("xxxxxxxxxxx ...
- IOS中用UIFont返回字体的行高、动态改变tableView中Cell的高度
一.动态改变Cell的高度 1.利用tableView代理方法的返回值决定每一行cell的高度 - (CGFloat)tableView:(UITableView *)tableView height ...
- python练习程序(c100经典例4)
题目: 输入某年某月某日,判断这一天是这一年的第几天? def judge_run(year): a=year/4.0; b=year/100.0; c=year/400.0; if a==int(a ...
- java多线程模拟停车系统
import java.util.Random; import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent ...
- scala学习笔记(9):Scala函数(2)
1 指令式编程&函数式编程 指令式:imperative 风格编程.指令式风格,是你常常使用像 Java,C++和 C 这些语言里用的风格,一次性发出一个指令式的命令,用循环去枚举,并经常改变 ...
- oracle数据库重建EM
首先直接在文本控制台执行: [emca不像dbca.netca一样会出现图形化的界面,而是通过文本的交互式操作来完成重新配置] emca -config dbcontrol db -repos ...
- js获取当前url信息
window.location 属性 描述 hash 设置或获取 href 属性中在井号"#"后面的分段. host 设置或获取 location 或 URL 的 hostname ...
- Shell 的source命令
source命令用法: source FileName 作用:在当前bash环境下读取并执行FileName中的命令. 注:该命令通常用命令“.”来替代. 如:source .bash_rc 与 . ...
- mipmap 目录和drawable 目录有什么区别
Q :最近使用studio 发现drawle-hdpi 都没有了换成了mipmap-hdpi,这两个目录有什么区别呢,哪个比较好呢??? A: 我简单总结一下: 使用上没有任何区别,你把它当drawa ...