2013-04-27 1 views
0

내가 스크롤와 VGROUP를 스크롤하기 위해 노력하고있어 IViewport 들어, verticalScrollPosition을 변경하려면 :방법이 동적으로

<s:Scroller id="scroller" width="100" height="100"> 

     <s:VGroup id="vp" width="100%" height="100%"> 

      <my:TripView id="one"/> 

      <my:TripView id="two"/> 

      // if any more TripView..... 

     </s:VGroup> 

</s:Scroller> 

TripView가 dynamiclly 생성, viewPortHeight보다 VGROUP contentHeight 수도 훨씬 더 그렇게. TripView에서 물건을 드래그 할 수 있으므로 드래그 항목이 거의보기의 맨 아래로 이동하면 다른 TripView가 화면에 표시 될 수 있으므로 vp.verticalScrollPosition을 변경하려고합니다.

+0

@RIAstar, 당신이 어떤 생각을 가지고 할 : 다음은 구현? – jason

+0

@Kate, thx 편집 용 – jason

답변

0

가장 중요한 것은 scrollRect입니다. scrollRect에 따라 verticalScrollPosition을 변경하십시오. ScrollManager를 사용하려면 registerViewport 함수로 뷰포트를 등록해야합니다. 그런 다음 이벤트 리스너가 startScroll을 호출 할 때 mouseMove 이벤트를 수신합니다.

패키지 유틸 {

import flash.display.Stage; 
import flash.events.MouseEvent; 
import flash.geom.Point; 
import flash.geom.Rectangle; 

import mx.core.IInvalidating; 

import spark.components.Group; 


public class ScrollManager { 
    private var viewport:Group; 
    private var stage:Stage; 

    private var oldMovingMouseY:Number; 

    private static var _instance:ScrollManager; 

    //threshold for scrolling 
    private const FUDGE:Number = 35; 
    //scroll up speed 
    private const UP_SCROLL_DELTA:int = 50; 
    //scroll down speed 
    private const DOWN_SCROLL_DELTA:int = 80; 

    public function registerViewport(viewport:Group):void { 
     this.viewport = viewport; 
     this.stage = viewport.stage; 
    } 

    public static function getInstance():ScrollManager { 
     if(_instance == null) { 
      _instance = new ScrollManager(); 
     } 
     return _instance; 
    } 

    public function startScroll(mouseEvent:MouseEvent):void { 
     oldMovingMouseY = mouseEvent.stageY; 
     stage.addEventListener(MouseEvent.MOUSE_MOVE, onMouseMove, false, 0, true); 
     stage.addEventListener(MouseEvent.MOUSE_UP, onMouseUp, false, 0, true); 
    } 

    private function onMouseUp(event:MouseEvent):void { 
     stage.removeEventListener(MouseEvent.MOUSE_MOVE, onMouseMove); 
     stage.removeEventListener(MouseEvent.MOUSE_UP, onMouseUp); 

     if (viewport is IInvalidating) { 
      //viewport.callLater(IInvalidating(viewport).validateNow); 
      //change VSP on scrollRect.y 
      var rect:Rectangle = viewport.scrollRect; 
      viewport.verticalScrollPosition = rect.y; 
      trace("========final vsp ========", rect.y); 
     } 
    } 

    private function onMouseMove(event:MouseEvent):void { 
     var currentMouseX:Number = event.stageX; 
     var currentMouseY:Number = event.stageY; 
     trace("mouseY ", currentMouseY); 

     //scroll direction 
     var delta:Number = currentMouseY - oldMovingMouseY; 
     var direction:int = (delta > 0) ? 1 : (delta < 0) ? -1: 0; 
     var scrollDelta:Number = direction > 0 ? DOWN_SCROLL_DELTA : UP_SCROLL_DELTA; 

     //current mousePoint in viewport coordination 
     var localPoint:Point = viewport.globalToLocal(new Point(currentMouseX, currentMouseY)); 
     trace("localPoint: ", localPoint); 
     var scrollRect:Rectangle = viewport.scrollRect; 
     trace("viewport rect", scrollRect); 

     //determine if need scroll 
     if(needScroll(localPoint, scrollRect, direction)) { 
      trace("direction ", direction > 0 ? " UP": " DOWN"); 
      scrollRect.y += scrollDelta*direction; 
      viewport.scrollRect = scrollRect; 
      if (viewport is IInvalidating) { 
       IInvalidating(viewport).validateNow(); 
      } 
     } 

     oldMovingMouseY = currentMouseY; 
    } 

    private function needScroll(localPoint:Point, scrollRect:Rectangle, direction:int):Boolean { 
     var localY:Number = localPoint.y; 
     var bottom:Number = scrollRect.bottom; 
     var top:Number = scrollRect.top; 

     if(direction > 0 && (localY + FUDGE) > bottom) { 
      return true; 
     } 

     if(direction< 0 && (localY - FUDGE) < top) { 
      return true; 
     } 

     return false; 
    } 
} 

}

관련 문제