TableView制作聊天界面
来源:互联网 发布:js 添加disable属性 编辑:程序博客网 时间:2024/05/17 10:41
模拟聊天
local names = {'Tom','Jack','Messi','Kaka','Beckham'}local contents = {'An old gentleman whose eyesight was failing came to stay in a hotel room with a bottle of wine in each hand. On the wall there was a fly which he took for a nail. So the moment he hung them on, the bottles fell broken and the wine spilt all over the floor. When a waitress discovered what had happened, she showed deep sympathy for him and decided to do him a favour.', 'So the next morning when he was out taking a walk in the roof garden, she hammered a nail exactly where the fly had stayed.', 'Now the old man entered his room. The smell of the spilt wine reminded him of the accident. When he looked up at the wall, he found the fly was there again! He walked to it carefully adn slapped it with all his strength. On hearing a loud cry, the kind-hearted waitress rushed in. To her great surprise, the poor old man was there sitting on the floor, his teeth clenched and his right hand bleeding!', 'A patron in Montreal cafe turned on a tap in the washroom and got scalded. "This is an outrage," he complained. "The faucet marked C gave me boiling water."', 'Three competing store owners rented adjoining shops in a mall. Observers waited for mayhem to ensue.'}local chatPool = {}local size = 10local id = 0
chatPool暂存聊天数据,size为pool的长度,id可以记录共有多少条聊天,也是聊天的编号。
function MainScene:pushBackChat() local i = math.random(1,5) id = id + 1 local chat = {id=id,name=names[i],content=contents[i]} if #chatPool < size then table.insert(chatPool,chat) else table.remove(chatPool,1) table.insert(chatPool,chat) endendfunction MainScene:getLastChat() if #chatPool > 0 then return chatPool[#chatPool] else return {id=0,name='system',content='welcome'} endendfunction MainScene:beginListener() local function listener() local chat = self:getLastChat() local id = chat['id'] if self.lastId ~= id then -- 有新的聊天 self.tv:reloadData() if self.tv:cellAtIndex(0) then local cell = self.tv:cellAtIndex(0) if cell:getPositionY() > 120 then self.tv:setContentOffset(cc.p(0,0),false) end end self.lastId = id end end local seq = cc.Sequence:create(cc.CallFunc:create(listener),cc.DelayTime:create(1.1)) self:runAction(cc.RepeatForever:create(seq))end
pushBackChat方法是往chatPool中压入一条数据,左上角放置一个按钮,点击之后会压入一条数据。getLastChat得到最后一条数据。beginListener方法中每隔1.1秒,检查有没有新的聊天。
以下是完整的代码:
local MainScene = class("MainScene", cc.load("mvc").ViewBase)local names = {'Tom','Jack','Messi','Kaka','Beckham'}local contents = {'An old gentleman whose eyesight was failing came to stay in a hotel room with a bottle of wine in each hand. On the wall there was a fly which he took for a nail. So the moment he hung them on, the bottles fell broken and the wine spilt all over the floor. When a waitress discovered what had happened, she showed deep sympathy for him and decided to do him a favour.', 'So the next morning when he was out taking a walk in the roof garden, she hammered a nail exactly where the fly had stayed.', 'Now the old man entered his room. The smell of the spilt wine reminded him of the accident. When he looked up at the wall, he found the fly was there again! He walked to it carefully adn slapped it with all his strength. On hearing a loud cry, the kind-hearted waitress rushed in. To her great surprise, the poor old man was there sitting on the floor, his teeth clenched and his right hand bleeding!', 'A patron in Montreal cafe turned on a tap in the washroom and got scalded. "This is an outrage," he complained. "The faucet marked C gave me boiling water."', 'Three competing store owners rented adjoining shops in a mall. Observers waited for mayhem to ensue.'}local chatPool = {}local size = 10local id = 0function MainScene:ctor() self:enableNodeEvents() self.lastId = 0endfunction MainScene:onEnter() self:createUI() self:beginListener()endfunction MainScene:pushBackChat() local i = math.random(1,5) id = id + 1 local chat = {id=id,name=names[i],content=contents[i]} if #chatPool < size then table.insert(chatPool,chat) else table.remove(chatPool,1) table.insert(chatPool,chat) endendfunction MainScene:getLastChat() if #chatPool > 0 then return chatPool[#chatPool] else return {id=0,name='system',content='welcome'} endendfunction MainScene:createUI() self.tv = cc.TableView:create(cc.size(600,370)) self:addChild(self.tv,1) self.tv:setPosition(150,140) self.tv:setVerticalFillOrder(cc.TABLEVIEW_FILL_TOPDOWN) self.tv:setDirection(cc.SCROLLVIEW_DIRECTION_VERTICAL) local function cellSizeForTable(table,idx) -- 第一个返回的是高度 第二个返回的是宽度 local content = self.newTTFLabel({text = chatPool[idx+1]['content'],font = "fonts/DFYUANW7-GB2312.ttf",size = 23}) content:setDimensions(500,0) return content:getContentSize().height+30,100 end local function tableCellAtIndex(table, idx) local cell = table:dequeueCell() local function initCell() local name = self.newTTFLabel({text = chatPool[idx+1]['id']..'.'..chatPool[idx+1]['name']..':',font = "fonts/DFYUANW7-GB2312.ttf",size = 23}) name:setTextColor(cc.c3b(246,196,16)) local content = self.newTTFLabel({text = chatPool[idx+1]['content'],font = "fonts/DFYUANW7-GB2312.ttf",size = 23}) content:setDimensions(500,0) content:setTextColor(cc.c3b(104,229,255)) content:setAnchorPoint(0,0) content:setPosition(25+name:getContentSize().width,2) content:setName('content') cell:addChild(content) name:setAnchorPoint(0,1) name:setPosition(20,content:getContentSize().height+2) name:setName('NAME') cell:addChild(name) end if not cell then cell = cc.TableViewCell:new() local content = self.newTTFLabel({text = chatPool[idx+1]['content'],font = "fonts/DFYUANW7-GB2312.ttf",size = 23}) content:setDimensions(400,0) cell:setContentSize(100,content:getContentSize().height) cell:reset() else cell:removeAllChildren() end initCell() return cell end local function numberOfCellsInTableView(table) return #chatPool end self.tv:registerScriptHandler(numberOfCellsInTableView,cc.NUMBER_OF_CELLS_IN_TABLEVIEW) self.tv:registerScriptHandler(cellSizeForTable,cc.TABLECELL_SIZE_FOR_INDEX) self.tv:registerScriptHandler(tableCellAtIndex,cc.TABLECELL_SIZE_AT_INDEX) self.tv:reloadData() local btn = ccui.Button:create('res/DS07.png','res/DS08.png','res/DS09.png') btn:setPosition(100,550) self:addChild(btn) btn:addTouchEventListener(function(sender,_type) if _type == 2 then self:pushBackChat() end end)endfunction MainScene:beginListener() local function listener() local chat = self:getLastChat() local id = chat['id'] if self.lastId ~= id then -- 有新的聊天 self.tv:reloadData() if self.tv:cellAtIndex(0) then local cell = self.tv:cellAtIndex(0) if cell:getPositionY() > 120 then self.tv:setContentOffset(cc.p(0,0),false) end end self.lastId = id end end local seq = cc.Sequence:create(cc.CallFunc:create(listener),cc.DelayTime:create(1.1)) self:runAction(cc.RepeatForever:create(seq))endfunction MainScene.newTTFLabel(config) local myLabel= nil if config then if config.font then local mytext = "" local color = cc.c3b(255, 255, 255) local size = 22 local align = cc.TEXT_ALIGNMENT_CENTER local vertical = cc.VERTICAL_TEXT_ALIGNMENT_CENTER if config.text then mytext = config.text end if config.color then color = config.color end if config.size then size = config.size end if config.vertical then vertical = config.vertical end myLabel= cc.Label:createWithTTF(mytext,config.font,size) end end return myLabelendreturn MainScene
需要注意cellSizeForTable方法第一个返回的是高度,第二个返回的是宽度。
运行结果:
0 0
- TableView制作聊天界面
- 制作简易聊天界面
- NGUI制作简单聊天界面
- 安卓聊天界面的制作
- 纯代码实现QQ聊天界面---TableView使用详解
- 制作精美的QQ聊天界面和登录界面详解
- Android中制作Nine-Patch图片,并编写聊天界面
- 【android】聊天界面的制作-简易版实现
- Habber - IOS XMPP 客户端 教程 (四)聊天界面制作
- textView中输入后即时显示在tableView-即时通信聊天界面
- 聊天界面
- 聊天界面
- 聊天界面
- 聊天界面
- 聊天界面
- 聊天界面
- 聊天界面
- 聊天界面
- ArcGIS教程:环境级别和等级
- spring 依赖注入方式
- java中字符串怎样截取成一个一个的小段
- 给技术人上的管理课:平衡和集中
- Handler消息传递机制(子线程中传递new Handler和主线程中new Handle传递消息)
- TableView制作聊天界面
- 蓝桥杯历届-卖鸡蛋
- Gson转json时忽略对某域的序列化
- lob表中出现坏块的处理方法
- cordova5.0+ android 插件开发步骤
- apache配置vhosts
- 用Android Studio编译StrongSwan源码
- BZOJ3561: DZY Loves Math VI
- 网站打开之后ie浏览器都是杂项模式该如何处理