Я реализовал нечто подобное, за исключением того, что это был горизонтальный список прокрутки, а также я использовал кнопки прокрутки влево / вправо по бокам списка, эффект mouse_over вызывается кнопками, а не списком (но это не должноне будет препятствием при адаптации кода).
Чтобы сделать фактическую прокрутку, я использовал эффект анимации, который был нацелен на макет списка, а точнее на макет horizontalScrollPosition
.Вот как выглядит код MXML:
<s:Animate id="scrollAnimation" target="{listLayout}">
<s:easer>
<s:Linear easeInFraction="0" easeOutFraction="0" />
</s:easer>
<s:SimpleMotionPath id="scrollMotionPath" property="horizontalScrollPosition" />
</s:Animate>
Это необходимо easer
, потому что анимационный эффект обычно имеет 3 этапа движения (ускорение, равномерное движение и замедление), поэтому по умолчанию вы получаете волнистую прокруткудвижение.Я использовал RobotLeft для этого проекта, поэтому представление передается следующим образом:
Когда зарегистрирован посредник, добавьте слушателей кнопки прокрутки:
viewComponent.scrollLeft.addEventListener(MouseEvent.MOUSE_OVER, onScrollLeft);
viewComponent.scrollRight.addEventListener(MouseEvent.MOUSE_OVER, onScrollRight);
viewComponent.scrollLeft.addEventListener(MouseEvent.MOUSE_OUT, onScrollOut);
viewComponent.scrollRight.addEventListener(MouseEvent.MOUSE_OUT, onScrollOut);
Нам также нужно добавить слушателя, чтобымы можем сказать, когда эффект прокрутки закончился, потому что нам, возможно, потребуется воспроизвести его:
viewComponent.scrollEffect.addEventListener(EffectEvent.EFFECT_END, onScrollEnd);
Теперь мы можем реализовать метод прокрутки.Поскольку представление опосредовано, у нас есть доступ к эффекту прокрутки, мы можем сослаться на него здесь (а также на путь).Вот как выглядит метод:
private function scrollOnlineFriendsList(scrollBy:int):void
{
// Set the scrollBy value and play the scrolling effect
viewComponent.scrollMotionPath.valueBy = scrollBy;
viewComponent.scrollEffect.play();
// Store the scrollBy value in case the effect will need to be replayed,
// if the mouse over event is still over the scrolling button/area
this.scrollBy = scrollBy;
canKeepScrolling = true;
}
Наконец, обработчики:
private function onScrollLeft(event:MouseEvent):void
{
scrollOnlineFriendsList(-33);
}
private function onScrollRight(event:MouseEvent):void
{
scrollOnlineFriendsList(33);
}
private function onScrollOut(event:MouseEvent):void
{
canKeepScrolling = false;
// If you would like the effect to continue playing
// until it finishes the current scrolling operation,
// once the mouse is no longer over a scroll button,
// just comment this line
viewComponent.scrollEffect.stop();
}
private function onScrollEnd(event:EffectEvent):void
{
// When the scroll effect has finished playing,
// if the mouse is still over the scroll button/area,
// replay the effect
if (canKeepScrolling)
scrollOnlineFriendsList(scrollBy);
}