cocos2dx实现功能强大的RichText控件

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

我个人觉得,一个RichText控件应该具备下面基本功能:

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

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

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

4、可以支持滚动的效果。

5、可以有非常方便的换行功能,最好能设置行间距。

假设可以更好的实现聊天的功能,我认为还须要增加下面功能:

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

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

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

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

首先,扩展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

最后是效果图:

时间: 2024-10-12 20:17:38

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

paginationjs一款功能强大的分页控件

在项目中,很多时候需要分页控件,分页控件自己写也比较简单,但是要写一个功能丰富的分页控件话,就麻烦了,这里推荐一款不错的空间,页数太多的话,显示总页数,搜索指定页码. github地址:https://github.com/superRaytin/paginationjs 简单demo代码: <!DOCTYPE html> <html> <head> <title>Paginationjs example</title> <meta htt

介绍一个免费的具备数据显示/录入/更新/删除功能的asp.net控件

我不能说它比datagrid更强, 因为datagrid有很多深层次的东西可以发掘,但是我能说它比datagrid更易用,更实用,因为它已经轻松实现如下功能,同时,它是完全免费的,不需要注册,没有任何的功能限制. 1. 通过属性设置数据表的显示 2. 客户端数据排序 3. 各种字段类型的格式化显示 4. 所有数据表轻松实现内置的数据添加.更新.删除功能 5. 提供密码字段的支持并使用32位MD5编码 6. 添加.更新图象字段.链接文件字段时自动上传文件 7. 上传图片时可以自动生成缩略图 8.

绘制功能丰富的图表控件Essential Diagram for WPF

Essential Diagram for WPF控件能够帮助你绘制强大的和功能丰富的图表,提供了直观地用户交互式的模型来创建和编辑图图表,支持数据绑定,打印.序列化以及自动布局等.提供了多种图型对象,如:节点.连接线.装饰图型等.类似Visio的图形控件. 具体功能: 控件提供了几种自定义选项用于改变图表外观 能够自定义端口用于连接,支持几种链接端口类型:箭头.圆.菱形 支持正交.贝塞尔.笔直的连接线 连接线可绘制成多段线样式 支持连接线桥接 支持通过从符号面板或者代码来绘制节点 控件提供了多

TwinklingRefreshLayout 小而强大的刷新控件,自带顺滑的越界回弹,v1.04 版精心重构,完美发布啦!

TwinklingRefreshLayout v1.04 版精心重构,优化 UI.刷新及越界动画效果,修复众多 bug,完美发布! TwinklingRefreshLayout延伸了Google的SwipeRefreshLayout的思想,不在列表控件上动刀,而是使用一个ViewGroup来包含列表控件,以保持其较低的耦合性和较高的通用性.其主要特性有: 支持RecyclerView.ScrollView.AbsListView系列(ListView.GridView).WebView以及其它可

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

本文属转载(希望对编程爱好者有所帮助)详情请访问官方网站 http://www.my97.net/dp/index.asp 一. 简介 1. 简介 目前的版本是:4.7 2. 注意事项 My97DatePicker目录是一个整体,不可破坏里面的目录结构,也不可对里面的文件改名,可以改目录名 My97DatePicker.htm是必须文件,不可删除 各目录及文件的用途:WdatePicker.js 配置文件,在调用的地方仅需使用该文件,可多个共存,以xx_WdatePicker.js方式命名con

[功能干货] .NET图表控件(LightningChart )的安装及使用方法 -简数科技

概述 LightningChart (LightningChart Ultimate) 软件开发工具包是微软Visual Studio 的一个插件,专攻大数据可视化呈现,为严谨的科学.工程.测量和交易提供解决方案:可用于 WPF(Windows Presentation Foundation)和 Windows Forms .NET 平台. LightningChart 组件使用 DirectX9 和 DirectX11 GPU 加速,而不是较慢的 GDI / GDI +或 WPF Graphi

Flutter 强大的MediaQuery控件

注意:无特殊说明,Flutter版本及Dart版本如下: Flutter版本: 1.12.13+hotfix.5 Dart版本: 2.7.0 MediaQuery 通常情况下,不会直接将MediaQuery当作一个控件,而是使用MediaQuery.of获取当前设备的信息,用法如下: var data = MediaQuery.of(context); 此方式必须放在MediaQuery作用域内,否则会抛出异常,MaterialApp和WidgetsApp都引入了MediaQuery,并且随着屏

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

日历控件: https://fullcalendar.io/docs/ https://fullcalendar.io/docs/event_data/events_function/ https://fullcalendar.io/docs/event_data/Event_Object/ https://fullcalendar.io/docs/mouse/eventClick/ <!DOCTYPE html> <html> <head> <meta char

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

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