基本上就是标题所说的。我检查了 DataGridSkin,它有一个 Scroller 皮肤部分,但我找不到滚动量的任何属性。我可能错过了。有人可以帮我解决这个问题吗?谢谢。
问问题
526 次
2 回答
3
我建议以下。您可以在方法中的VScrollBar
类中找到部分滚动逻辑。mouseWheelHandler
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
变量设置为要滚动的渲染器数量。因此,在此示例中,网格仅滚动滚轮上的一项。
于 2013-10-15T16:05:56.970 回答
0
我找到了一个解决方案:我使用了上面描述的想法,但是我没有创建一个扩展 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
为所需的滚动量。
于 2013-10-16T11:09:47.513 回答