Tôi đang chọn thành phần được chọn trong s: Liệt kê thành phần có Actionscript, nó hoạt động, nhưng Danh sách không cuộn đến mục đã chọn - cần cuộn bằng thanh cuộn hoặc chuột. Có thể tự động cuộn đến mục đã chọn không? Cảm ơn !Di chuyển đến mục đã chọn trong thành phần Danh sách Spark 4
Trả lời
Thử s:List
phương pháp ensureIndexIsVisible(index:int):void.
Trong flex-3 có một phương pháp scrollToIndex
và do đó bạn có thể gọi
list.scrollToIndex(list.selectedIndex);
Tôi tin rằng điều này sẽ làm việc trong flex-4 quá.
Thật không may, không có. Không có phương pháp như vậy trong Danh sách Spark, nhưng nó có cho thành phần Danh sách Halo. Flex 4 đang phát triển và vẫn đang trong giai đoạn Beta, hy vọng vấn đề này sẽ được giải quyết. –
Bạn có lẽ sẽ muốn truy cập scroller của Danh sách trực tiếp và làm điều gì đó như:
list.scroller.scrollRect.y = list.itemRenderer.height * index;
Tôi thấy rằng bạn không thể thay đổi giá trị bên trong scrollRect trực tiếp, thay vào đó bạn cần cập nhật scrollRect bằng hình chữ nhật mới?như [this] (http://www.actionscript.org/forums/showthread.php3?t=190795) – eldamar
Bạn có thể nhân chiều cao của một phần tử bằng chỉ số của nó và vượt qua giá trị này:
yourListID.scroller.viewport.verticalScrollPosition
Gần đây tôi đã thực hiện điều này trong một trong những dự án của tôi bằng cách có kích thước xác định cho chi của tôi trong nhóm ..
<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>
Tiếp theo tôi đây các nút điều khiển cho các thao tác làm việc bằng cách tăng một "targetindex" private biến, sau đó tôi gọi một hàm checkAnimation, mà sử dụng lớp Animate, trong combo với một SimpleMotionPath và so sánh giữa tutpane.firstIndexInView và targ et index. Điều này đã sửa đổi "horizontalScrollPosition" của nhóm.
Điều này cho phép điều khiển riêng biệt để về cơ bản đóng vai trò như một thanh cuộn, nhưng tôi đã yêu cầu trượt điều khiển để xem các sản phẩm được chọn .. Tôi tin rằng kỹ thuật này có thể làm việc để lựa chọn tự động các mặt hàng cũng
Đối Spark:
list.ensureIndexIsVisible(index);
tôi thấy ý tưởng cơ bản này ở đây ... 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();
}
Chức năng này sẽ cuộn lên đầu danh sách trong Flex 4+. Nó có tính đến chiều cao của mục, vì vậy nó sẽ làm việc cho các danh sách với các mục khác nhau với chiều cao khác nhau.
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);
}
Phiên bản ngắn hơn: 'callLater (list.ensureIndexIsVisible, [list.selectedIndex])' nhưng vẫn không phải là giải pháp tốt nhất - đôi khi chỉ ra các lỗi phạm vi –
này đã làm việc cho tôi. đã phải sử dụng callLater.
list.selectedItem = "MyTestItem"; //or list.selectedIndex = 10;
this.callLater(updateIndex); //dispatch an update to list
private function updateIndex():void {
list.ensureIndexIsVisible(list.selectedIndex);
}
Đây là một lỗi - bạn có thể thấy các cuộc biểu tình và một workaround tại https://issues.apache.org/jira/browse/FLEX-33660
mở rộng Danh sách thành phần tùy chỉnh này đã làm việc cho tôi:
<s:List
xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
valueCommit="callLater(ensureIndexIsVisible, [selectedIndex])">
</s:List>
Cảm ơn, nhưng có vẻ như chỉ hoạt động trong phiên bản Flex 4 SDK mới nhất (Flex Builder 4 Beta 2). Tôi nhận ra rằng tôi làm việc với một trong những bản dựng cũ chưa có phương pháp này. –
điều này cũng chỉ cuộn để phần trên cùng của mục hiển thị, nếu mục đó cao thì không cuộn xuống dưới cùng – JTtheGeek
@JTtheGeek Có, trong Danh sách Spark 4.6 có vẻ như bạn phải bấm hai lần để cuộn xuống dưới. – Nemi