用Slider好像只能拖动,不能点击(或说触摸),求各位大神赐教!
哭死,没有人来吗?
监测点击事件,点击到滑动条上时根据点击位置设置滑动条的位置
就是一定要自己写咯,这部分。
有没有其他现成的控件可以实现的?
大神,按如果要监听的话,怎么写?
slider不是有 OnTouchBegan 什么之类的函数吗?
要用到?
谢谢,不过看完还是没懂要怎么做监听
在layer上的OnTouchBegan里面判断是否点击在滑动条的位置
恩恩,折腾了好久,知道怎么弄了,谢谢!:867:
结一下贴。
最后我通过新建一个TouchSlider类,继承Slider,并重写 hitTest(const Vec2 &pt)即可。
以下贴出代码,写得不好…
《TouchSlider.h》
#ifndef TOUCH_SLIDER_H
#define TOUCH_SLIDER_H
#include “ui/UISlider.h”
class TouchSlider : public cocos2d::ui::Slider
{
public:
TouchSlider();
~TouchSlider();
/** Create a slider widget.
*
* @return An autoreleased Slider object.
*/
static TouchSlider* create();
/** Create a slider widget with bar texture, ball texture and texture resource type.
*
* @param barTextureName Bar texture file name.
* @param normalBallTextureName Ball texture file name.
* @param resType Texture resource type.
* @return An autoreleased Slider object.
*/
static TouchSlider* create(const std::string& barTextureName,
const std::string& normalBallTextureName,
TextureResType resType = TextureResType::LOCAL);
//override the widget's hitTest function to perfom its own
virtual bool hitTest(const cocos2d::Vec2 &pt) override;
};
#endif
《TouchSlider.cpp》
#include “TouchSlider.h”
#include “ui/UIScale9Sprite.h”
#include “ui/UIHelper.h”
#include “2d/CCSprite.h”
USING_NS_CC;
TouchSlider::TouchSlider() : Slider()
{
}
TouchSlider::~TouchSlider()
{
_sliderEventListener = nullptr;
_sliderEventSelector = nullptr;
}
TouchSlider* TouchSlider::create()
{
TouchSlider* widget = new (std::nothrow) TouchSlider();
if (widget && widget->init())
{
widget->autorelease();
return widget;
}
CC_SAFE_DELETE(widget);
return nullptr;
}
TouchSlider* TouchSlider::create(const std::string& barTextureName,
const std::string& normalBallTextureName,
TextureResType resType)
{
TouchSlider* widget = new (std::nothrow) TouchSlider();
if (widget && widget->init())
{
widget->loadBarTexture(barTextureName);
widget->loadSlidBallTextureNormal(normalBallTextureName);
widget->autorelease();
return widget;
}
CC_SAFE_DELETE(widget);
return nullptr;
}
bool TouchSlider::hitTest(const Vec2 &pt)
{
Vec2 nsp = this->_progressBarRenderer->convertToNodeSpace(pt);
Rect progressRect = Rect(0, 0, _progressBarTextureSize.width, _progressBarTextureSize.height);
if (progressRect.containsPoint(nsp))
{
return true;
}
return false;
}