FLEX 4 s: Скроллер, как вывести на экран содержащийся компонент? - PullRequest
2 голосов
/ 28 августа 2009

У меня есть много дочерних текстовых вводов в искровом скроллере. Как сделать так, чтобы TextInput с идентификатором «x» был в фокусе, если у меня есть идентификаторы a..z, а также для полосы прокрутки для автоматической прокрутки до этого дочернего элемента?

Я могу использовать x.setFocus (), но полоса прокрутки не прокручивает автоматически до этого элемента? почему?

<s:Scroller id="scroller" width="100%" height="100">
        <s:Group id="group" width="100%" height="100" id="content">
            <s:TextInput id="a" text="" editable="true" width="100%" height="25" />
            <s:TextInput id="b" text="" editable="true" width="100%" height="25" />
            ....
        </s:Group>
</s:Scroller>

Спасибо, Филипп

Ответы [ 4 ]

2 голосов
/ 01 сентября 2009

Причина в том, что setFocus просто делает объект активным, он фактически не перемещается, изменяя scrollPosition элемента ScrollBar. С более сложными классами, такими как List, это более просто, но Scroller довольно прост и поэтому немного сложнее.

Чтобы сделать то, что вы хотите, вы должны получить индекс элемента внутри вашего окна просмотра (вашей группы), а затем вручную установить scrollPosition. Для вертикального макета код будет выглядеть примерно так:

var index:Number = group.getElementIndex(g);
var offset:Number = group.getElementAt(index).height;
scroller.viewport.verticalScrollPosition = index * offset;

Где 'g' - это идентификатор элемента, который вы хотите переместить в свой скроллер.

= Райан Райан@adobe.com

1 голос
/ 26 апреля 2011

Просто посмотрите Flex SDK, вот метод spark.components.List, просто используйте тот же код для вашей группы данных:

public function ensureIndexIsVisible(index:int):void
{
    if (!layout)
        return;

    var spDelta:Point = dataGroup.layout.getScrollPositionDeltaToElement(index);

    if (spDelta)
    {
        dataGroup.horizontalScrollPosition += spDelta.x;
        dataGroup.verticalScrollPosition += spDelta.y;
    }
}
0 голосов
/ 17 октября 2012

Метод getScrollPositionDeltaToElement не учитывает вложенные дочерние элементы. Для этого вы можете использовать метод mx_internal, как показано ниже:

/**
* Focus in handler to be used on form elements inside a Scroller. If the 
* widgets are inside a FormItem, this ensures that the entire FormItem is 
* scrolled into view. Also, if there are validations triggered on focusOut
* of the elements, the default behavior in Flex 4 is to display the error 
* messages at the top of the form. Because this affects the vertical position
* of each element, the logic to scroll the item into view must be delayed 
* until the next frame using callLater()
*
* NOTE: This uses a method, in the mx_internal namespace 
*/
    protected function widgetFocusInHandler(evt:FocusEvent):void {
        //we need to delay this because we may need to account 
        //for validation errors being display above the form.
        callLater(function(field:UIComponent) : void {
            //find the form item that wraps the input and scroll 
            //it into view

            var formItem:DisplayObjectContainer = field.parent;
            while (!(formItem is FormItem) && formItem) {
                 formItem = formItem.parent;
            }

            //if this item wasn't in a form item, then just use the 
            //widget itself
            if (!formItem) {
                formItem = field;   
            }

            var pt:Point = formItem.localToGlobal(new Point(0, formItem.height));

            pt = scrollWrapper.globalToLocal(pt);
            var layout:LayoutBase = scrollWrapper.layout;           
            var delta:Point = layout.mx_internal::getScrollPositionDeltaToAnyElement(field);
            if (delta) {
                if(delta.y > 0) {
                    layout.verticalScrollPosition += delta.y + 20;
                } else if (delta.y < 0) {
                    layout.verticalScrollPosition += delta.y - 20;
                }
            }

        }, [UIComponent(evt.currentTarget)]);
   }
0 голосов
/ 04 июня 2010

пара дополнительных соображений:

  1. элементы в моей группе данных не имеют постоянной высоты, поэтому в этом случае более точная ссылка для установки скроллера будет:

    var y: int = group.getElementAt (index) .y; scroller.viewport.verticalScrollPosition = y;

  2. Убедитесь, что ваша группа данных не настроена на использование виртуализации. Мой был, и я получил ошибки, поскольку элементы были добавлены / удалены во время выполнения.

...