cocos2dx實現功能強大的RichText控制元件
最近準備做一個聊天系統,開始準備使用cocos2dx的UIRichText控制元件來顯示聊天內容,結果在使用的時候才發現,cocos2dx的RichText功能非常有限,完全不具備實現聊天的功能,只實現了加入文字、影象和自定義控制元件的功能,支援不同字型、顏色、字號。
我個人認為,一個RichText控制元件應該具備以下基本功能:
1、多樣化的文字顯示功能,包括字型、顏色、字號的設定。
2、能顯示圖片以及一些特殊元素。
3、應該支援圖片文字的超連結功能。
4、能夠支援滾動的效果。
5、能夠有很方便的換行功能,最好能設定行間距。
如果能夠更好的實現聊天的功能,我覺得還需要加入以下功能:
1、文字特效:描邊,下劃線,陰影,發光等功能。
2、支援設定控制元件最大顯示行數。
3、支援資料的分類顯示,用於分頻道顯示聊天內容。
cocos2dx只實現了基礎的1和2功能,所以考慮之後還是決定自己寫一個RichText控制元件。UIRichText的框架還是不錯的,實現了文字分行顯示的技術。在他的基礎上很容易擴充套件。
首先,擴充套件RichItem,用來支援多樣化的文字需求。
其次,擴充套件Label控制元件,用於支援特殊的文字效果。
再次,需要實現滾動功能,控制元件繼承UIScrollView。
最後,還需要對lua進行支援,包括使用功能以及超連結點選事件的註冊。
以上是我實現控制元件的思路,這裡就不貼程式碼了,很多,我會把我的控制元件程式碼共享給大家,大家在使用中有什麼問題也可以向我諮詢。
最後貼一下使用的程式碼和效果圖吧!
使用程式碼如下,我是在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的UIRichText控制元件來顯示聊天內容,結果在使用的時候才發現,cocos2dx的RichText功能非常有限,完全不具備實現聊天的功能,只實現了加入文字、影象和自定義控制元件的功能,支援不同字型、顏色、
實現帶查詢功能的ComboBox控制元件
實現效果: 知識運用: ComboBox控制元件的AutoCompleteMode屬性 public AutoCompleteMode AutoCompleteMode{get;set;} //屬性值為列舉值之一 和AutoCompleteSource屬性 public A
AngularJS:實現動態新增輸入控制元件功能
1 <div class="form-group" ng-controller="SendSafeMessageController"> 2 <label class="col-md-2 control-label">答覆內容:</label> 3 &
Android右滑關閉Activity介面功能-自定義控制元件實現
引言Android右滑關閉Activity介面功能,網上已經有好多優秀的開原始碼和專案,不過大部分都是結合ViewDragHelper來實現的,這裡要討論的是通過結合ValueAnimator來實現,目前我的控制元件只實現了從左往右(上往下)滑關閉介面。需求在介面上從左往右滑
帶有『選擇次數排序』和『搜尋』功能的樹形控制元件設計與實現
一、思想創意 樹形控制元件是軟體操作介面中最常見的一種資料展現控制元件,如下圖所示: 圖1 這就是我們常見的樹形結構,目前有很多樹控制元件可以供我們選擇使用,如zTree、Ext中的樹控制元件,等等。 樹形控制元件這麼多,但實現的功能就是上面這張圖,樹
微信小程式實現顯示和隱藏控制元件-頭像-取值-bindblur事件
微信小程式實現顯示和隱藏控制元件 .wxml: <view class=" {{showOrHidden?'show':'hidden'}}"></view> .wxss: .hidden { display: none; } .show { display: b
類似footer的效果,利用簡單的佈局實現ListView底部懸浮控制元件
平時使用listview/recycleview的時候,都會經常碰到這麼一個需求:就是一個ListView下面懸浮一個佈局,當ListView的項超過螢幕下方則固定在底部。 一開也是想到用ListView的footer去實現,後來發現一個簡單的佈局實現這個功能。 看圖:
HTML5學習第6篇—video:自己實現video的播放控制元件(新增樣式版)
本篇部落格接著上一篇文章,實現了一個帶樣式的video播放控制元件,程式碼如下: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8">
HTML5學習第5篇—viedo:自己實現viedo的播放控制元件(簡版)
最近正在學習html5新增的媒體元素video,為了能夠更熟悉video的屬性、方法和事件,決定自己實現一下video的播放控制元件,因為是初學,只是寫了個簡版。程式碼如下: <!DOCTYPE html> <html lang="en
多功能jQuery日期控制元件基於jeDate
最近專案用到了日期控制元件,網上找了很久,發現一個比較適合的分享給大家(本來想免費的,csdn不允許了現在……,所以選了最低分分享,如果涉及侵權,請聯絡我。) 下載地址:https://download.csdn.net/download/kuangni5808/10528765 下載檔案
C#實現Windows應用高階控制元件&註冊視窗
視窗顯示為 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text;
ipywidgets 包實現 jupyter notebook 的控制元件互動
ipywidgets 包可以實現 jupyter notebook 筆記本的互動式控制元件操作。 from ipywidgets import interact import ipywidgets as widgets 首先定義一個用於操作的函式: def f1(x):
javascript/HTML實現多個text控制元件自動/動態計算總數
<html><head><title>untitled</title><style type="text/css"> input {width: 40px;} </style><script typ
android RecyclerView介面卡實現item+item內部控制元件點選事件
@先看看效果是不是自己想要的吧@Adapter:自定義一個繼承RecyclerView.Adapter的介面卡,作用:將資料與每一個item繫結LayoutManager:佈局管理器,確定每一個item的擺放形式,展示和隱藏 a: LinearLayoutMan
javascript實現WEB列印(用window.open()實現).不用安裝任何控制元件.(含程式碼)分享
WEB無控制元件列印.javascript裡有一個方法竟然可以調出列印視窗,而且不用安裝任何控制元件.下面是用window.open()實現的。有興趣的朋友再加工一下,就可以實現列印指定頁面的內容的了。<head><script language=javas
利用書籤功能對TDBGrid控制元件中多個記錄的處理
DELPHI 的TDBGrid 控 件 主 要 用 來 處 理 數 據 表, 它 的 屬 性 中 有 一 個dgMultiSelect, 若 此 屬 性 設 定 為TRUE, 則 可 以 選 中 多 個 記 錄( 可 用CTRL + 鼠 標 左 鍵 選 擇
C# 實現真正的透明控制元件(Windows桌面程式)
由於上位機程式的需要,需要大量的異性控制元件,開始不以為然,心想隨著GDI到GDI+的升級,微軟應該會給NET打造了一套高效絢麗的繪圖方案,使用後才知道完全不是我以為的那麼回事.於是開始各種尋找資源,發現網上方法無非使用Web.Transparent作為背景,要麼就完全使用
react native實現可展開Text控制元件
原理:元件初始化時不設定Text控制元件的numberOfLines屬性,測量一下元件高度(最大高度),然後在設定numberOfLines屬性,再次測量一下元件高度(最小高度),若最大高度大與最小高度,表示需要顯示“展開”。/* eslint new-cap: ["err
Android 之實現執行時註解控制元件
一、首先的說一下註解的分類, 1、執行時註解,程式碼簡單,複雜性低,但是效率稍微低一點 2、編譯時註解、程式碼多,結構複雜,但是效率高這裡介紹的是執行時註解。二、還是先說一下思路 首先建立對應的註解類,並且通過反射 findViewById 方法去實
React Native佈局實踐:開發京東客戶端首頁(四)——首頁功能按鈕及控制元件封裝
從我寫第一篇React Native文章以來,我們幾乎是把所有的程式碼都放在一個js檔案中實現的,隨著工程複雜度的增加,各種自定義控制元件的程式碼就和業務邏輯程式碼耦合嚴重,這篇文章就來解決這一問題,讓我們一起來學習控制元件封裝的方法。1.明確需求首頁功能按鈕由一個圖片、一行