【发布时间】:2013-10-15 15:07:28
【问题描述】:
基本上就是标题所说的。我检查了 DataGridSkin,它有一个 Scroller 皮肤部分,但我找不到滚动量的任何属性。我可能错过了。 有人可以帮我解决这个问题吗?谢谢。
【问题讨论】:
-
为什么这个问题突然被否决了?这是一个编程问题,我已经找到并发布了答案。怎么了?
标签: apache-flex datagrid flex4 flex-spark
基本上就是标题所说的。我检查了 DataGridSkin,它有一个 Scroller 皮肤部分,但我找不到滚动量的任何属性。我可能错过了。 有人可以帮我解决这个问题吗?谢谢。
【问题讨论】:
标签: apache-flex datagrid flex4 flex-spark
我建议如下。您可以在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 变量设置为要滚动的渲染器数量。所以在这个例子中,网格只滚动了一个轮子上的项目。
【讨论】:
我找到了一个解决方案:我使用了上面描述的想法,但是我没有创建一个扩展 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 设置为所需的滚动量。
【讨论】: