【问题标题】:Changing the scrolling amount of a spark DataGrid when using the mouse wheel使用鼠标滚轮时更改 spark DataGrid 的滚动量
【发布时间】:2013-10-15 15:07:28
【问题描述】:

基本上就是标题所说的。我检查了 DataGridSkin,它有一个 Scroller 皮肤部分,但我找不到滚动量的任何属性。我可能错过了。 有人可以帮我解决这个问题吗?谢谢。

【问题讨论】:

  • 为什么这个问题突然被否决了?这是一个编程问题,我已经找到并发布了答案。怎么了?

标签: apache-flex datagrid flex4 flex-spark


【解决方案1】:

我建议如下。您可以在mouseWheelHandler 方法中的VScrollBar 类中找到部分滚动逻辑。

var nSteps:uint = Math.abs(delta);
...
for (var vStep:int = 0; vStep < nSteps; vStep++)
        {
            var vspDelta:Number = vp.getVerticalScrollPositionDelta(navigationUnit);
...

在我的情况下,delta 等于 3。并且网格滚动了 3 个渲染器高度。您可以扩展 VScrollBar 类。然后创建自定义 ScrollerSkin(从原始的复制)并在那里设置垂直条而不是默认的。然后创建自定义DataGrid 皮肤(再次从原始皮肤复制)并在那里为Scroller 设置自定义滚动器皮肤。

在自定义 VScrollBar 类中重写 mouseWheelHandler 方法。示例:

package {
    import flash.events.Event;
    import flash.events.MouseEvent;

    import mx.core.IInvalidating;

    import mx.core.mx_internal;
    import mx.events.FlexMouseEvent;

    import spark.components.VScrollBar;
    import spark.core.IViewport;
    import spark.core.NavigationUnit;
    import spark.utils.MouseEventUtil;

    use namespace mx_internal;

    public class MyVScrollBar extends VScrollBar {
        public function MyVScrollBar() {

        }

        override mx_internal function mouseWheelHandler(event:MouseEvent):void {
            const vp:IViewport = viewport;
            if (event.isDefaultPrevented() || !vp || !vp.visible || !visible)
                return;

            var changingEvent:FlexMouseEvent = MouseEventUtil.createMouseWheelChangingEvent(event);
            if (!dispatchEvent(changingEvent))
            {
                event.preventDefault();
                return;
            }

            const delta:int = changingEvent.delta;
            var nSteps:uint = 1; //number of renderers scrolled!
            var navigationUnit:uint;
            var scrollPositionChanged:Boolean;
            navigationUnit = (delta < 0) ? NavigationUnit.DOWN : NavigationUnit.UP;
            for (var vStep:int = 0; vStep < nSteps; vStep++)
            {
                var vspDelta:Number = vp.getVerticalScrollPositionDelta(navigationUnit);
                if (!isNaN(vspDelta))
                {
                    vp.verticalScrollPosition += vspDelta;
                    scrollPositionChanged = true;
                    if (vp is IInvalidating)
                        IInvalidating(vp).validateNow();
                }
            }

            if (scrollPositionChanged)
                dispatchEvent(new Event(Event.CHANGE));

            event.preventDefault();
        }
    }
}

nSteps 变量设置为要滚动的渲染器数量。所以在这个例子中,网格只滚动了一个轮子上的项目。

【讨论】:

  • 对不起,你的解决方案给了我:非法覆盖 mouseWheelHandler
  • 您使用的是什么版本的 SDK?请分享您班级的代码pastebin.com
  • 我稍微改变了你的解决方案,这解决了我的问题。请参阅我添加的答案。谢谢你给我正确的方向。
【解决方案2】:

我找到了一个解决方案:我使用了上面描述的想法,但是我没有创建一个扩展 VScrollBar 的类,而是在 Scroller 皮肤的滚动条中添加了一个 MouseWheelChanging 事件侦听器:

<fx:Component id="verticalScrollBarFactory">
        <s:VScrollBar visible="false" mouseWheelChanging="outerDocument.vScrollBarWheelChanging(event)"/>
    </fx:Component>

internal function vScrollBarWheelChanging(event:MouseEvent):void
    { event.delta/=Math.abs(event.delta); }

您可以将event.delta 设置为所需的滚动量。

【讨论】:

  • 关于鼠标滚轮步进的一些想法。鼠标滚轮的“步进”在计算机上的鼠标设置中控制。对于已经调整此值的用户,他们将获得与您在测试中发现的不同的体验。因此,您调整后的“正确感觉”对于其他用户来说可能仍然不同。
  • 谢谢,我们有一个 QA 部门负责测试此类案例。
猜你喜欢
  • 1970-01-01
  • 2017-09-03
  • 1970-01-01
  • 2011-09-29
  • 2011-11-09
  • 1970-01-01
  • 1970-01-01
  • 2011-04-04
  • 1970-01-01
相关资源
最近更新 更多