cocos2dx实现功能强大的RichText控件

作者在cocos2dx框架下扩展RichText控件,解决其功能限制,以实现更丰富的聊天系统显示效果,包括多样化文本显示、图片文字超链接、滚动效果及方便的换行功能等。
cocos2dx实现功能强大的RichText控件
2014-05-19      我来说两句    来源: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里面使用的,大家可以参考一下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
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

最后是效果图:

\

训练数据保存为deep_convnet_params.pkl,UI使用wxPython编写。卷积神经网络(CNN)是一种专门针对图像、视频等结构化数据设计的深度学习模型,在计算机视觉、语音识别、自然语言处理等多个领域有广泛应用。其核心设计理念源于对生物视觉系统的模拟,主要特点包括局部感知、权重共享、多层级抽象以及空间不变性。 **1. 局部感知与卷积操作** 卷积层是CNN的基本构建块,使用一组可学习的滤波器对输入图像进行扫描。每个滤波器在图像上滑动,以局部区域内的像素值与滤波器权重进行逐元素乘法后求和,生成输出值。这一过程能够捕获图像中的边缘、纹理等局部特征。 **2. 权重共享** 同一滤波器在整个输入图像上保持相同的权重。这显著减少了模型参数数量,增强了泛化能力,并体现了对图像平移不变性的内在假设。 **3. 池化操作** 池化层通常紧随卷积层之后,用于降低数据维度并引入空间不变性。常见方法有最大池化和平均池化,它们可以减少模型对微小位置变化的敏感度,同时保留重要特征。 **4. 多层级抽象** CNN通常包含多个卷积和池化层堆叠在一起。随着网络深度增加,每一层逐渐提取更复杂、更抽象的特征,从底层识别边缘、角点,到高层识别整个对象或场景,使得CNN能够从原始像素数据中自动学习到丰富的表示。 **5. 激活函数与正则化** CNN中使用非线性激活函数来引入非线性表达能力。为防止过拟合,常采用正则化技术,如L2正则化和Dropout,以增强模型的泛化性能。 **6. 应用场景** CNN在诸多领域展现出强大应用价值,包括图像分类、目标检测、语义分割、人脸识别、图像生成、医学影像分析以及自然语言处理等任务。 **7. 发展与演变** CNN的概念起源于20世纪80年代,其影响力在硬件加速和大规模数据集出现后真正显现。经典模型如LeNet-5用于手写数字识别,而AlexNet、VGG、GoogLeNet、ResNet等现代架构推动了CNN技术的快速发展。如今,CNN已成为深度学习图像处理领域的基石,并持续创新。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值