3

在 Sencha Touch 2 轮播的结尾或开头,用户可以将项目拖动到它应该能够到达的位置并显示白色背景(此处的屏幕截图:http: //i.imgur.com/MkX0sam.png)。我正在尝试禁用此功能,因此用户无法拖过轮播的结尾/开头。

我尝试使用各种scrollable配置来执行此操作,包括通常建议用于处理过度滚动的设置

scrollable : {
  direction: 'horizontal',
  directionLock: true,
  momentumEasing:  {
     momentum: {
       acceleration: 30,
       friction: 0.5
     },
     bounce: {
        acceleration: 0.0001,
        springTension: 0.9999,
     },
     minVelocity: 5
  },
  outOfBoundRestrictFactor: 0   
  }

上面的配置,尤其是outOfBoundRestrictFactor确实停止了拖过末端的能力,但它也停止了在轮播中拖动其他任何地方的能力......所以这不起作用。我已经搞砸了所有其他配置,但没有产生积极影响。

不幸的是,我找不到太多关于修改拖动配置的信息。这里的任何帮助都会很棒。

4

1 回答 1

5

您需要做的是覆盖onDragCarousel 中的功能。这是逻辑检测用户拖动的方向的地方,您可以在其中检查它是第一个还是最后一个项目。

这是一个完全符合您要求的课程。您感兴趣的代码就在函数的底部。其余的只是从Ext.carousel.Carousel.

Ext.define('Ext.carousel.Custom', {
    extend: 'Ext.carousel.Carousel',

    onDrag: function(e) {
        if (!this.isDragging) {
            return;
        }

        var startOffset = this.dragStartOffset,
            direction = this.getDirection(),
            delta = direction === 'horizontal' ? e.deltaX : e.deltaY,
            lastOffset = this.offset,
            flickStartTime = this.flickStartTime,
            dragDirection = this.dragDirection,
            now = Ext.Date.now(),
            currentActiveIndex = this.getActiveIndex(),
            maxIndex = this.getMaxItemIndex(),
            lastDragDirection = dragDirection,
            offset;

        if ((currentActiveIndex === 0 && delta > 0) || (currentActiveIndex === maxIndex && delta < 0)) {
            delta *= 0.5;
        }

        offset = startOffset + delta;

        if (offset > lastOffset) {
            dragDirection = 1;
        }
        else if (offset < lastOffset) {
            dragDirection = -1;
        }

        if (dragDirection !== lastDragDirection || (now - flickStartTime) > 300) {
            this.flickStartOffset = lastOffset;
            this.flickStartTime = now;
        }

        this.dragDirection = dragDirection;

        // now that we have the dragDirection, we should use that to check if there
        // is an item to drag to
        if ((dragDirection == 1 && currentActiveIndex == 0) || (dragDirection == -1 && currentActiveIndex == maxIndex)) {
            return;
        }

        this.setOffset(offset);
    }
});
于 2013-01-21T20:31:19.500 回答