在cocos2d中,CCMenuItem经常被当做按钮使用。在有许多条目需要逐行显示,并且点击每个条目都触发对应的事件的需求下,最容易想到的是用CCScrollView嵌套CCMenu。

但默认情况下,会发生的一个情况是:当手指在CCScrollView中显示MenuItem的地方滑动,会发现无法滚动。

原因是:Menu的触摸优先级高于CCScrollView。而Menu会吃掉事件,让事件不再传递下去。

解决方法:

1、将滚动条的触摸优先级调到比较优先:

scrollView->setTouchPriority(-99999);

2、将Menu的优先级调的略低:

listMenu->setTouchPriority(1);

如果只是以上两步,在MenuItem处拖动的确能让滚动条滚动了,

但会发生另一个问题:当拉动滚动条的幅度很大后松开(往往是用户不想选择了),但还是会触发MenuItem的事件。

原因是:MenuItem还是被触摸了,并且它开始监控用户什么时候松开,cocos2d中,默认情况下,只要松开时还在该MenuItem上,则会触发Click事件。

解决方法:

判断"滚动前触摸点" 和"松开时触摸点"的距离,这2个点指的都是相对屏幕的绝对坐标。当距离小于某个阀值时,认为是点击了MenuItem。

CCDirector::sharedDirector()->getTouchDispatcher()->addTargetedDelegate(this,0, false);

利用触摸监听,赶在MenuItem按下之前那一刹那,获取到触摸屏幕的位置

在CCLayer的Began回调函数中记录这个位置到一个全局变量

在Ended回调函数再记录此时的位置到另一个全局变量

由于优先级的重新安排,在MenuItem的Click事件发生时,两个点的位置都已经知道了,此时进行距离计算,如果小于阀值,则触发对应的功能即可。

最新文章

  1. Denormalization 2
  2. iOS蓝牙4.0开发(BLE)
  3. 使用inno setup打包程序完整脚本(.net框架检测,重复安装检测)
  4. 苹果手机 iframe 无法滚动bug
  5. 文成小盆友python-num7 -常用模块补充 ,python 牛逼的面相对象
  6. Ubuntu 15.04 安装rmagick 2.15.4
  7. imagebutton、imageview的属性
  8. ReactJS的开发日常
  9. Matlab 将两个图像进行分离 已知其中一个图像
  10. spring 给一个类 生成test
  11. vue.js及项目实战[笔记]— 04 axios
  12. mysql学习------MySQL慢查询日志
  13. POJ 1265 pick定理
  14. Oracle HRMS APIs
  15. mac OS X下配置jdk环境变量
  16. 调用外部 DLL 中的函数(1. 早绑定)
  17. .NET工程师 技能清单
  18. python笔记-8(logging模块、re模块、栈与队列)
  19. 如何加快MyEclipse的启动速度
  20. 方向ajax(http long request实现实时通信)

热门文章

  1. 关于Sql注入的那些事
  2. JAVA统计一定范围内的质数个数
  3. crypto-js计算文件的sha256值
  4. sql根据表中数量字段自动复制记录行
  5. 004-C3P0连接池工具类模板
  6. 【ExtJS】contentEl的使用
  7. Jquery中和ajax有关的方法
  8. 1.8 js基础(常用方法小结)
  9. [转]js和jquery获取窗体高度
  10. <数据挖掘导论>读书笔记6关联分析的高级概念