zoukankan      html  css  js  c++  java
  • cocos2d在CCScrollView中嵌套CCMenu列表

    在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事件发生时,两个点的位置都已经知道了,此时进行距离计算,如果小于阀值,则触发对应的功能即可。

  • 相关阅读:
    java mail 读取邮件列表,
    java itext 报错 com.itextpdf.text.DocumentException: Font 'STSong-Light' with 'UniGB-UCS2-H'
    shiro 标签
    idea maven 创建webapp项目没有src目录
    is not allowed to connect to this MySQL server解决办法
    mybatis 插入数据并返回主键值
    idea15 生成mybatis代码
    android 打开新窗口
    Java开发笔记(八十四)文件与目录的管理
    Java开发笔记(八十三)利用注解技术检查空指针
  • 原文地址:https://www.cnblogs.com/wt616/p/3157642.html
Copyright © 2011-2022 走看看