scrollview的总结
今天主要是学习了cocos2dx的scrollview的内容,把简单的菜单滑动表现做出来了。像很多游戏的下方有一槽功能按钮,角色、背包、技能、帮助等,当宽度不足以全部显示出来的时候,隐藏一部分,以滑动的形式展现是一个很好的解决办法,秦时明月2就是如此。
做到这一点,很简单,主要有几点要注意一下:
(1)cocos studio的ui编辑器中的scrollview的属性倒数第二个“滑动方向”要选择Horizontal。另外,这里有一篇文章讲到了scrollview和listview的一点区别,你往这两个控件中拖按钮就可以看得很明显了【参考:http://blog.csdn.net/cyistudio/article/details/8972617】。
(2)使用的时候要用到Touchgroup这个类,使用的步骤如下:
- self._layout = tolua.cast(GUIReader:shareReader():widgetFromJsonFile("cocosui/UIEditorTest/UIButton_Editor/UIButton_Editor_1.json"), "Layout")
- self._uiLayer:addWidget(self._layout)
其中的layout是cocos2dx中的一个类,为什么要用到它呢?是因为他和Widget这个有关系,下面再说。self._uiLayer就是一个TouchGroup类,也就是使用起来的lua代码有三个步骤:
1)使用widgetFromJsonFile中json文件中得到layout类
2)新建一个touchgroup对象,使用addwidget加入其中
3)getWidgetByName或者getWidgetByTag得到其中的某个对象(这个对象就是studio中的一个个对象)
接下来,思考部分...
碰到以下三个问题:
(1)scrollview是都要用到TouchGroup这个类来承载吗?
(2)标准触摸事件是所有layer都会响应点击事件,为什么我的mainlayer点击了之后,mainlayer和btnlayer(一个场景中两个并列的layer)都有响应;但是点击btnlayer之后,都没有反应呢?
(3)addchild和addwidget有什么区别?为什么上面的TouchGroup会用addwidget而不是addchild呢?
回答如下:
(1)scrollview不是要用到TouchGroup来承载,但是如果你是要通过读json文件(studio导出的),那么就要用。为什么要用呢?因为看了代码之后,我看来(没看官方文件),TouchGroup就是用来方便使用studio 导出的json文件的,包括读取和后面的使用。
--[[此部分有待确定!
我考虑的一个原因是,TouchGroup已经写好了scrollview的滑动效果,所以如果你用别的类,比如layer(scrollview也是继承layer),那么你自己要写滑动这一层的逻辑,不然要自己写。
]]
(2)为什么没反应呢?那是因为触摸时间有两种,标准触摸事件和带目标的触摸事件(参考:《Cocos2d-x高级开发教程》)。而TouchGroup是后一种,可以直接看下面的代码:
- bool TouchGroup::ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent)
- {
- return checkEventWidget(pTouch, pEvent);
- }
第一个参数是CCTouch*,而标准触摸事件的参数是CCSet*
(3)两者区别,并不是说简单意思上的都属于上一层。实现上可能都是分别用了一个指针用来保存一个结构体( TouchGroup *m_pUILayer和CCArray *m_pChildren;)但是对于addwidget来说还有一个重要的目的,就是能够更加Tag和Name来直接获取studio中某个节点对象,可以看TouchGroup的函数代码如下:
- Widget* TouchGroup::getWidgetByTag(int tag)
- {
- if (!m_pRootWidget)
- {
- return NULL;
- }
- return UIHelper::seekWidgetByTag(m_pRootWidget, tag);
- }
- Widget* TouchGroup::getWidgetByName(const char* name)
- {
- if (!m_pRootWidget)
- {
- return NULL;
- }
- return UIHelper::seekWidgetByName(m_pRootWidget, name);
- }
因为解析json文件的函数widgetFromJsonFile已经是一个树形结构,而且seekWidgetByTag还是ByName就是遍历这个树的操作,具体去看代码,第一次看这里的时候也很是惊讶!但是如果是自己去做又做成什么样呢?如果想追求遍历速度的话,你要重新构造存储树结构,简单的比如做一个hash表,但是这边的工作量和层次感上并不一定好!
总结:
(1)今天终于算是有所交代了
(2)还有很多细节没有去研究,因为时间上的原因,都是按照自己的理解去说的,错的地方还望高手指出来
(3)晚上和一个朋友座谈了一会:结果!
scrollview的总结的更多相关文章
- ScrollView嵌套ListView,GridView数据加载不全问题的解决
我们大家都知道ListView,GridView加载数据项,如果数据项过多时,就会显示滚动条.ScrollView组件里面只能包含一个组件,当ScrollView里面嵌套listView,GridVi ...
- Android ScrollView监听滑动到顶部和底部的两种方式(你可能不知道的细节)
Android ScrollView监听滑动到顶部和底部,虽然网上很多资料都有说,但是不全,而且有些细节没说清楚 使用场景: 1. 做一些复杂动画的时候,需要动态判断当前的ScrollView是否滚动 ...
- React-Native学习系列(二) Image和ScrollView
接下来,我们接着(一)继续讲,今天我们学习的是Image组件和ScrollView组件. Image组件 Image:一个用于显示多种不同类型图片的React组件.那么要如何使用呢? 引入本地图片: ...
- iOS学习笔记——滚动视图(scrollView)
滚动视图:在根视图中添加UIScrollViewDelegate协议,声明一些对象属性 @interface BoViewController : UIViewController<UIScro ...
- 实现下来ScrollView放大轮播图
创建工程,创建一个UIScrollView属性,并遵循其协议: #define kWidth self.view.frame.size.width//屏幕宽 #define kHeight self. ...
- React Native之 ScrollView介绍和使用
前言 学习本系列内容需要具备一定 HTML 开发基础,没有基础的朋友可以先转至 HTML快速入门(一) 学习 本人接触 React Native 时间并不是特别长,所以对其中的内容和性质了解可能会有所 ...
- ScrollView分栏视图分析
代码精华部分如下: //1.添加scrollView /* 1). 添加一个scrollView; 2).创建关注.热门.附近三个控制器. 3). 存储它们的名字到数组中,遍历并放到本控制器里. 4) ...
- IOS实现自动循环滚动广告--ScrollView的优化和封装
一.问题分析 在许多App中,我们都会见到循环滚动的视图,比如广告,其实想实现这个功能并不难,用ScrollView就可以轻松完成,但是在制作的过程中还存在几个小问题,如果能够正确的处理好这些小问题, ...
- ReactNative 根据scrollView/listview滑动距离动态修改NavBar颜色
我们常见某些APP上滑的时候,NavBar颜色会从透明渐变为某种颜色 原理非常简单,根据scrollView的回调动态修改NavBar的透明度即可. 在RN中,尤其是ListView中这个回调不是很好 ...
- iOS无限循环滚动scrollview
经常有园友会问"博主,有没有图片无限滚动的Demo呀?", 正儿八经的图片滚动的Demo我这儿还真没有,今天呢就封装一个可以在项目中直接使用的图片轮播.没看过其他iOS图片无限轮播 ...
随机推荐
- vue 2.0创建新项目
参考链接 https://segmentfault.com/a/1190000011275993 背景在安装完node的基础上,机器什么都没安装参考上述链接 一.下载vue $ cnpm insta ...
- 浏览器在初始化JS 环境时都发生了些什么
原文:https://segmentfault.com/a/1190000005754797 1.用 C/C++ 构造内部数据结构创建一个 OP 即(Object.prototype)以及初始化其内部 ...
- 3dsmax2018卸载/安装失败/如何彻底卸载清除干净3dsmax2018注册表和文件的方法
3dsmax2018提示安装未完成,某些产品无法安装该怎样解决呢?一些朋友在win7或者win10系统下安装3dsmax2018失败提示3dsmax2018安装未完成,某些产品无法安装,也有时候想重新 ...
- MongoDB实战开发
[目标]:本文将以实战的形式,向您展示如何用C#访问MongoDB,完成常见的数据库操作任务, 同时,也将介绍MongoDB的客户端(命令行工作模式)以及一些基础的命令. [说明]:MongoDB是什 ...
- HDU 5695 ——Gym Class——————【贪心思想,拓扑排序】
Gym Class Time Limit: 6000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total S ...
- 如何在不接入微信API的情况下自定义分享内容(图片、链接、标题)
方法如下: 1.设置分享title:动态改变document.title值即可: document.title = 'test' 2.设置分享图片:在页面隐藏一张尺寸大于290*290的图(图片需要容 ...
- AngularJS的日期格式化有两种形式
AngularJS的日期格式化有两种形式,一种是在HTML页面,一种是在JS代码里,都是用到AngularJS的过滤器$filter. HTML: date_expression 即 你在$scope ...
- log4j记录日志 和 webAppRootKey关系
今天发现一个问题,就是后台从某天开始不再记录日志了,最后发现是 webAppRootKey 的 value 的值必须要和log4j的注入变量要一致. 如下:web.xml文件的 webAppRootK ...
- api下载文件
net /// <summary> ///字符流下载方法 /// </summary> /// <param name="fileName">下 ...
- 解决VS2010在新建实体数据模型出现“在 .NET Framework Data Provider for Microsoft SQL Server Compact 3.5 中发生错误。请与提供程序供应商联系以解决此问题。”的问题
最近想试着学习ASP.NET MVC,在点击 添加--新建项--Visual C#下的数据中的ADO.NET 实体数据模型,到"选择您的数据连接"时,出现错误,"在 .N ...