【首创】完美解决scrollview与menu的兼容问题

经过一段时间的学习,才发现CH5里scrollview的例子很少,也没有相关的SAMPLE,于是乎,开始投入研究。大多数scrollview的例子只有在cocos2d-x里才用到,那么CH5里要用到滚动条怎么理呢?有人说用tableview,OMG,这个玩意不但复杂而且累赘,用一个简单的功能要写一大堆代码。OK,哥与scrollview卯上了,最后终于完美解决。估计应该是全论坛首创,因此转载要注明出处。分享研究代码:

主要解决俩大难题:
1)滑动优先的问题,如果在scrollview里放Menu不能滑动,并且触发menu事件。
2)当menu滑动出ScrollView的时候,还可以点击。

解决方案:
1)重写Menu
var MyScrollMenu = cc.Menu.extend({
                ctor : function () {
                        this._super();
                        cc.associateWithNative(this, cc.Layer);
                        if ('touches' in sys.capabilities || sys.platform == "browser")
                                this.setTouchEnabled(true);
                        else if ('mouse' in sys.capabilities)
                                this.setMouseEnabled(true);
                },
                registerWithTouchDispatcher : function () {
                        Global.director.getTouchDispatcher().addTargetedDelegate(this, cc.MENU_HANDLER_PRIORITY + 1000, true);
                },
                onTouchBegan : function (touch, e) {
                        this.touchPY1 = touch.getLocation().y;
                        if (this._state != cc.MENU_STATE_WAITING || !this._visible || !this._enabled) {
                                return false;
                        }
                        for (var c = this._parent; c != null; c = c.getParent()) {
                                if (!c.isVisible()) {
                                        return false;
                                }
                        }
                        this._selectedItem = this._itemForTouch(touch);
                        if (this._selectedItem) {
                                this._state = cc.MENU_STATE_TRACKING_TOUCH;
                                this._selectedItem.selected();
                                return true;
                        }
                },
                onTouchMoved : function (touch, e) {
                        this.touchPY2 = touch.getLocation().y;
                        if (Math.abs(this.touchPY1 - this.touchPY2) > 0 && this._selectedItem) {
                                this._selectedItem.unselected();
                                this._selectedItem = null;
                        }
                },
                onTouchEnded : function (touch, e) {
                        if (this._selectedItem) {
                                this._selectedItem.unselected();
                                this._selectedItem.activate();
                                Global.audioEngine.playEffect(Res.Sounds.Main.click);
                        }
                        this._state = cc.MENU_STATE_WAITING;
                }
        });

MyScrollMenu.create = function () {
        var ret = new MyScrollMenu();

        if (arguments.length == 0) {
                ret.initWithItems(null, null);
        } else if (arguments.length == 1) {
                if (arguments[0]instanceof Array) {
                        ret.initWithArray(arguments[0]);
                        return ret;
                }
        }
        ret.initWithItems(arguments);
        return ret;
};


2)添加点击范围判断:
var scrollViewTestLayer = cc.Layer.extend({
                ctor : function () {
                        this._super();
                        cc.associateWithNative(this, cc.Layer);

                        if ('touches' in sys.capabilities || sys.platform == "browser")
                                this.setTouchEnabled(true);
                        else if ('mouse' in sys.capabilities)
                                this.setMouseEnabled(true);

                        var container = cc.LayerColor.create(cc.c4b(0, 0, 255, 255), 320, 360);
                        container.addChild(new MyScrollMenu() );

                        var scrollView = cc.ScrollView.create(cc.size(320, 300), container);
                        scrollView.setBounceable(true);
                        scrollView.setDirection(1);
                        scrollView.updateInset();

                        scrollView.setPosition(cc.p(0, 120));
                        scrollView.setContentOffset(cc.p(0, 0), true);

                        //scrollView.ignoreAnchorPointForPosition(false);

                        scrollView.setDelegate(this);

                        this.addChild(scrollView);
                },
                registerWithTouchDispatcher : function () {
                        Global.director.getTouchDispatcher().addTargetedDelegate(this, cc.MENU_HANDLER_PRIORITY - 100, true);
                },
                onTouchBegan : function (touch, e) {
                        //cc.log(touch.getLocation());
                        if (cc.rectContainsPoint(cc.rect(0, 120, 320, 300), touch.getLocation())) {
                                //cc.log(111111);
                                return false;
                        } else {
                                //cc.log(222222);
                                return true;
                        }
                },
                scrollViewDidScroll : function (view) {
                        //cc.log('scrollViewDidScroll');
                },
                scrollViewDidZoom : function (view) {
                        //cc.log('scrollViewDidZoom');
                }
        });


