2011-02-03 2 views
1

이것은 내가 결코 알아낼 수 없었던 것입니다.애니메이션 플래시 버튼으로 튀어 나와 트윈을 방해하지 않으려면 어떻게해야합니까?

애니메이션을 적용 할 버튼이 있습니다. 'btn'이라고합니다. btn의 애니메이션을 트리거하기위한 근접 센서 역할을하는 히트 영역이 있습니다. 표시 객체의 hitArea 속성과 혼동하지 않도록 'hitZone'이라고 부릅니다.

btn is off stage and hitZone is the white box with the blue border

모두 BTN 및 hitZone는 무비 클립입니다. 청취자는 이와 비슷한 것으로 간다. 마우스가 모두 hitZone BTN 위에있을 때

import com.greensock.*; 
import com.greensock.easing.*; 
import flash.events.MouseEvent; 
var endPoint:Number = 31; 

hitZone.addEventListener(MouseEvent.ROLL_OVER, onHitZoneOver); 
hitZone.addEventListener(MouseEvent.ROLL_OUT, onHitZoneOut); 
hitZone.addEventListener(MouseEvent.CLICK, onHitZoneClick); 

btn.addEventListener(MouseEvent.ROLL_OVER, onBtnOver); 
btn.addEventListener(MouseEvent.ROLL_OUT, onBtnOut); 
btn.addEventListener(MouseEvent.CLICK, onBtnClick); 
btn.mouseChildren = false; 

function onHitZoneOver(e:MouseEvent):void 
{ 
    TweenLite.to(btn, 0.75, {x:endPoint, ease:Expo.easeOut}); 
    trace("over hitZone"); 
} 

function onHitZoneOut(e:MouseEvent):void 
{ 
    TweenLite.to(btn, 0.75, {x:-1, ease:Expo.easeOut}); 
    trace("out hitZone"); 
} 

function onBtnOver(e:MouseEvent):void 
{ 
    hitZone.mouseEnabled = false; 
    hitZone.removeEventListener(MouseEvent.ROLL_OVER, onHitZoneOver); 
    hitZone.removeEventListener(MouseEvent.ROLL_OUT, onHitZoneOut); 
    trace("over BTN"); 

    // This line is the only thing keeping the btn animation from being fired continuously 
    // causing jumpiness. However, calling this allows the animation to be interrupted 
    // at any point. 
    TweenLite.killTweensOf(btn); 
} 

function onBtnOut(e:MouseEvent):void 
{ 
    hitZone.mouseEnabled = true; 
    hitZone.addEventListener(MouseEvent.ROLL_OVER, onHitZoneOver); 
    hitZone.addEventListener(MouseEvent.ROLL_OUT, onHitZoneOut); 
    trace("out BTN"); 
} 

function onBtnClick(e:MouseEvent):void 
{ 
    trace("click BTN"); 
} 

function onHitZoneClick(e:MouseEvent):void 
{ 
     trace("click hitZone"); 
} 

문제입니다. TweenLite.killAllTweensOf()를 호출하지 않으면 단추가 계속 점프됩니다. 이것은 급상승을 해결하지만 새로운 문제를 야기합니다. 이제 btn의 애니메이션을 중단하는 것이 매우 쉽습니다. 스테이지에서 완전히 보이기 전에 중지하십시오.

나는 similar 개의 게시물을 보았지만 똑같은 문제가 있습니다. 아마도 Flash에서 가장자리를 감지하는 방법에 문제가있을 수 있습니다. 한 번도 해결 방법을 본 적이 없기 때문입니다.

답변

2

IIRC이 문제를 해결하기 위해, 나는 /이 내용 (버튼)을 숨기고 보여 마우스 위치를 사용했다. hitZone을 사용하여 마우스 이동 수신기를 트리거합니다. 마우스 위치가 hitZone 외부에 있으면 : 버튼을 숨기고 마우스 이동 리스너를 제거하십시오.

import com.greensock.*; 
import com.greensock.easing.*; 
import flash.events.MouseEvent; 
var endPoint:Number = 31; 

hitZone.addEventListener(MouseEvent.ROLL_OVER, onHitZoneOver); 
hitZone.addEventListener(MouseEvent.CLICK, onHitZoneClick); 

btn.addEventListener(MouseEvent.ROLL_OVER, onBtnOver); 
btn.addEventListener(MouseEvent.ROLL_OUT, onBtnOut); 
btn.addEventListener(MouseEvent.CLICK, onBtnClick); 
btn.mouseChildren = false; 

function onHitZoneOver(e:MouseEvent):void 
{ 
    TweenLite.to(btn, 0.75, {x:endPoint, ease:Expo.easeOut}); 
    stage.addEventListener(MouseEvent.MOUSE_MOVE, onMouseMoved); 
    hitZone.removeEventListener(MouseEvent.ROLL_OVER, onHitZoneOver); 
    trace("over hitZone"); 
} 

function onHitZoneOut(e:MouseEvent):void 
{ 
    TweenLite.to(btn, 0.75, {x:-1, ease:Expo.easeOut}); 
    trace("out hitZone"); 
} 

function onBtnOver(e:MouseEvent):void 
{ 
    trace("over BTN"); 
} 

function onBtnOut(e:MouseEvent):void 
{ 
    trace("out BTN"); 
} 

function onBtnClick(e:MouseEvent):void 
{ 
    trace("click BTN"); 
} 

function onHitZoneClick(e:MouseEvent):void 
{ 
     trace("click hitZone"); 
} 

function onMouseMoved(e:MouseEvent):void 
{ 
     if(!hitZone.hitTestPoint(mouseX, mouseY)) 
     { 
      trace("Sacrebleu!"); 
      TweenLite.to(btn, 0.75, {x:-41, ease:Expo.easeOut}); 
      stage.removeEventListener(MouseEvent.MOUSE_MOVE, onMouseMoved); 
      hitZone.addEventListener(MouseEvent.ROLL_OVER, onHitZoneOver); 
     } 
} 
1

맞았는지 모르겠지만 어쩌면 onHitZoneOver 리스너를 즉시 제거하고 버튼 트윈이 완료 될 때까지 기다려야 다시 트리거 할 수 있습니다. 이 같은

뭔가 : 근접 영역을 다룰 때

hitZone.addEventListener(MouseEvent.MOUSE_OVER, hitAreaOver);
hitZone.addEventListener(MouseEvent.MOUSE_OUT, hitAreaOut);

function onHitZoneOver(event:MouseEvent):void
{
hitZone.removeEventListener(MouseEvent.MOUSE_OVER, hitAreaOver);
TweenLite.to(btn, 0.75, {x:endPoint, ease:Expo.easeOut});
trace("over hitZone");
}

function onHitZoneOut(e:MouseEvent):void
{
TweenLite.to(btn, 0.75, {x:-1, ease:Expo.easeOut});
trace("out hitZone");
hitZone.addEventListener(MouseEvent.MOUSE_OVER, hitAreaOver);
}

+0

이것은 종이에서 작동하지만 여전히 동일한 운명을 겪고 있습니다. : / –

관련 문제