我正在寻找一种方法来获得CCScrollView
的滚动状态。
这似乎不是一个罕见的要求,但我是否需要实施它? 感谢:)
编辑: 以下是我的两种“蛮力”方式,但它们似乎有效。
目标是从CCScrollView
l 获取cocos2d::Layer
s 的滚动条件。
方式#1
在 l 的update()
函数的每次迭代中,通过
ScrollView::getContentOffset()
如果它保持不变,我们可以假设ScrollView没有滚动。
方式#2
创建继承CCScrollView
和CCScrollViewDelegate
的类 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)
希望有效:)
答案 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;