lua如何用widget基类做一个可触摸的控件?

感谢版主昨天的回复,控件不显示是我的一个失误造成的。
现在有新的问题想请教
我想写一个widget控件,里面有几张imageView,可以替换imageview的texture。
所以我自定义了一个widget控件,里面放了几张imageview,也可以加到layer上正常显示了。
重点分割线

重点是触控事件无法响应,我就是使用addTouchEventListener 不成功,没有回调相应的函数。
版主给的示例代码我看过了,可能是我写的控件无法接受到触摸,暂时不明白哪里错误
可能是我哪里缺失了,所以希望哪位大神写一个简单的示例代码给我研究一下 ,非常感谢

代码放9楼了 谢谢

突然想到一个问题,可能你lua的事件注册有问题,希望你提供完整的代码段。

没有什么特别的代码了,我基本就这样写的。然后在外面调用
local icon = createIcon()
icon:addTouchEventListener(Scene.TouchCallback)

local Scene:TouchCallback()

 print "touch!!!"

end

没有什么特别的代码了,我基本就这样写的。然后在外面调用
local icon = createIcon()
icon:setTouchEnabled(true)
icon:addTouchEventListener(Scene.TouchCallback)

local Scene:TouchCallback()

 print "touch!!!" 

end

我也觉得可能是我的问题,但是没有很详细的教程说明,我又是新人,所以完全不知道该怎么写比较好呢

看这里的示例:

function UIButtonPressedActionTest:initExtend()

self:init()

local widgetSize = self._widget:getSize()
    

self._displayValueLabel = ccui.Text:create()
self._displayValueLabel:setText("No Event")
self._displayValueLabel:setFontName(font_UIButtonTest)
self._displayValueLabel:setFontSize(32)
self._displayValueLabel:setAnchorPoint(cc.p(0.5, -1))
self._displayValueLabel:setPosition(cc.p(widgetSize.width / 2.0, widgetSize.height / 2.0))
self._uiLayer:addChild(self._displayValueLabel)
    
local alert = ccui.Text:create()
alert:setText("Button Pressed Action")
alert:setFontName(font_UIButtonTest)
alert:setFontSize(30)
alert:setColor(cc.c3b(159, 168, 176))    
alert:setPosition(cc.p(widgetSize.width / 2.0, widgetSize.height / 2.0 - alert:getSize().height * 1.75))
self._uiLayer:addChild(alert)

local function touchEvent(sender,eventType)
    if eventType == ccui.TouchEventType.began then
        self._displayValueLabel:setText("Touch Down")
    elseif eventType == ccui.TouchEventType.moved then
        self._displayValueLabel:setText("Touch Move")
    elseif eventType == ccui.TouchEventType.ended then
        self._displayValueLabel:setText("Touch Up")
    elseif eventType == ccui.TouchEventType.canceled then
        self._displayValueLabel:setText("Touch Cancelled")
    end
end  
    
local button = ccui.Button:create()
button:setTouchEnabled(true)
button:setPressedActionEnabled(true)
button:loadTextures("cocosui/animationbuttonnormal.png", "cocosui/animationbuttonpressed.png", "")
button:setPosition(cc.p(widgetSize.width / 2.0, widgetSize.height / 2.0))
button:addTouchEventListener(touchEvent)        
self._uiLayer:addChild(button)

end

请不要调用类似(Scene.TouchCallback) 监听,将这个监听设置为local function,然后监听为TouchCallback

您的这个方法我也想过,就是往自定义的widget里加一个button对吗?但是这个有一个小小的问题,就是如果我这个widget单独放在一个.lua文件中,button回调的方法应该怎么封装呢?写在单独的文件中还是写在调用widget.lua的文件中???

还有 我写的控件可能不能放button进来,因为其实这个是一个拼接图片的控件,类似头像的功能。如果加button,是不是必须给buttonloadtexture?那样会不会很不爽,完全没有自定义widget的感觉了啊

不对,我收的是事件监听的方法
不要用icon:addTouchEventListener(Scene.TouchCallback)

使用icon:addTouchEventListener(TouchCallback)

这样吧,我给你我的测试代码,你只要能让他跑通,触摸回调有效果就好 谢谢
需要注意加载资源的路径


main.lua
——————————————————————————

function G__TRACKBACK(msg)
print("----------------------------------------")
print(“LUA ERROR: " … tostring(msg) … “\n”)
print(debug.traceback())
print(”----------------------------------------")
end

require “extern”

local ZXScene = class(“ZXScene”, function()
return cc.Scene:create()
end
)

ZXScene.__index = ZXScene
ZXScene._bg = nil

function ZXScene:createZXScene()

local zxScene = ZXScene.new()
zxScene:initScene()
return zxScene

end

function ZXScene:initScene()

self._layer = cc.Layer:create()
self:addChild(self._layer)

require "src/hello2"

local iconInfo = {id = 1, bg = "res/touxiang/dikuang.png", head = "res/touxiang/touxiang/head1.png"}

local icon = createIcon(iconInfo)

icon:addTouchEventListener(ZXScene.iconTouchCallback)

self._layer:addChild(icon)

icon:setPosition(200,200)

end

function ZXScene:iconTouchCallback(eventType)

print "touch ssssss"

end

function __main()

local zxScene = ZXScene:createZXScene()

–runScene
if cc.Director:getInstance():getRunningScene() then
cc.Director:getInstance():replaceScene(zxScene)
else
cc.Director:getInstance():runWithScene(zxScene)
end
end

__main()

xpcall(Main, G__TRACKBACK)


hello2.lua


IconInfo = IconInfo or {}
IconInfo.id = nil
IconInfo.bg = nil
IconInfo.head = nil

Icon = class(“Icon”, function()
return ccui.Widget:create()
end
)

Icon.__index = Icon
Icon._id = nil

– Icon._layer = nil
Icon._bg = nil
Icon._head = nil

function createIcon(IconInfo)

local Icon = Icon.new()
Icon:initIcon(IconInfo)
return Icon

end

function Icon:initIcon(IconInfo)

– self._layer = cc.Layer:create()
– self:addChild(self._layer)
– self:init()

self._bg = ccui.ImageView:create()
local Bg = string.format("%s", IconInfo.bg)
self._bg:loadTexture(Bg)
self:addChild(self._bg)
local bgSize = self._bg:getSize() 

– self._bg:setPosition(cc.p(bgSize.width / 2,bgSize.height / 2))

self._head = ccui.ImageView:create()
local Head = string.format("%s", IconInfo.head)
self._head:loadTexture(Head)

– self._head:setPosition(cc.p(bgSize.width / 2,bgSize.height / 2))
self._bg:addChild(self._head)

self._id = ccui.Text:create()
self._id:setText(IconInfo.id)
self._id:setFontSize(10)

– self._id:setPosition(cc.p(bgSize.width / 2,bgSize.height / 2))
self._bg:addChild(self._id)

self:setTouchEnabled(true)

end

这个只要弄2张图片就能直接跑起来的代码,麻烦您帮忙测试下吧 谢谢。
看看是哪里出错了 ,非常感谢,真的很需要你们的帮助

版主大大问题求解决,谢谢。