热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Cocos2dx-LuaUIScrollView和UITableView对比

为什么写这个上面这个问题的答案也是我写这篇文章的初衷,在最近给游戏添加一些列表的时候,对比着应用了一下他们两个,在它们两个之间的优劣势之间进行取舍,就有了这个问

 

为什么写这个


 

  

      上面这个问题的答案也是我写这篇文章的初衷,在最近给游戏添加一些列表的时候,对比着应用了一下他们两个,在它们两个之间的优劣势之间进行取舍,就有了这个问题的答案。

      按照我一个iOS开发而言,他们俩之间交集就是 UITableView是UIScrollView 的子类,也就是说UITableView是在UIScrollView的基础上写的,在平时的应用中 UITableView或者是UICollectionView应用肯定比UIScrollView要多,要强大! 

      但是在Cocos中,UITableView的性能真的好低!这是我这两天使用它之后唯一的感受!  并且它的优化方案不好找,我找了一会,没找到合适的一个优化方案,这和我们iOS或者Android就不一样了,Android哪怕是性能不高的ListView在经过性能优化之后还是可以的,这个Cocos的UITableView有什么还的优化方案希望大神能指导一下,供大家参考学习一下!

      所以,由于UITableView的性能低,在写一些列表的时候不得以使用UIScrollView + View 的方式,直接看可能觉得比较愚蠢,但事实是在使用中滑动的流畅度要比UITableView好,很尴尬!

 

 

 

 

UITableView你怎么用的


 

      其实要是只是讨论它们的使用的话真的也挺简单的,UITableView 你只需要记得一句话   -- 先注册,在使用  是的就是在说我们平常说的代理方法,不管是返回行列数的,还是设置cell的,或者点击等等等等,都是需要我们先注册这个方法,在使用的,大概我们看看下面的代码:

self._listView = cc.TableView:create(cc.size(744, 367))
self._listView:setDirection(cc.SCROLLVIEW_DIRECTION_VERTICAL)    
self._listView:setPosition(cc.p(0,0))
self._listView:setDelegate()
self._listView:addTo(csbNode)

self._listView:setVerticalFillOrder(cc.TABLEVIEW_FILL_TOPDOWN)
self._listView:registerScriptHandler(handler(self,self.cellSizeForTable), cc.TABLECELL_SIZE_FOR_INDEX)
self._listView:registerScriptHandler(handler(self,self.tableCellAtIndex), cc.TABLECELL_SIZE_AT_INDEX)
self._listView:registerScriptHandler(handler(self,self.numberOfCellsInTableView), cc.NUMBER_OF_CELLS_IN_TABLEVIEW)
self._listView:registerScriptHandler(handler(self,self.tableCellTouched), cc.TABLECELL_TOUCHED)

 

      下面是它们这些方法的实现,具体的这些方法都是用来干什么的我们就不详细说了,相信大家都懂!

--cell视图大小
function BankRecordLayer:cellSizeForTable(view, idx)
      return width ,height
end

--cell视图数目
function BankRecordLayer:numberOfCellsInTableView(view)

    return count
end
    
--获取cell
function BankRecordLayer:tableCellAtIndex(view, idx)

    local cell = view:dequeueCell()    
    return cell
end

--点击cell
function BankRecordLayer:tableCellTouched(view, cell)

    local cell = view:dequeueCell()    
    return cell
end

 

 

UIScrollView你怎么用的


 

      那同样是这个界面我们要使用UIScrollView该怎么实现呢?

      其实大致的思路很简单,就是你给你创建的ScrollView上面按照你给的位置一个个的添加View,其实这样也比较简单,重点是我们有几个细节问题需要我们处理好:

function EmailRecordLayer:CreatEmailItem()
    
    self._emalRecordListCell = {}
    local count = #self._emalRecordList
    self._listView:setInnerContainerSize(cc.size(735,90*count+10))
    for i=1,count do
    	local itemView = EmailItemLayer:create(self,self._emalRecordList[i])
        itemView:setPosition(5,self._listView:getInnerContainerSize().height-90*(i-1)-10)
        itemView:addTo(self._listView)
        table.insert(self._emalRecordListCell,itemView)
    end 
