有没有办法检测Cocos2d-x:CCScrollView是否滚动?

时间:2015-11-13 10:29:12

标签: cocos2d-x cocos2d-x-3.0

我正在寻找一种方法来获得CCScrollView的滚动状态。

这似乎不是一个罕见的要求,但我是否需要实施它? 感谢:)

编辑: 以下是我的两种“蛮力”方式,但它们似乎有效。

目标是从CCScrollView l 获取cocos2d::Layer s 的滚动条件。

方式#1

l update()函数的每次迭代中,通过

获取 s 的内容偏移量
ScrollView::getContentOffset()

如果它保持不变,我们可以假设ScrollView没有滚动。

方式#2

创建继承CCScrollViewCCScrollViewDelegate的类 S ,然后覆盖委托的函数

void scrollViewDidScroll(ScrollView* view)

(每次ScrollView滚动时似乎都会调用它。)使用变量来节省当前时间

/*uint64_t*/ lastScrollTime = mach_absolute_time();

然后在 l update()函数中,假设ScrollView没有滚动时间阈值

curTime = mach_absolute_time();
if (GlobalUtils::machTimeToSecs(curTime - lastScrollTime) > 0.1)

希望有效:)

2 个答案:

答案 0 :(得分:1)

因此,在你的initScroll()方法中,你应该设置:

scrollView = ScrollView::create();
// initialisation scrollview
scrollView->addEventListener(CC_CALLBACK_2(YourScene::testScroll, this));
this->addChild(scrollView);

并制作bool变量isScrolled。然后在方法testScroll()中,您需要检查侦听器的事件类型,并根据它设置变量isScrolled

void YourScene::testScroll(Ref* sender, ui::ScrollView::EventType type)
{
     if (type == ui::ScrollView::EventType::SCROLLING)
        isScrolling = true;
    else
        isScrolling = false;
}

您可以看到其他值EventType here

答案 1 :(得分:1)

不修改CCScrollView源代码的一种方法是检查ScrollView::isDragging()的标志以及是否安排了ScrollView的滚动选择器之一。

bool isDeaccelerateScrolling = scrollView->getScheduler()->isScheduled(CC_SCHEDULE_SELECTOR(ScrollView::deaccelerateScrolling));
bool isPerformedAnimatedScroll = scrollView->getScheduler()->isScheduled(CC_SCHEDULE_SELECTOR(ScrollView::performedAnimatedScroll));
bool isScrolling = scrollView->isDragging() || isDeaccelerateScrolling || isPerformedAnimatedScroll;