检测Cocos2d-x:CSCcrollView是否正在滚动的任何方法



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

这似乎不是一个罕见的要求,但我需要执行它吗?谢谢:)


编辑: 以下是我的两种"暴力"方式,但它们似乎有效

目标是从cocos2d::Layerl获得CCScrollViews的滚动条件。


方式#1

lupdate()函数的每次迭代中,通过获得s

ScrollView::getContentOffset()

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


路#2

创建继承CCScrollViewCCScrollViewDelegate的类S,然后在代理函数的覆盖中

void scrollViewDidScroll(ScrollView* view)

(似乎每次滚动视图时都会调用它。)使用变量保存当前时间

/*uint64_t*/ lastScrollTime = mach_absolute_time();

则在lupdate()函数中,假设ScrollView没有滚动时间阈值

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

希望有效:)

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

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

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

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

您可以在此处看到其他值EventType

不修改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;

相关内容

最新更新