Плавная прокрутка списка искр с элементами переменной высоты с помощью колесика мыши

У нас есть список элементов переменной высоты, которые мы отображаем в элементе управления Spark List. Когда пользователь нажимает и перетаскивает вертикальную полосу прокрутки, список плавно прокручивается. Когда используются стрелки вверх / вниз, он перемещается небольшими и дискретными шагами. При использовании колесика мыши список прокручивается очень большими дискретными шагами, что проблематично для пользователя.

Мы хотели бы включить плавную прокрутку колесика мыши. Высота наших предметов значительно варьируется, и при прокрутке с помощью мышки легко потеряться.

Наша реализация довольно проста:

<s:List id="chartList" 
        dataProvider="{pm.charts}"
        itemRenderer="charts.ChartItemRenderer"
        horizontalScrollPolicy="off"
        verticalScrollPolicy="on"
        useVirtualLayout="false"
        cachePolicy="auto">
</s:List>

<?xml version="1.0" encoding="utf-8"?>
<s:ItemRenderer xmlns:fx="http://ns.adobe.com/mxml/2009" 
                xmlns:s="library://ns.adobe.com/flex/spark" 
                xmlns:mx="library://ns.adobe.com/flex/mx" 
                autoDrawBackground="false" 
                xmlns:charts="charts.*"
                >
    <fx:Script>
        <![CDATA[
            private var _canvas:BitmapData;

            public function set canvas(value:BitmapData):void
            {
                _canvas = value;
            }

            [Bindable]
            public function get canvas():BitmapData
            {
                return _canvas;
            }

            public function render(x:int,y:int, data:int):void
            {
                _canvas.draw(this);
            }
        ]]>
    </fx:Script>
        <charts:DefaultChartContainer 
            chart="{data}" 
            cachePolicy="on"/>
</s:ItemRenderer>

По-видимому, не существует готового метода для реализации плавной прокрутки в списке искр. Как можно было бы реализовать плавную прокрутку в списке искр для элементов переменной высоты?

2 ответа

Как @Sunil_D. Предполагается, что прослушивание события mousewheel и ручная настройка HorizontalScrollPosition - это простой способ справиться с этим. Добавьте EventListener для вашего компонента

chartList.addEventListener(MouseEvent.MOUSE_WHEEL, chartList_mouseWheelHandler);

и увеличивать / уменьшать горизонтальное положение ScrollPosition, например, с кратным значением event.delta

protected function chartList_mouseWheelHandler(event:MouseEvent):void
{           
    chartList.verticalScrollPosition -= (event.delta * SOME_CORRECT_VALUE);
} 

Поиск подходящего SOME_CORRECT_VALUE может потребовать некоторых экспериментов, но это не должно быть трудно найти.

Редактировать:

Вот еще один способ сделать это: http://forums.adobe.com/message/3844410

Хорошо, так что это будет нелегко, но это выполнимо.

1) Создайте свой скин для вашего списка

2) В пользовательском скине замените скроллер на собственный скроллер (MyScroller)

3) Создайте новый класс, расширяющий Scroller, под названием MyScroller

4) Adobe в своей бесконечной мудрости сделала skin_mouseWheelHandler приватным - что они, кажется, делают повсеместно, поэтому вам придется переопределить что-то более высокое, например, attachSkin и detachSkin. Или вы можете попробовать добавить свой собственный skin_mouseWheelHandler с более высоким приоритетом в attachSkin и запретить использование по умолчанию, чтобы не вызывать значение по умолчанию.

5) Скопируйте код в skin_mouseWheelHandler и измените его в соответствии с вашими требованиями.

Другие вопросы по тегам