Creator2.1.2 PageView 回弹时 _curPageIdx 错误

  • Creator 版本:2.1.2

  • 目标平台: Web / iOS / Android / 模拟器

  • 重现方式:

在 PageView 首尾页时,如在首页时,按住向右拖动至页面开始回弹,当松手回弹开始时立刻按住页面,停止回弹,之后保持按住页面,向左拖动一小段距离,当前页面索引会切换到末页,并且页面内容无变化。在末页回弹时快速按住向右拖动也可以复现。

跟踪源代码:

CCPageView.js



    _autoScrollToPage: function () {
        var bounceBackStarted = this._startBounceBackIfNeeded();
        var moveOffset = this._touchBeganPosition.sub(this._touchEndPosition);
        if (bounceBackStarted) {
            var dragDirection = this._getDragDirection(moveOffset);
            if (dragDirection === 0) {
                return;
            }
            if (dragDirection > 0) {
                this._curPageIdx = this._pages.length - 1;
            }
            else {
                this._curPageIdx = 0;
            }
            if (this.indicator) {
                this.indicator._changedState();
            }
        }
        else {
            var index = this._curPageIdx, nextIndex = index + this._getDragDirection(moveOffset);
            var timeInSecond = this.pageTurningSpeed * Math.abs(index - nextIndex);
            if (nextIndex < this._pages.length) {
                if (this._isScrollable(moveOffset, index, nextIndex)) {
                    this.scrollToPage(nextIndex, timeInSecond);
                    return;
                }
                else {
                    var touchMoveVelocity = this._calculateTouchMoveVelocity();
                    if (this._isQuicklyScrollable(touchMoveVelocity)) {
                        this.scrollToPage(nextIndex, timeInSecond);
                        return;
                    }
                }
            }
            this.scrollToPage(index, timeInSecond);
        }
    },

得到该操作会让 PagView 执行以下代码:

var dragDirection = this._getDragDirection(moveOffset);
if (dragDirection === 0) {
	return;
}
if (dragDirection > 0) {
	this._curPageIdx = this._pages.length - 1;  // ←切换到末页是执行了这个
}
else {
	this._curPageIdx = 0;
}
if (this.indicator) {
	this.indicator._changedState();
}

范例工程:普通新工程仅加入一个 PageView 即可
PageViewTest.zip (187.3 KB)

麻烦引擎组看一下 @jare

请问你使用的浏览器是什么?

chrome 77.0.3865.90

你好,我本地多次在谷歌浏览器上复现不出来,你是否有在其它浏览器上测试过?

Microsoft Edge 44.18362.449.0
也可复现
操作关键就是回弹的时候立刻按住然后往左拖一点,this._getDragDirection(moveOffset) 就会判定非0

复现不出来,你可以在其它设备上测试下。

Chrome


Edge

模拟器

很容易复现

Mac和Window测试了下,始终没法复现这个问题,你是否自定义了引擎?建议先先试下新版本,看下问题是否解决。

没有自定义引擎。

我已经找到必现的方法了!!!直接拉第一页,右拉移到快出界,快速松开再点击,再往左移一点点就好了!!!开心

1赞

对,复现方法就是这样的 :kissing:

目测是这里的问题

假装会:smiley:

从最后一页往前拉的时候也会出问题(后边那个 this._curPageIdx = 0;),我目前把这个 if 前半部分整个注掉了,等官方解决方法~

小问题,小问题,这种bug藏得太深:grin:

感谢反馈,已经复现了,我们处理下~

1赞

辛苦:kissing_heart: