Как обнаружить щелчок в середине элемента управления SpinnerList? С тестовым примером и скриншотом

Как обнаружить щелчок по элементу в середине SpinnerList?

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

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

введите здесь описание изображения

Ниже приведен код моего тестового примера.

Любые предложения, пожалуйста? Я также пытался использовать собственный SpinnerListItemRenderer и добавить туда обработчик кликов, но это не меняет проблему, описанную выше.

Main.mxml:

<?xml version="1.0" encoding="utf-8"?>
<s:ViewNavigatorApplication 
    xmlns:fx="http://ns.adobe.com/mxml/2009" 
    xmlns:s="library://ns.adobe.com/flex/spark" 
    firstView="views.MainHomeView">
</s:ViewNavigatorApplication>

представления/MainHomeView.mxml:

<?xml version="1.0" encoding="utf-8"?>
<s:View xmlns:fx="http://ns.adobe.com/mxml/2009" 
        xmlns:s="library://ns.adobe.com/flex/spark" 
        title="How to detect a click?">

    <fx:Script>
        <![CDATA[
            import mx.collections.ArrayList;

            private function handleClick(event:Event):void {
                trace('selectedItem: ' + _list.selectedItem);
            }
        ]]>
    </fx:Script>

    <s:SpinnerListContainer>
        <s:SpinnerList id="_list" 
                       click="handleClick(event)"
                       typicalItem="45" 
                       dataProvider="{new ArrayList([1,5,6,10,15,30])}"
                       wrapElements="false"/>
    </s:SpinnerListContainer>
</s:View> 

person Alexander Farber    schedule 03.12.2012    source источник


Ответы (1)


Решил сам с помощью кастомного itemRenderer -

RedBlack.as:

package {
    import flash.events.MouseEvent;
    import spark.components.List;
    import spark.components.SpinnerList;
    import spark.components.SpinnerListItemRenderer;

    public class RedBlack extends SpinnerListItemRenderer {
        public function RedBlack() {
            super();
            cacheAsBitmap = true;
            minHeight = 50;
            setStyle('textAlign', 'center');
            addEventListener(MouseEvent.CLICK, handleClick, false, 0, true);
        }

        override public function set data(value:Object):void {
            super.data = value;
            setStyle('color', int(value) % 2 ? 'red' : 'black');
        }

        private function handleClick(e:MouseEvent):void {
            var list:SpinnerList = owner as SpinnerList;
            var value:int = int(data);

            if (list && value == list.selectedItem) {
                trace('clicked in the middle: ' + value);
            }
        }   
    }
}
person Alexander Farber    schedule 04.12.2012