Scroller的viewport为Group时,滚动鼠标滑轮,Scroller滚动的速度很慢,Scroller的viewport为VGroup时, 滚动鼠标滑轮,Scroller滚动的速度很快,有没有什么办法控制 Scroller的滚动速度呢?解决方案如下:
1.新建VScrollBar的子类
MyVScrollerBar.as
package
{
import flash.events.MouseEvent;
import mx.core.mx_internal;
import spark.components.VScrollBar;
import spark.core.IViewport;
use namespace mx_internal;
[Style(name="movementDelta", inherit="yes", type="number", format="length")]
public class MyVScrollerBar extends VScrollBar
{
public function MyVScrollerBar()
{
setStyle("movementDelta", 30);
}
override mx_internal function mouseWheelHandler(event:MouseEvent):void
{
var viewport:IViewport = this.viewport;
if ( viewport == null || !viewport.visible || event.isDefaultPrevented() )
return;
var direction:int = (event.delta > 0) ? -1 : (event.delta < 0) ? 1 : 0;
var movement:Number = getStyle("movementDelta");
viewport.verticalScrollPosition += movement * direction;
event.preventDefault();
}
}
}
2.新建外观类
MyVScrollerBarSkin.mxml
< ?xml version="1.0" encoding="utf-8"?>
< s:SparkSkin xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:local="*">
< fx:Metadata>
< ![CDATA[
[HostComponent("spark.components.Scroller")]
]]>
< /fx:Metadata>
< fx:Script>
< ![CDATA[
override public function beginHighlightBitmapCapture() : Boolean
{
var needUpdate:Boolean = super.beginHighlightBitmapCapture();
graphics.beginFill(0);
graphics.drawRect(0, 0, width, height);
graphics.endFill();
return needUpdate;
}
override public function endHighlightBitmapCapture() : Boolean
{
var needUpdate:Boolean = super.endHighlightBitmapCapture();
graphics.clear();
return needUpdate;
}
]]>
< /fx:Script>
< local:MyVScrollerBar id="verticalScrollBar" visible="false" />
< s:HScrollBar id="horizontalScrollBar" visible="false" />
< /s:SparkSkin>
3.将Scroller的skinClass设为刚刚新建的外观类MyVScrollerBarSkin
< ?xml version="1.0" encoding="utf-8"?>
< s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/mx">
< s:Scroller width="400" height="400" skinClass="MyVScrollerBarSkin">
< s:Group width="100%" height="100%">
< s:Rect width="100%" height="1200">
< s:fill>
< s:SolidColor color="0x338899"/>
< /s:fill>
< /s:Rect>
< /s:Group>
< /s:Scroller>
< /s:Application>
ok,困扰了两天的问题搞定。
通过研究,其实没有必要这么麻烦,
以前的flex3的SDK直接设置一个步长就可以解决问题,而spark组建中的scroller组件把这个属性取消了,
通过查找例子,发现都是转载的楼主的方法,这的确太麻烦了..
后来在一个国外网站搜到一个解决办法,
每一个scroller都有一个mouseWheelChanging方法,当滚动鼠标中轮的时候调用,
而后就可以在这个函数中进行判断,如下:
我的滚动条id=mainScroller
protected function mainScroller _mouseWheelChangingHandler(event:FlexMouseEvent):void
{
event.preventDefault();
var modifier:int = 5;
var delta:Number = Number(event.delta) * modifier;
var viewport:IViewport = mainScroller.verticalScrollBar.viewport;
var vPos:Number = viewport.verticalScrollPosition;
var maximum:Number = mainScroller.verticalScrollBar.maximum;
if (delta < 0)
{
mainScroller.verticalScrollBar.viewport.verticalScrollPosition = Math.min(vPos - delta, maximum) ;
}
else
{
mainScroller.verticalScrollBar.viewport.verticalScrollPosition = Math.max(vPos - delta, 0);
}
}
转载:http://bbs.9ria.com/thread-114341-1-1.html