Ustawiam wybrany element w: Składnik listy z Actionscript, działa, ale Lista nie przewija do wybranego elementu - trzeba przewijać za pomocą paska przewijania lub myszy. Czy można automatycznie przewinąć do wybranego elementu? Dzięki !Przewiń do wybranej pozycji w elemencie Flex 4 Spark List
Odpowiedz
spróbować metody ensureIndexIsVisible(index:int):voids:List
.
Flex-3 istnieje metoda scrollToIndex
i stąd można zadzwonić
list.scrollToIndex(list.selectedIndex);
Wierzę, że to powinno działać w Flex-4 też.
Niestety, nie. Nie ma takiej metody na Spark List, ale jest tam dla składnika listy Halo. Flex 4 ewoluuje i nadal działa w wersji Beta, mam nadzieję, że problem zostanie rozwiązany. –
Prawdopodobnie będziesz mieć dostęp scroller listy bezpośrednio i zrobić coś takiego:
list.scroller.scrollRect.y = list.itemRenderer.height * index;
Zauważyłem, że nie można bezpośrednio zmienić wartości wewnątrz scrollRect, zamiast tego trzeba zaktualizować scrollRect za pomocą nowego prostokąta?jak [this] (http://www.actionscript.org/forums/showthread.php3?t=190795) – eldamar
można pomnożyć wysokość elementu o indeksie i przekazać tę wartość do:
yourListID.scroller.viewport.verticalScrollPosition
Niedawno dokonał tego w jednym z moich projektów poprzez zdefiniowany rozmiar moich artykułów w grupie ..
<s:Scroller x="940" y="0" maxHeight="465" maxWidth="940" horizontalScrollPolicy="off" verticalScrollPolicy="off">
<s:HGroup id="tutPane" columnWidth="940" variableColumnWidth="false" gap="0" x="0" y="0">
</s:HGroup>
</s:Scroller>
następstwie tej moich przycisków sterujących do manipulacji pracował przez zwiększający prywatny „targetindex” zmienna, a następnie zadzwoniłem funkcję checkAnimation, który używany klasę Animacja, w kombi z SimpleMotionPath i porównania tutpane.firstIndexInView i targ et index. To zmodyfikowało "horizontalScrollPosition" grupy.
Pozwoliło to oddzielne kontrole zasadniczo pełnić funkcję paska przewijania, ale miałem wymóg przesuwając sterowania, aby wyświetlić wybrany element .. Wierzę, że ta technika może pracować dla automatycznego doboru elementów oraz
Dla Spark:
list.ensureIndexIsVisible(index);
widziałem tę podstawową ideę tutaj ... http://arthurnn.com/blog/2011/01/12/coverflow-layout-for-flex-4/
public function scrollGroup(n : int) : void
{
var scrollPoint : Point = theList.layout.getScrollPositionDeltaToElement(n);
var duration : Number = (Math.max(scrollPoint.x, theList.layout.target.horizontalScrollPosition) - Math.min(scrollPoint.x, theList.layout.target.horizontalScrollPosition)) * .01;
Tweener.addTween(theList.layout,{ horizontalScrollPosition: scrollPoint.x , time:duration});
}
protected function theList_caretChangeHandler(event:IndexChangeEvent):void
{
scrollGroup(event.newIndex);
event.target.invalidateDisplayList();
}
Ta funkcja przewinie do góry listy w programie Flex 4+. Bierze pod uwagę wysokość przedmiotu, więc będzie działać dla list z różnymi przedmiotami o różnej wysokości.
private function scrollToIndex(list:List,index:int):void
{
if (!list.layout)
return;
var dataGroup:DataGroup = list.dataGroup;
var spDelta:Point = dataGroup.layout.getScrollPositionDeltaToElement(index);
if (spDelta)
{
dataGroup.horizontalScrollPosition += spDelta.x;
//move it to the top if the list has enough items
if(spDelta.y > 0)
{
var maxVSP:Number = dataGroup.contentHeight - dataGroup.height;
var itemBounds:Rectangle = list.layout.getElementBounds(index);
var newHeight:Number = dataGroup.verticalScrollPosition + spDelta.y
+ dataGroup.height - itemBounds.height;
dataGroup.verticalScrollPosition = Math.min(maxVSP, newHeight);
}
else
{
dataGroup.verticalScrollPosition += spDelta.y;
}
}
}
//try this
this.callLater(updateIndex);//where you want to set the selectedIndex
private function updateIndex():void
{
list.selectedIndex = newIndex;
list.ensureIndexIsVisible(newIndex);
}
Krótsza wersja: 'callLater (list.ensureIndexIsVisible, [list.selectedIndex])' ale nadal nie jest najlepszym rozwiązaniem - czasami wyrzuca indeks poza zakresy błędów –
Ten pracował dla mnie. musiał użyć callLater.
list.selectedItem = "MyTestItem"; //or list.selectedIndex = 10;
this.callLater(updateIndex); //dispatch an update to list
private function updateIndex():void {
list.ensureIndexIsVisible(list.selectedIndex);
}
To jest błąd - można zobaczyć demonstrację i obejście na https://issues.apache.org/jira/browse/FLEX-33660
Ten zwyczaj rozszerzenie komponentu Lista pracował dla mnie:
<s:List
xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
valueCommit="callLater(ensureIndexIsVisible, [selectedIndex])">
</s:List>
Dzięki, ale wygląda na to, że działa tylko w najnowszych wersjach Flex 4 SDK (Flex Builder 4 Beta 2). Zdałem sobie sprawę, że pracuję ze starą wersją, która nie ma jeszcze tej metody. –
to również jest przewijane tylko w ten sposób, że góra elementu jest widoczna, jeśli przedmiot jest wysoki, to nie jest przewijany do dołu. – JTtheGeek
@JTtheGeek Tak, na liście Iskry 4.0 wygląda na to, że musisz dwukrotnie kliknąć, aby przewinąć do dołu. – Nemi