本人现在的cocos2dx的版本是3.0
cocos2dx提供了两个scrollview,一个是ui::ScrollView,一个是extension::ScrollView,两个都没有滚动条!
这篇文章就是增加ui::ScrollView的滚动条
新建文件TScrollView.h和TScrollView.cpp
头文件:
#ifndef __UTILS_TSCROLL_VIEW_H__
#define __UTILS_TSCROLL_VIEW_H__
#include "cocos2d.h"
#include "ui/CocosGUI.h"
#include "extensions/cocos-ext.h"
USING_NS_CC;
using namespace ui;
using namespace std;
using namespace extension;
class TScrollView :public ui::ScrollView
{
public:
static TScrollView* create();
TScrollView();
virtual ~TScrollView();
void setAutoHidden(bool b); // 滚动结束时滚动条是否自动隐藏
void setIsShowBar(bool b);
virtual void setDirection(SCROLLVIEW_DIR dir);
virtual void setSize(const Size &size);
void setInnerContainerSize(const Size &size);
virtual void update(float dt) override;
protected:
void resetBar();
virtual bool init() override;
protected:
bool _bar_auto_hidden;
bool _is_show_bar;
bool _bar_setted_opacity;
bool _is_content_smaller; // innerContentSize是否较小(相对iewSize, 较小则不显示滚动条)
extension::Scale9Sprite *_barImg;
};
#endif
源文件
#include "TScrollView.h"
enum
{
e_scroll_bar_tag = 111
};
TScrollView::TScrollView()
: _bar_auto_hidden(true)
, _is_show_bar(true)
, _bar_setted_opacity(false)
, _is_content_smaller(false)
, _barImg(nullptr)
, ui::ScrollView()
{
}
TScrollView::~TScrollView()
{
}
TScrollView* TScrollView::create()
{
auto widget = new TScrollView();
if (widget && widget->init()) {
widget->autorelease();
return widget;
}
CC_SAFE_DELETE(widget);
return nullptr;
}
bool TScrollView::init()
{
if (ui::ScrollView::init()) {
Size viewSize = getSize();
Size contentSize = getInnerContainerSize();
_barImg = extension::Scale9Sprite::create("scroll_bar.png");
_barImg->setContentSize(Size(10, viewSize.height * (viewSize.height / contentSize.height)));
_barImg->setTag(e_scroll_bar_tag);
Layout::addChild(_barImg, 2, e_scroll_bar_tag); // 必须要这样写,否则滚动时不正确!
return true;
}
return false;
}
void TScrollView::setDirection(SCROLLVIEW_DIR dir)
{
ui::ScrollView::setDirection(dir);
resetBar();
}
void TScrollView::setSize(const Size &size)
{
ui::ScrollView::setSize(size);
resetBar();
}
void TScrollView::setInnerContainerSize(const Size &size)
{
ui::ScrollView::setInnerContainerSize(size);
resetBar();
}
void TScrollView::setAutoHidden(bool b)
{
_bar_auto_hidden = b;
if (_barImg && _bar_auto_hidden) {
_barImg->setVisible(false);
}
}
void TScrollView::setIsShowBar(bool b)
{
_is_show_bar = b;
if (_is_show_bar == false) {
_barImg->setVisible(false);
} else {
resetBar();
}
}
void TScrollView::update(float dt)
{
ui::ScrollView::update(dt);
if (_is_show_bar && _barImg && _is_content_smaller == false) {
if (getDirection() == SCROLLVIEW_DIR_VERTICAL) {
Size viewSize = getSize();
Size contentSize = getInnerContainerSize();
float y = _barImg->getContentSize().height + viewSize.height * (-_moveChildPoint.y / contentSize.height);
_barImg->setPositionY(y);
} else if (getDirection() == SCROLLVIEW_DIR_HORIZONTAL) {
Size viewSize = getSize();
Size contentSize = getInnerContainerSize();
float x = viewSize.width * (-_moveChildPoint.x / contentSize.width);
_barImg->setPositionX(x);
}
if (_bar_auto_hidden) {
if ((_bePressed || _autoScrollAddUpTime > 0.0f) && _bar_setted_opacity == false) {
_barImg->setVisible(true);
_barImg->setOpacity(0);
_barImg->runAction(FadeIn::create(0.2f));
_bar_setted_opacity = true;
} else if (_bar_setted_opacity && _autoScrollAddUpTime <= 0.0f && _bePressed == false) {
_barImg->runAction(FadeOut::create(0.2f));
_bar_setted_opacity = false;
}
}
}
}
void TScrollView::resetBar()
{
if (_barImg == nullptr) {
return;
}
Size viewSize = getSize();
Size contentSize = getInnerContainerSize();
SCROLLVIEW_DIR dir = getDirection();
if (dir == SCROLLVIEW_DIR_HORIZONTAL) {
if (contentSize.width > 0) {
_barImg->setContentSize(Size(8, viewSize.width * (viewSize.width / contentSize.width)));
_barImg->setPosition(Point(0, 8));
_barImg->setAnchorPoint(Point(0, 0));
_barImg->setRotation(90.0f);
}
} else if (dir == SCROLLVIEW_DIR_VERTICAL) {
if (contentSize.height > 0) {
_barImg->setContentSize(Size(8, viewSize.height * (viewSize.height / contentSize.height)));
_barImg->setPosition(Point(viewSize.width, contentSize.height));
_barImg->setAnchorPoint(Point(1, 1));
}
}
if (_is_show_bar) {
if (dir == SCROLLVIEW_DIR_VERTICAL) {
_is_content_smaller = viewSize.height + 20 > contentSize.height;
if (viewSize.height + 20 > contentSize.height || _bar_auto_hidden) {
_barImg->setVisible(false); // contentSize较小时不显示滚动条
} else {
_barImg->setVisible(true);
}
} else if (dir == SCROLLVIEW_DIR_HORIZONTAL) {
_is_content_smaller = viewSize.width + 20 > contentSize.width;
if (viewSize.width + 20 > contentSize.width || _bar_auto_hidden) {
_barImg->setVisible(false);
} else {
_barImg->setVisible(true);
}
}
} else {
_barImg->setVisible(false);
}
}