1. 程式人生 > >cocos2dx實現功能強大的RichText控制元件

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.明確需求首頁功能按鈕由一個圖片、一行