touch-screen_FloatingActionButton

touch-screen_FloatingActionButton在做练习时,触控失灵,看源码后fanx直接在init

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

在做练习时,触控失灵,看源码了解下触控事件.

练习中的操作:直接在CClayer子类的init里 this->setTouchEnabled(true);

覆盖的事件处理方法

	virtual bool ccTouchBegan(CCTouch* touch, CCEvent* event);
	virtual void ccTouchMoved(CCTouch* touch, CCEvent* event);
	virtual void ccTouchEnded(CCTouch* touch, CCEvent* event);	

结果按键没反应

因为setTouchEnabled(true); 开启多点触摸,  而事件处理方法是针对单点的,所以不行.

解决方法1.

覆盖事件多点处理方法

	 // default implements are used to call script callback if exist
    	virtual void ccTouchesBegan(CCSet *pTouches, CCEvent *pEvent);
   	virtual void ccTouchesMoved(CCSet *pTouches, CCEvent *pEvent);
    	virtual void ccTouchesEnded(CCSet *pTouches, CCEvent *pEvent);
   	virtual void ccTouchesCancelled(CCSet *pTouches, CCEvent *pEvent);

从参数类型CCSet可以看出此参数是集合,应该是多个按的点.

解决方法2.

覆盖onEnter(),加上单点事件委托

onEnter()
{
	CCDirector* pDirector = CCDirector::sharedDirector();
	pDirector->getTouchDispatcher()->addTargetedDelegate(this, 0, true);
	CCLayer::onEnter();//这个要要加
}
CClayer::onEnter()
{
	....
    if (m_bTouchEnabled)	//这个m_bTouchEnabled就是setTouchEnabled(true)设置的
    {
        this->registerWithTouchDispatcher();//会设置Standard Touch Delegate,这也是为什么CCLayer默认采纳这种方式
    }
	.....
}

touch 事件分发顺序

cocos2d-x 首先派发事件给CCTargetedTouchDelegate, 再派发事件给CCStandardTouchDelegate。对于相同类型的TouchDelegate, 则是根据注册的优先级

来确定派发先后顺序。如果优先级也一样,则按照注册的顺序派发事件。

————————————————————————————————————————-

下面是别人总结分享的   http://www.cnblogs.com/pengyingh/articles/2435160.html

Cocos2d 开发中提供了两种touch处理方式,Standard Touch Delegate Targeted Touch Delegate方式(参见CCTouchDelegateProtocol.h中源代码),CCLayer默认是采用第一种方式(参见CCLayer的 registerWithTouchDispatcher方法)。

CCLayer子类中要能接收touch事件,首先需要激活touch支持,在init方法中设置isTouchEnabled值为YES。

Standard Touch Delegate(CCLayer默认采纳这种方式)

Standard方法中用户需要重载四个基本的touch处理方法,如下:

  1. -(void) ccTouchesBegan:(NSSet *)touches withEvent:(UIEvent *)event; 

touch事件发生时,会调用该方法响应touch事件。如果是单点touch,则只需要调用 UITouch *touch = [touches anyObject],就可以获取touch对象;如果需要响应多点 touch,则需要调用[[event allTouches] allObjects]返回一个UITouch的NSArray对象,然后使用NSArray的objectAtIndex依次访问各个UITouch对象。

为了获取UITouch对象的坐标(假设该UITouch名称为touch),调用[touch locationInView: [ touch view]]会返回一个UIView相关的坐标viewPoint。

使用Cocos2d的新建应用程序向导创建一个新的cocos2d application时,在xxxAppDelegate类的applicationDidFinishLaunching方法中CCDirector会将UIView转换为支持OpenGL ES的EAGLView。此时,我们还需要将前面获取的UIView中的viewPoint转换为EAGLView坐标,调用[[CCDirector sharedDirector] convertToGL: viewPoint]即可实现。

  1. -(void) ccTouchesEnded:(NSSet *)touches withEvent:(UIEvent *)event;  
  2. -(void) ccTouchesMoved:(NSSet *)touches withEvent:(UIEvent *)event;   
  3. -(void) ccTouchesCancelled:(NSSet*)touch withEvent:(UIEvent *)event;  

这三个方法和ccTouchesBegan类似。

Targeted Touch Delegate方式

在standard方式中的响应处理事件处理的都是NSSet,而 targeted方式只处理单个的UITouch对象,在多点触摸条件下,应该采纳standard方式。在使用targeted方式之前需要重写CCLayer中的registerWithTouchDispatcher方法:

  1. //记得在头文件中导入“CCTouchDispatcher.h”  
  2.  
  3. -(void) registerWithTouchDispatcher {   
  4.        [[CCTouchDispatcher sharedDispatcher] addTargetedDelegate:self priority:0 swallowsTouches:YES];  
  5.  } 