这些代码是经过好几天的研究得到的,请大家尊重别人的劳动成果,转载标明出处,谢谢。

转载于:https://www.cnblogs.com/cosiray/archive/2013/05/05/3061143.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/547932.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

lru调度算法例题_嵌入式必会!C语言最常用的贪心算法就这么被攻略了

01基本概念贪心算法是指在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,只做出在某种意义上的局部最优解。贪心算法不是对所有问题都能得到整体最优解,关键是贪心策略的选择,选择的…

Oracle数据库版本维护支持结束时间表以及数据库版本发行时间表

Oracle数据库版本支持结束时间表以及数据库版本发行时间表 数据库版本支持时间表: 大版本(点击查看详情)当前补丁集下一补丁集标准服务结束日期扩展服务结束日期注释12.1.0.X无12.1.0.2––基版本为 12.1.0.1。11.2.0.X11.2.0.4无2015年1月2…

【虚拟化实战】存储设计之一存储类型

Problem Statement存储设计是虚拟化设计的重要部分之一,确定合适的存储类型是展开存储设计的关键一步。FC/FCoE, iSCSI, NFS 甚至 Local Storage, 你会选择哪一种呢?参见下图。Requirements客户需要移植物理服务器到VMware虚拟化平台,很多物…

ztree 指定节点清空_节点操作

一.节点操作​ 1.DOM节点操作​ ①创建节点​ 语法:document.createElement("标签名");​ 注:只单纯的创建出来了一个元素节点对象,不包含内容、属性和样式。​ ②插入节点​ 在父元素内部末尾追加​ 语法:父…

GC 基础

如何定位垃圾 1. 引用计数法 为对象添加一个引用计数器,当对象增加一个引用时计数器加 1,引用失效时计数器减 1。引用计数为 0 的对象可被回收。 在两个对象出现循环引用的情况下,此时引用计数器永远不为 0,导致无法对它们进行…

离线部署 CDH 6.2 及使用 CDH 部署 Hadoop3 大数据平台集群服务

Cloudera Manager Cloudera Manager 分为两个部分:CDH和CM。 CDH是Cloudera Distribution Hadoop的简称,顾名思义,就是cloudera公司发布的Hadoop版本,封装了Apache Hadoop,提供Hadoop所有的服务,包括HDFS…

resize属性,使textarea在ff(火狐)中禁止拉伸

HTML 标签 textarea 在大部分浏览器中只要指定行(rows)和列(cols)属性,就可以规定 textarea 的尺寸,大小就不会改变,不过更好的办法是使用 CSS 的 height 和 width 属性,但是Chrome,Safari和Fir…

多线程分段下载文件

原理 先获取文件大小,然后分段分配任务给线程下载 在开始多线程下载前得先得知下载文件的大小,如果在之前的流程中并没有告知文件大小则可以使用HTTP请求方法 HEAD,这个请求方法类似于 GET 请求,只不过返回的响应中没有具体的内…

玛酷机器人课程视频_建阳玛酷机器人丨2019WRO机器人比赛凯旋而归!

2019年7月福州WRO青少年机器人交流RA 7月27-28日,经过角逐, WRO华南赛区(福州站)在福州中加学校顺利落幕。 本次大赛设置了山火营救、无人速递、城市救援、RA常规赛、足球世界杯、WEDO常规项目、WEDO小手拼出大世界等七个单项比赛。 …

