在 Sencha Touch 中禁用轮播过度滚动/过度拖动

Posted

技术标签:

【中文标题】在 Sencha Touch 中禁用轮播过度滚动/过度拖动【英文标题】:Disable carousel overscroll/overdrag in Sencha Touch 【发布时间】:2013-01-19 03:52:57 【问题描述】:

在 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 确实停止了拖过末端的能力,但它也停止了在轮播中拖动其他任何地方的能力......所以这不起作用。我已经搞砸了所有其他配置,但没有任何积极影响。

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

【问题讨论】:

【参考方案1】:

您需要做的是覆盖 Carousel 中的 onDrag 功能。这是检测用户拖动方向的逻辑所在,您可以在此处检查它是第一项还是最后一项。

这是一个完全符合您要求的课程。您感兴趣的代码就在函数的底部。其余部分简单取自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);
    
);

【讨论】:

这将禁止从列表中的最后一项开始过度滚动,但从其他项目开始。仍然可以通过拖动倒数第二项超过最后一项的宽度来进行过度滚动。

以上是关于在 Sencha Touch 中禁用轮播过度滚动/过度拖动的主要内容,如果未能解决你的问题,请参考以下文章

在 Sencha touch 2 如何启用浏览器滚动条

Sencha touch 2 - 如何创建动态轮播?

使用 sencha touch2 动态创建轮播

如何在sencha touch中将图像从商店动态绑定到轮播

如何在sencha touch 2中将轮播正确添加到视图中?

Sencha Touch 2 轮播无法在 Android 设备上启动