targeted方式中用户需要重载4个基本的处理方法,其中ccTouchBegan必须重写,其他三个是可选的。

  1. – (BOOL)ccTouchBegan:(UITouch *)touch withEvent:(UIEvent *)event; (必须实现)  
  2. – (void)ccTouchMoved:(UITouch *)touch withEvent:(UIEvent *)event;  
  3. – (void)ccTouchEnded:(UITouch *)touch withEvent:(UIEvent *)event;  
  4. – (void)ccTouchCancelled:(UITouch *)touch withEvent:(UIEvent *)event; 

每次touch事件发生时,先调用ccTouchBegan方法,该方法对每个UITouch进行响应并返回一个BOOL值,若为YES,则后续的ccTouchMoved、ccTouchEnabled和ccTouchCancelled才会接着响应。

多点触摸支持

在xxxAppDelegate类的applicationDidFinishLaunching方法中加入下面代码

  1. [glView setMultipleTouchEnabled:YES]; 
 
 
 
关于swallowsTouches

[[CCTouchDispatcher  sharedDispatcher] addTargetedDelegate:self priority:kCCMenuTouchPriority swallowsTouches:YES];   

如果 swallowsTouches:YES && touch begin return  yes 

        那么他的move 和end就接受,,别的类就不再接受了。

 如果swallowsTouches:NO &&begin return  yes

        那么他的move 和end就接受,别的类就仍然可以接受。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/179054.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • Modelsim-win32-6.6d 破解安装教程

    Modelsim-win32-6.6d 破解安装教程1、准备文件  modelsim-win32-6.6d-se.exe 2、安装步骤·(安装前把杀毒软件关闭)双击文件 modelsim-win32-6.6d-se.exe(注:安装路径不要有中文)点击Next 点击Browser ,建议安装目录改成自己新建在D盘下  点击Next—->Agree —–>等待安装 安…

  • MySQL的安装和配置(超详细图文教程)「建议收藏」

    MySQL的安装和配置(超详细图文教程)「建议收藏」数据库的安装1.打开下载的mysql安装文件双击解压缩,运行“mysql-5.5.40-win32.msi”。2.选择安装类型,有“Typical(默认)”、“Complete(完全)”、“Custom(用户自定义)”三个选项,选择“Custom”,按“next”键继续。3.点选“Browse”,手动指定安装目录。4.填上安装目录,我的是“d:\ProgramFiles(x86)…

  • pycharm中文版怎么配置python环境_python怎么加编译器

    pycharm中文版怎么配置python环境_python怎么加编译器python环境配置:1.系统自带的python.exe或者自己下载的2.下载anaconda自带的python.exepycharm中如何使用环境:选择File->setting->PythonInterpreter->点右边的设置标志Add->然后可以选择虚拟环境,这个是选择系统自带的python.exe或者选择Conda环境,有新建环境和已存在的环境,点新建环境可以直接处男建一个conda环境,python版本也可以指定,自动下载。已存在的环境的话就是

  • 书包网小说多线程爬虫[通俗易懂]

    书包网小说多线程爬虫[通俗易懂]书包网是个很好的小说网站,提供了小说txt下载,并且网站后端高并发,不用担心随便抓一下把网站抓崩了既然如此,何不拿来练手爬虫项目呢。直接上代码把,此多线程爬虫支持爬取各种这样类似的网站,关键需要网站支持高并发,否则分分钟崩了。毕竟5分钟一本18mb的小说,属于超级快的那种了fromlxmlimportetreeimportrequestsfromthreadi…

  • CSS3选择器(全部)[通俗易懂]

    CSS3选择器(全部)[通俗易懂]CSS3选择器再CSS2.1选择器的基础上增加了属性选择器、伪类选择器、过滤选择器,减少了对HTML类名或ID名的依赖,避免了对HTML结构的干扰,让编写代码更加轻松。1,基本选择器(1)标签选择器(类型选择器)      统一定义常用标签的基本样式。​<!DOCTYPEhtml><htmllang="en"><head>…

  • Java 判断闰年 两种方法

    Java 判断闰年 两种方法方法一:publicclassBissextile{ booleanbissextile(intyear){//创建boolean类型的方法 if(year%4==0&&year%100!=0||year%400==0){//平闰年判断算法 returntrue; } else{ returnfa…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号