kindeditor图片批量上传失败问题

2019独角兽企业重金招聘Python工程师标准>>> 问题:在演示版中批量上传没有问题,放到我们后台系统中,就上传不成功。 排查:逐步验证发现根本没有http到upload上传文件中,往上找。。。终于碰到是后台管理员验…

presto集群安装

presto集群安装 整合hive 张映 发表于 2019-11-07 分类目录: hadoop/spark/scala 标签:hive, presto Presto是一个运行在多台服务器上的分布式系统。 完整安装包括一个coordinator(调度节点)和多个worker。 由客户端提交查询&…

wps 复制流程图_简单三步,用WPS轻松完成一个又大气又好看的流程图!

流程图是工作中经常需要用到的图形,使用 WPS 可以方便地创建流程图。创建的流程图保存在云文档后,可以随时插入 WPS 的其他组件。新建流程图文件流程图可以从 WPS 的其他组件中创建,如 WPS 文字、WPS 表格等,也可以单独创建。流程…

CAS实现原子操作的三大问题

在Java中可以通过锁和CAS的方式实现原子操作。 CAS实现原子操作的三大问题 1.ABA问题 CAS需要在操作值的时候,检测值有没有发生变化,如果没有发生变化则更新。 但是如果一个值原来是A,变成B,又变成A,那么使用CAS进行…

Tez 0.9安装部署+hive on tez配置 + Tez-UI

Tez说明 将xyz替换为您正在使用的tez发行版号。例如0.5.0。对于Tez版本0.8.3和更高版本,Tez需要Apache Hadoop版本为2.6.0或更高版本。对于Tez版本0.9.0及更高版本,Tez需要Apache Hadoop版本为2.7.0或更高版本。 关于版本 1.Hadoop 2.7.0(我…

iphone 字体

今天在网上找了下,iphone的UITextView字体类型的设置。现总结如下,如有误,欢迎指正。 [textView setFont:[UIFont fontWithName:"TrebuchetMS-Italic" size:18]];但是字体的类型名不好找,总结下有这么些类型&#xff1a…

启动成功浏览器显示不了_移动端利用chrome浏览器在PC端进行调试方法

由于最近工作中遇到需要在电脑上调试手机端的功能和样式,之前也没有遇到过,所以就各种百度和试验。最后终于功夫不负有心人,成功了。(那一刻心情真滴很鸡冻啊~~~~~~~~~)。所以暂时记录下来。以免鸡冻过度再给忘记了。好,接下来就是…

面向对象的相关面试题

1.面向对象的特征有哪些方面? 主要有封装,继承,多态,也可以加上个抽象. 封装 封装是保证软件部件具有优良的模块性的基础,封装的目标就是要实现软件部件的高内聚,低耦合,防止程序相互依赖性而带来的变动影响.在面对对象的编程语言中,对象是封装的最基本的单位,面向对象的封装比…

在maven本地仓库导入jar包

# Dfile jar包所在位置 DgroupId 指定groupId DartifactId 指定artifactId Dversion 指定版本 mvn install:install-file -DfileC:\Users\zlf\Desktop\mybatis-main\target\mybatis.jar -DgroupId"cn.bugstack.middleware" -DartifactIdmybatis -Dversion"1.0.…

Flink完全分布式集群安装

Flink支持完全分布式模式,这时它由一个master节点和多个worker节点构成。在本节,我们将搭建一个如下的三个节点的Flink集群。 一、Flink集群安装、配置和运行 Flink完全分布式集群搭建步骤如下: 1、配置从master到worker节点的SSH无密登录&…

一个4体低位交叉的存储器_前交叉韧带术后关节粘连的康复策略

ACL术后粘连的康复现状在国外,前交叉韧带ACL重建术后关节粘连的发生率为1%。在国内,由于多数医院在行前交叉韧带重建术后,对患者缺少及时、系统、科学的康复治疗,大部分患者由此易发生关节粘连,而往往关节粘连造成的功…