新手求助:怎么实现“点击”和“拖动”都可以的滑动条

用Slider好像只能拖动,不能点击(或说触摸),求各位大神赐教!

哭死,没有人来吗?

监测点击事件,点击到滑动条上时根据点击位置设置滑动条的位置

就是一定要自己写咯,这部分。
有没有其他现成的控件可以实现的?

http://www.cocoachina.com/bbs/read.php?tid=270804

大神,按如果要监听的话,怎么写?
slider不是有 OnTouchBegan 什么之类的函数吗?
要用到?

谢谢,不过看完还是没懂要怎么做监听:6:

在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;
}