mirror of https://github.com/axmolengine/axmol.git
fix pageview turning event (#16299)
This commit is contained in:
parent
ad721ec3a4
commit
6eaf15a2c2
|
@ -39,7 +39,8 @@ _childFocusCancelOffset(5.0f),
|
|||
_pageViewEventListener(nullptr),
|
||||
_pageViewEventSelector(nullptr),
|
||||
_eventCallback(nullptr),
|
||||
_autoScrollStopEpsilon(0.001f)
|
||||
_autoScrollStopEpsilon(0.001f),
|
||||
_previousPageIndex(-1)
|
||||
{
|
||||
}
|
||||
|
||||
|
@ -219,6 +220,12 @@ void PageView::refreshIndicatorPosition()
|
|||
}
|
||||
}
|
||||
|
||||
void PageView::handlePressLogic(Touch *touch)
|
||||
{
|
||||
ListView::handlePressLogic(touch);
|
||||
_previousPageIndex = _currentPageIndex;
|
||||
}
|
||||
|
||||
void PageView::handleReleaseLogic(Touch *touch)
|
||||
{
|
||||
// Use `ScrollView` method in order to avoid `startMagneticScroll()` by `ListView`.
|
||||
|
@ -228,7 +235,6 @@ void PageView::handleReleaseLogic(Touch *touch)
|
|||
{
|
||||
return;
|
||||
}
|
||||
|
||||
Vec2 touchMoveVelocity = flattenVectorByDirection(calculateTouchMoveVelocity());
|
||||
|
||||
static const float INERTIA_THRESHOLD = 500;
|
||||
|
@ -272,6 +278,19 @@ float PageView::getAutoScrollStopEpsilon() const
|
|||
return _autoScrollStopEpsilon;
|
||||
}
|
||||
|
||||
void PageView::addEventListenerPageView(Ref *target, SEL_PageViewEvent selector)
|
||||
{
|
||||
_pageViewEventListener = target;
|
||||
_pageViewEventSelector = selector;
|
||||
|
||||
ccScrollViewCallback scrollViewCallback = [=](Ref* ref, ScrollView::EventType type) -> void{
|
||||
if (type == ScrollView::EventType::AUTOSCROLL_ENDED && _previousPageIndex != _currentPageIndex) {
|
||||
pageTurningEvent();
|
||||
}
|
||||
};
|
||||
this->addEventListener(scrollViewCallback);
|
||||
}
|
||||
|
||||
void PageView::pageTurningEvent()
|
||||
{
|
||||
this->retain();
|
||||
|
@ -290,18 +309,12 @@ void PageView::pageTurningEvent()
|
|||
this->release();
|
||||
}
|
||||
|
||||
void PageView::addEventListenerPageView(Ref *target, SEL_PageViewEvent selector)
|
||||
{
|
||||
_pageViewEventListener = target;
|
||||
_pageViewEventSelector = selector;
|
||||
}
|
||||
|
||||
void PageView::addEventListener(const ccPageViewCallback& callback)
|
||||
{
|
||||
_eventCallback = callback;
|
||||
ccScrollViewCallback scrollViewCallback = [=](Ref* ref, ScrollView::EventType type) -> void{
|
||||
if (type == ScrollView::EventType::AUTOSCROLL_ENDED) {
|
||||
callback(ref, PageView::EventType::TURNING);
|
||||
if (type == ScrollView::EventType::AUTOSCROLL_ENDED && _previousPageIndex != _currentPageIndex) {
|
||||
pageTurningEvent();
|
||||
}
|
||||
};
|
||||
this->addEventListener(scrollViewCallback);
|
||||
|
@ -364,6 +377,11 @@ void PageView::copySpecialProperties(Widget *widget)
|
|||
_ccEventCallback = pageView->_ccEventCallback;
|
||||
_pageViewEventListener = pageView->_pageViewEventListener;
|
||||
_pageViewEventSelector = pageView->_pageViewEventSelector;
|
||||
_currentPageIndex = pageView->_currentPageIndex;
|
||||
_previousPageIndex = pageView->_previousPageIndex;
|
||||
_childFocusCancelOffset = pageView->_childFocusCancelOffset;
|
||||
_autoScrollStopEpsilon = pageView->_autoScrollStopEpsilon;
|
||||
_indicatorPositionAsAnchorPoint = pageView->_indicatorPositionAsAnchorPoint;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -394,6 +394,7 @@ protected:
|
|||
virtual void onItemListChanged() override;
|
||||
virtual void onSizeChanged() override;
|
||||
virtual void handleReleaseLogic(Touch *touch) override;
|
||||
virtual void handlePressLogic(Touch *touch) override;
|
||||
|
||||
virtual Widget* createCloneInstance() override;
|
||||
virtual void copySpecialProperties(Widget* model) override;
|
||||
|
@ -423,6 +424,7 @@ protected:
|
|||
#endif
|
||||
ccPageViewCallback _eventCallback;
|
||||
float _autoScrollStopEpsilon;
|
||||
ssize_t _previousPageIndex;
|
||||
};
|
||||
|
||||
}
|
||||
|
|
|
@ -84,7 +84,8 @@ bool UIPageViewTest::init()
|
|||
|
||||
pageView->removeItem(0);
|
||||
pageView->scrollToItem(pageCount - 2);
|
||||
pageView->addEventListener((PageView::ccPageViewCallback)CC_CALLBACK_2(UIPageViewTest::pageViewEvent, this));
|
||||
//This method is deprecated, we used here only testing purpose
|
||||
pageView->addEventListenerPageView(this, pagevieweventselector(UIPageViewTest::pageViewEvent));
|
||||
|
||||
_uiLayer->addChild(pageView);
|
||||
|
||||
|
@ -93,11 +94,11 @@ bool UIPageViewTest::init()
|
|||
return false;
|
||||
}
|
||||
|
||||
void UIPageViewTest::pageViewEvent(Ref *pSender, PageView::EventType type)
|
||||
void UIPageViewTest::pageViewEvent(Ref *pSender, PageViewEventType type)
|
||||
{
|
||||
switch (type)
|
||||
{
|
||||
case PageView::EventType::TURNING:
|
||||
case PAGEVIEW_EVENT_TURNING:
|
||||
{
|
||||
PageView* pageView = dynamic_cast<PageView*>(pSender);
|
||||
|
||||
|
@ -199,7 +200,9 @@ bool UIPageViewButtonTest::init()
|
|||
|
||||
void UIPageViewButtonTest::onButtonClicked(Ref* sender, Widget::TouchEventType type)
|
||||
{
|
||||
log("button %s clicked", static_cast<Button*>(sender)->getName().c_str());
|
||||
if(type == Widget::TouchEventType::ENDED) {
|
||||
log("button %s clicked", static_cast<Button*>(sender)->getName().c_str());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -38,7 +38,7 @@ public:
|
|||
~UIPageViewTest();
|
||||
virtual bool init() override;
|
||||
|
||||
void pageViewEvent(cocos2d::Ref* sender, cocos2d::ui::PageView::EventType type);
|
||||
void pageViewEvent(cocos2d::Ref* sender, cocos2d::ui::PageViewEventType type);
|
||||
|
||||
protected:
|
||||
|
||||
|
|
Loading…
Reference in New Issue