Why Click event does not respond

auto bb = cocos2d::ui::ImageView::create("xxx.png", Widget::TextureResType::LOCAL);
	bb->setPosition(VisibleRect::center());
	bb->addTouchEventListener(CC_CALLBACK_2(HelloWorld::touchEvent, this));
	this->addChild(bb);

void HelloWorld::touchEvent(Ref *pSender, Widget::TouchEventType type)
{
	switch (type)
	{
	case Widget::TouchEventType::BEGAN:
		break;
	case Widget::TouchEventType::MOVED:
		break;
	case Widget::TouchEventType::ENDED:
	{
	}
	break;
	case Widget::TouchEventType::CANCELED:
		break;
	default:
		break;
	}
}

When I click the button, The event does not respond.
In HelloWorldScene demo with 3.17.1 cocos2d-x C++.

The example in cpp-tests works for me:

 ImageView* imageView = ImageView::create("cocosui/ccicon.png");


 imageView->setTouchEnabled(true);
 imageView->addTouchEventListener([=](Ref* sender, Widget::TouchEventType type){
            if (type == Widget::TouchEventType::ENDED) {
                if (imageView->isScale9Enabled())
                {
                    // code
                }
                else
                   // code
            }
        });

Oh ! thanks man.

I create a layer in hello world scene then add imageview in layer, I found that the click event not response.

show more code?

auto layer = EightBallLayer::create();
this->addChild(layer);

#include "EightBallLayer.h"

USING_NS_CC;
using namespace cocos2d::ui;

EightBallLayer::EightBallLayer()
{

}

EightBallLayer::~EightBallLayer()
{

}

bool EightBallLayer::init()
{
//BilliardBaseLayer::initView();

auto bb = ImageView::create("gameBilliards/eightBall/eightBall_SliderBar_Power.png", Widget::TextureResType::LOCAL);
bb->setTouchEnabled(true);
bb->setPosition(VisibleRect::center());
bb->addTouchEventListener(CC_CALLBACK_2(EightBallLayer::touchEvent, this));
this->addChild(bb);

return true;

}

void EightBallLayer::touchEvent(cocos2d::Ref pSender, Widget::TouchEventType type)
{
Node
sender = dynamic_cast<Node*>(pSender);
if (sender == nullptr)
return;
int tag = sender->getTag();
switch (type)
{
case Widget::TouchEventType::BEGAN:
sender->setScale(1.05f);
break;
case Widget::TouchEventType::MOVED:

	break;
case Widget::TouchEventType::ENDED:
	sender->setScale(1.0f);
	AudioMgr::getInstance()->playClickEffect();
	break;
case Widget::TouchEventType::CANCELED:
	sender->setScale(1.0f);
	break;
default:
	break;
}

}

void EightBallLayer::onEnter()
{

}

void EightBallLayer::onExit()
{

}

#ifndef __EIGHTBALLLAYER_H__

#define EIGHTBALLLAYER_H

#include “…/common/VisibleRect.h”

#include “cocos2d.h”
#include “cocostudio/CocoStudio.h”

class EightBallLayer : public cocos2d::Layer
{
public:
EightBallLayer();
~EightBallLayer();

virtual bool init() override;

void touchEvent(cocos2d::Ref* sender, cocos2d::ui::Widget::TouchEventType type);

CREATE_FUNC(EightBallLayer);

virtual void onEnter() override;
virtual void onExit() override;

private:
cocos2d::Node* _node;
};

#endif

Its pretty hard to make sense of this can you format it a bit better please. You can use markdown syntax and code blocks

It’s layer head:

=============================================================================

#ifndef EIGHTBALLLAYER_H
#define EIGHTBALLLAYER_H
#include “…/common/VisibleRect.h”
#include “cocos2d.h”
#include “cocostudio/CocoStudio.h”
#include “ui\UIImageView.h”
class EightBallLayer : public cocos2d::Layer
{
public:
EightBallLayer();
~EightBallLayer();
virtual bool init() override;
void touchEvent(cocos2d::Ref* sender, cocos2d::ui::Widget::TouchEventType type);
CREATE_FUNC(EightBallLayer);
virtual void onEnter() override;
virtual void onExit() override;
private:
cocos2d::Node* _node;
};
#endif

=============================================================================

It's cpp file.

=============================================================================

#include “EightBallLayer.h”
USING_NS_CC;
using namespace cocos2d::ui;
EightBallLayer::EightBallLayer()
{
}
EightBallLayer::~EightBallLayer()
{
}
bool EightBallLayer::init()
{
auto bb = ImageView::create(“xxx.png”, Widget::TextureResType::LOCAL);
bb->setTouchEnabled(true);
bb->setPosition(VisibleRect::center());
bb->addTouchEventListener(CC_CALLBACK_2(EightBallLayer::touchEvent, this));
this->addChild(bb);
return true;
}
void EightBallLayer::touchEvent(cocos2d::Ref pSender, Widget::TouchEventType type)
{
Node
sender = dynamic_cast<Node*>(pSender);
if (sender == nullptr)
return;
int tag = sender->getTag();
switch (type)
{
case Widget::TouchEventType::BEGAN:
sender->setScale(1.05f);
break;
case Widget::TouchEventType::MOVED:
break;
case Widget::TouchEventType::ENDED:
sender->setScale(1.0f);
//AudioMgr::getInstance()->playClickEffect();
break;
case Widget::TouchEventType::CANCELED:
sender->setScale(1.0f);
break;
default:
break;
}
}
void EightBallLayer::onEnter()
{
}
void EightBallLayer::onExit()
{
}

=============================================================================

In hellow world scene.

=============================================================================

auto layer = EightBallLayer::create();
this->addChild(layer);

=============================================================================

Then I found that the event not response.

Sorry I tried my best, I can’t adjust this format.

So what are you trying to touch? The ImageView or the Layer?

ImageView, But the breakpoint has never hit.

Try running Cpp-tests

It’s Okay, But the base classes are always scene in cpp test cases. I tried in layer it’s not work so that I don’t know why.

Attach your whole class and header please. If I can drop them into a test project I will.

I will upload the attachment tomorrow, the computer is not around. Thanks.

Sure, I will be happy to test this out.

After studying for one morning, it was originally necessary to call node’s onEnter and onExit in the onEnter and onExit functions in the derived class.

So what is the status? Do I need to test this or not?