博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
cocos2dx ScrollView 测试一 触摸事件优先级和自动调整
阅读量:7224 次
发布时间:2019-06-29

本文共 6789 字,大约阅读时间需要 22 分钟。

直接上代码

MyScrollView.h

1 // 2 //  MyScrollView.h 3 //  ScrollViewTest 4 // 5 //  Created by HanHongmin on 14-1-1. 6 // 7 // 8  9 #ifndef __ScrollViewTest__MyScrollView__10 #define __ScrollViewTest__MyScrollView__11 12 #include "cocos2d.h"13 #include "cocos-ext.h"14 using namespace cocos2d;15 using namespace cocos2d::extension;16 17 class MyScrollView:public CCScrollView{18 public:19     static MyScrollView* create();20     static MyScrollView* create(CCSize size);21     virtual bool ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent);22     virtual void ccTouchMoved(CCTouch *pTouch, CCEvent *pEvent);23     virtual void ccTouchEnded(CCTouch *pTouch, CCEvent *pEvent);24     virtual void adjustScrollView();25 };26 27 #endif /* defined(__ScrollViewTest__MyScrollView__) */
View Code

MyScrollView.cpp

1 // 2 //  MyScrollView.cpp 3 //  ScrollViewTest 4 // 5 //  Created by HanHongmin on 14-1-1. 6 // 7 // 8  9 #include "MyScrollView.h"10 11 12 MyScrollView* MyScrollView::create()13 {14     MyScrollView* pRet = new MyScrollView();15     if (pRet && pRet->init())16     {17         pRet->autorelease();18     }19     else20     {21         CC_SAFE_DELETE(pRet);22     }23     return pRet;24 }25 26 MyScrollView* MyScrollView::create(CCSize size)27 {28     MyScrollView* pRet = new MyScrollView();29     if (pRet && pRet->initWithViewSize(size, NULL))30     {31         pRet->autorelease();32     }33     else34     {35         CC_SAFE_DELETE(pRet);36     }37     return pRet;38 }39 40 41 42 bool MyScrollView::ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent){43     bool b = CCScrollView::ccTouchBegan(pTouch, pEvent);44     CCLog("MyScrollView::ccTouchBegan");45     return b;46 }47 void MyScrollView::ccTouchMoved(CCTouch *pTouch, CCEvent *pEvent){48     CCScrollView::ccTouchMoved(pTouch, pEvent);49     CCLog("MyScrollView::ccTouchMoved");50     //阻止传递51 }52 void MyScrollView::ccTouchEnded(CCTouch *pTouch, CCEvent *pEvent){53     CCScrollView::ccTouchEnded(pTouch, pEvent);54     CCLog("MyScrollView::ccTouchEnded");55     adjustScrollView();56     //不在往下传递事件57 }58 59 void MyScrollView::adjustScrollView(){60     // 关闭CCScrollView中的自调整61     this->unscheduleAllSelectors();62     63     int x = this->getContentOffset().x;64     int offset = (int) x % 640;65     // 调整位置66     CCPoint adjustPos;67     // 调整动画时间68     float adjustAnimDelay = 0.15f;69     70     if (offset < -320) {
//翻到下一页71 // 计算下一页位置,时间72 adjustPos = ccpSub(this->getContentOffset(), ccp(640 + offset, 0));73 }74 else {
//留在当前页75 // 计算当前页位置,时间76 adjustPos = ccpSub(this->getContentOffset(), ccp(offset, 0));77 }78 if(adjustPos.x< -(this->getContentSize().width-640)){
//超过最后一页的限制79 adjustPos = CCPointMake(-(this->getContentSize().width-640), 0);80 }81 // 调整位置82 this->setContentOffsetInDuration(adjustPos, adjustAnimDelay);83 }
View Code

HelloWorldScene.h

1 #ifndef __HELLOWORLD_SCENE_H__ 2 #define __HELLOWORLD_SCENE_H__ 3  4 #include "cocos2d.h" 5 #include "cocos-ext.h" 6 #include "VisibleRect.h" 7 #include "MyScrollView.h" 8 using namespace cocos2d; 9 using namespace cocos2d::extension;10 11 class HelloWorld : public CCLayer,public CCScrollViewDelegate12 {13 public:14     virtual bool init();15     static cocos2d::CCScene* scene();16     void buttonClick();17     18     virtual void scrollViewDidScroll(CCScrollView* view);19     virtual void scrollViewDidZoom(CCScrollView* view);20 21     CREATE_FUNC(HelloWorld);22 protected:23     MyScrollView *_scrollView;24 };25 26 #endif // __HELLOWORLD_SCENE_H__
View Code

HelloWorldScene.cpp