end 

 

      下面这个方法是一个完成的给ScrollView 上面添加View的方法,应该能注意到我们再给ScrollView添加View的时候,他就是从底部开始添加的,这个我试过改变他们的锚点,但都是无济于事! 

      这样当我们需要从上往下显示View的时候就只能倒着去设置它的位置了,这是需要注意的第一点!

      第二点就是滑动范围的问题,这里有两点的确需要我们注意一下: setContentSize 和 setInnerContainerSize 这两个方法需要我们区分清楚!!这点区分清楚就能设置好滑动范围!

      最后还有一点就是点击事件的问题  view要是能点击就会吞噬滑动事件!设置它不吞噬事件之后不就行了!ennnnn 还有一点: 你按住一个View滑动,滑动结束的时候松开View,这个时候就会无意间触发点击事件的!这个怎么处理?

      针对上面这个问题,看下面的代码:

 

    local startY, endY
    local btcallback = function(sender, eventType)
        if eventType == ccui.TouchEventType.began then
            startY = sender:getTouchBeganPosition().y
        elseif eventType == ccui.TouchEventType.ended then
            endY = sender:getTouchEndPosition().y
            if math.abs(startY-endY) <10 then
                self:onButtonClickedEvent(sender,self.img_red,item)
            end
        end
    end
    img_bg:setSwallowTouches(false)  --不要吞噬事件
    img_bg:addTouchEventListener(btcallback)

 

那选哪个? 


 

      按照我自己的使用的经验!

      要是你只是需要一个列表,不需要对列表进行其他的操作,这两个都是比较简单也是比较合适的,只不过TableView的滑动性能有一点底,让你看着滑动的时候会感觉不流畅!

      但要是你在列表的列上面有大量的操作的时候,还是建议使用ScrollView + View 比较好一点!为什么这么说呢?

      1、TableView有cell的复用问题,这个当然也可以解决,在iOS中也是一样的,这个你得清楚怎么解决

      2、滑动起来TableView会更加的卡顿! 我自己的尝试结果是掉针比以前更严重呢!

      上面这些内容就是关于这个要谈论的内容!

      


推荐阅读
  • 使用Tkinter构建51Ape无损音乐爬虫UI
    本文介绍了如何使用Python的内置模块Tkinter来构建一个简单的用户界面,用于爬取51Ape网站上的无损音乐百度云链接。虽然Tkinter入门相对简单,但在实际开发过程中由于文档不足可能会带来一些不便。 ... [详细]
  • 本文探讨了如何通过优化 DOM 操作来提升 JavaScript 的性能,包括使用 `createElement` 函数、动画元素、理解重绘事件及处理鼠标滚动事件等关键主题。 ... [详细]
  • 本文详细介绍了JQuery Mobile框架中特有的事件和方法,帮助开发者更好地理解和应用这些特性,提升移动Web开发的效率。 ... [详细]
  • 本文介绍了 Android 开发中常用的滚动视图组件 ScrollView 和 HorizontalScrollView 的基本用法和注意事项,帮助开发者更好地处理屏幕内容超出显示范围的情况。 ... [详细]
  • 深入解析 Android 中 EditText 的 getLayoutParams 方法及其代码应用实例 ... [详细]
  • 洛谷 P4009 汽车加油行驶问题 解析
    探讨了经典算法题目——汽车加油行驶问题,通过网络流和费用流的视角,深入解析了该问题的解决方案。本文将详细阐述如何利用最短路径算法解决这一问题,并提供详细的代码实现。 ... [详细]
  • 本文介绍了如何通过C#语言调用动态链接库(DLL)中的函数来实现IC卡的基本操作,包括初始化设备、设置密码模式、获取设备状态等,并详细展示了将TextBox中的数据写入IC卡的具体实现方法。 ... [详细]
  • 本文将从基础概念入手,详细探讨SpringMVC框架中DispatcherServlet如何通过HandlerMapping进行请求分发,以及其背后的源码实现细节。 ... [详细]
  • 在将 Android Studio 从 3.0 升级到 3.1 版本后,遇到项目无法正常编译的问题,具体错误信息为:org.gradle.api.tasks.TaskExecutionException: Execution failed for task ':app:processDemoProductDebugResources'。 ... [详细]
  • SDWebImage第三方库学习
    1、基本使用方法异步下载并缓存-(void)sd_setImageWithURL:(nullableNSURL*)urlNS_REFINED_FOR_SWIFT;使用占位图片& ... [详细]
  • SwipeRefreshLayout 是一个常用的刷新控件,可以包裹一个可滑动的子控件(如 ListView 或 RecyclerView)以实现竖直滑动时的页面刷新。然而,它本身并不支持上拉加载更多。本文将介绍如何通过继承 SwipeRefreshLayout 来实现这一功能。 ... [详细]
  • 本文介绍了一个简单的方法来防止RecyclerView在用户触摸时停止滚动。通过自定义RecyclerView类,可以实现对触摸事件的精确控制,从而避免不必要的滚动停止。 ... [详细]
  • 短视频app源码,Android开发底部滑出菜单首先依赖三方库implementationandroidx.appcompat:appcompat:1.2.0im ... [详细]
  • PBO(PixelBufferObject),将像素数据存储在显存中。优点:1、快速的像素数据传递,它采用了一种叫DMA(DirectM ... [详细]
  • 使用 ListView 浏览安卓系统中的回收站文件 ... [详细]
author-avatar
石蓉亮
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有