1 #include "HelloWorldScene.h" 2  3 USING_NS_CC; 4  5 CCScene* HelloWorld::scene() 6 { 7     CCScene *scene = CCScene::create(); 8     HelloWorld *layer = HelloWorld::create(); 9     scene->addChild(layer);10     return scene;11 }12 13 // on "init" you need to initialize your instance14 bool HelloWorld::init()15 {16     if ( !CCLayer::init() )17     {18         return false;19     }20     CCSprite *bg = CCSprite::create("Default-568h@2x.png");21     bg->setPosition(VisibleRect::center());22     this->addChild(bg);23     24     CCMenuItemImage *button = CCMenuItemImage::create("Icon-144.png", "Icon-144.png", this, menu_selector(HelloWorld::buttonClick));25     CCMenu *menu = CCMenu::create(button,NULL);26     menu->setPosition(CCPointZero);27     button->setPosition(ccp(VisibleRect::leftTop().x+72,VisibleRect::leftTop().y-72));28     this->addChild(menu);29     30     CCLayer *container = CCLayer::create();31     container->setAnchorPoint(CCPointZero);32     container->setPosition(CCPointZero);33     34     CCMenuItemImage *sp = CCMenuItemImage::create("HelloWorld.png", "HelloWorld.png",this,menu_selector(HelloWorld::buttonClick));35     sp->setPosition(VisibleRect::center());36     37     CCMenuItemImage *sp1 = CCMenuItemImage::create("HelloWorld1.png", "HelloWorld1.png",this,menu_selector(HelloWorld::buttonClick));38     sp1->setPosition(ccp(VisibleRect::center().x + VisibleRect::right().x,VisibleRect::center().y ));39     40     CCMenuItemImage *sp2 = CCMenuItemImage::create("HelloWorld2.png", "HelloWorld2.png",this,menu_selector(HelloWorld::buttonClick));41     sp2->setPosition(ccp(VisibleRect::center().x + VisibleRect::right().x * 2,VisibleRect::center().y ));42 43     CCMenu *menu2 = CCMenu::create(sp,sp1,sp2,NULL);44     menu2->setPosition(CCPointZero);45     menu2->setTouchPriority(2);46     47     container->addChild(menu2);48     container->setContentSize(CCSizeMake(640*3, 1136));//重要,默认是屏幕大小,可以去看源码49     CCLog("container contentsize:%f,%f",container->getContentSize().width,container->getContentSize().height);50     51     52     _scrollView = MyScrollView::create(CCSizeMake(640, 1136));53     //_scrollView->setContentSize();54     _scrollView->setDelegate(this);55     _scrollView->setTouchPriority(1);56     _scrollView->setContainer(container);57     _scrollView->setDirection(kCCScrollViewDirectionHorizontal);58     59     this->addChild(_scrollView);60     61     return true;62 }63 64 void HelloWorld::buttonClick(){65     float a = _scrollView->getContentOffset().x;66     if((int)a%640!=0){67         CCLog("**************************isDragging");68     }else{69         CCLog("##########################buttonClick#");70     }71 }72 73 void HelloWorld::scrollViewDidScroll(CCScrollView* view){74     CCLog("scrollViewDidScroll");75 }76 void HelloWorld::scrollViewDidZoom(CCScrollView* view){77     CCLog("scrollViewDidZoom");78 }
View Code

 

ScrollView和Menu的触摸事件优先级有点冲突,Menu的值低优先级高,如果不改的话在Menu拖动的话没反应,这应该不是我们想要的。

改了它的优先级之后,拖动可以了,但是拖动后也会触发Menu的点击。

!!!!!!!!肿么办...据说可以阻断事件的传播,但是我不会弄,谁要会请告诉我。!!!!!!!!

变相实现了一下,在按钮的事件中判断ScrollView是否滚动到位,不到位啥也不干。

 

另外,ScrollView的默认调整被关掉了,自己写了一下,默认的只会自动调整头尾。

转载于:https://www.cnblogs.com/hanhongmin/p/3501193.html

你可能感兴趣的文章
java中自动生成XML文件
查看>>
Docker 数据卷,数据卷容器详细介绍
查看>>
VS2015编译Live555流媒体服务器
查看>>
依赖属性之“风云再起”三
查看>>
利用K8S技术栈打造个人私有云(连载之:K8S资源控制)
查看>>
mysql内存过高解决办法
查看>>
CentOS7 Ceph RBD CephFS 存储
查看>>
[转载] 白话解释 非对称加密,电子签名,电子证书,根证书,HTTPS,PKI 到底是什么...
查看>>
编译报错 /usr/bin/ld: cannot find -lc 解决
查看>>
系统自带的系统工具
查看>>
浅谈专心只学一门C#的优缺点[邀月补充:一精胜于十专]
查看>>
UWA资源检测与分析支持Unity 5.3!
查看>>
IOT
查看>>
记录一次raid故障后的恢复和回迁数据全过程
查看>>
需求管理之客户需求何时休?
查看>>
crs_register ora.<node>.LISTENER_<node>.lsnr.cap
查看>>
ghld data format
查看>>
VMM系列之使用VMM服务器构建 Hyper-V主机(4)
查看>>
Application Virtualization 4.5 部署之四独立模式
查看>>
linux sed命令详解
查看>>