timelineScrubber проблема - PullRequest
       3

timelineScrubber проблема

1 голос
/ 29 ноября 2011

Я сделал шкалу времени.Это работает, но я сталкиваюсь с несколькими проблемами.

  1. Когда я нажимаю в конце дорожки, скруббер должен идти и останавливаться в конце дорожки ползунка, но вместо этого он идет в конецдорожка, затем переходит к началу анимации и воспроизводит анимацию.
  2. Скруббер не движется плавно.Это немного застряло.Он не перемещается свободно.

Я прикрепил файл fla на тот случай, если кто-то захочет его увидеть.ссылка http://www.mediafire.com/?cyk84zf0ndq6r. Может кто-нибудь сказать мне, где я иду не так?

import flash.geom.Rectangle;
import flash.events.MouseEvent;

var barLength : Number = slider_mc.bar.width - slider_mc.scrub.width;
var rect : Rectangle = new Rectangle (slider_mc.bar.x, slider_mc.scrub.y, barLength, 0);
var moviePlaying:Boolean = true;

slider_mc.scrub.buttonMode = true;
slider_mc.scrub.addEventListener(MouseEvent.MOUSE_DOWN, this.scrubMouseDownHandler);

function scrubMouseDownHandler (event : MouseEvent) : void {
  this.addEventListener("enterFrame",onEnterFrame);     
  slider_mc.scrub.addEventListener (MouseEvent.MOUSE_MOVE, this.scrubMouseMoveHandler);
  slider_mc.scrub.addEventListener(MouseEvent.MOUSE_UP, this.scrubRemoveListenerHandler);
  slider_mc.scrub.addEventListener(MouseEvent.MOUSE_OUT, this.scrubRemoveListenerHandler);
  slider_mc.scrub.startDrag (false, rect);
}

function scrubMouseMoveHandler (event : MouseEvent) : void  {
  var spanPercentage : Number = (slider_mc.scrub.x - slider_mc.bar.x) / barLength;
  var framePosition : int = int (animationMc.totalFrames * spanPercentage);
  if (framePosition < 1) framePosition = 1 ;        
  slider_mc.bar.sliderFill_mc.scaleX = ((440/animationMc.totalFrames) * animationMc.currentFrame);
  //trace (framePosition);
  if (moviePlaying==true) {
    animationMc.gotoAndPlay(framePosition);
    //moviePlaying = false;
  } else if(moviePlaying==false) {
    animationMc.gotoAndStop(framePosition);
  }
}

function scrubRemoveListenerHandler (event : MouseEvent) : void  {
  slider_mc.scrub.removeEventListener (MouseEvent.MOUSE_MOVE, this.scrubMouseMoveHandler);
  slider_mc.scrub.removeEventListener(MouseEvent.MOUSE_UP, this.scrubRemoveListenerHandler);
  slider_mc.scrub.removeEventListener (MouseEvent.MOUSE_OUT, this.scrubRemoveListenerHandler);
  slider_mc.scrub.stopDrag ();
}

slider_mc.bar.sliderFill_mc.width = 0;
this.addEventListener("enterFrame",onEnterFrame);

function onEnterFrame(e:Event) {
  //By default scrub keeps on moving along with animation at the start of swf, when it is published
  //sl.value = this.currentFrame;
  slider_mc.scrub.x = Math.floor((barLength/animationMc.totalFrames) * animationMc.currentFrame);

  //it causes fill to scale along with scrub
  slider_mc.bar.sliderFill_mc.scaleX((440/animationMc.totalFrames) * animationMc.currentFrame);


  /////CURRENT TIME///
  var currentSeconds = Math.floor(animationMc.currentFrame/24);
  var CurrentInput = currentSeconds;

  var timeElapsed = (CurrentInput > 3600 ? Math.floor(CurrentInput/3600) + ':':'') //hours
    +(CurrentInput%3600 < 600 ? '0':'')+Math.floor(CurrentInput%3600/60)+':' //minutes
    +(CurrentInput%60 < 10 ? '0':'')+CurrentInput%60; //seconds

  //trace(timeElapsed);
  currentTime.text = timeElapsed;
}


pause_btn.addEventListener(MouseEvent.CLICK, pauseAnim);
function pauseAnim(event:MouseEvent):void {
  //this.removeEventListener("enterFrame",onEnterFrame);
  moviePlaying = false;
  animationMc.stop();
}

play_btn.addEventListener(MouseEvent.CLICK, playAnim);
function playAnim(event:MouseEvent):void{
  this.addEventListener("enterFrame",onEnterFrame);
  moviePlaying = true;
  animationMc.play();
}

slider_mc.buttonMode = true;
slider_mc.useHandCursor = true;

slider_mc.bar.addEventListener(MouseEvent.CLICK, snapTo);
function snapTo(event:MouseEvent) {
  slider_mc.scrub.x = mouseX;
  //slider_mc.bar.sliderFill_mc.scaleX =((440/animationMc.totalFrames) * animationMc.currentFrame);

  var spanPercentage : Number = (slider_mc.scrub.x - slider_mc.bar.x) / barLength;
  var framePosition : int = int (animationMc.totalFrames * spanPercentage);
  slider_mc.bar.sliderFill_mc.scaleX =((440/animationMc.totalFrames) * animationMc.currentFrame);

  //trace (framePosition);

  if (moviePlaying==true) {
    animationMc.gotoAndPlay(framePosition);
    //moviePlaying = false;
  } else if(moviePlaying==false) {
    animationMc.gotoAndStop(framePosition);
  }
}

///better because it gives to leading zeros///////////
//TOTAL TIME///
var totalSeconds = Math.floor(animationMc.totalFrames/24);
var input = totalSeconds;

var totalAnimTime = (input > 3600 ? Math.floor(input/3600) + ':':'') //hours
  + (input%3600 < 600 ? '0':'') + Math.floor(input%3600/60)+':' //minutes
  + (input%60 < 10 ? '0':'') + input%60; //seconds

//trace(totalAnimTime);
totaltime.text = "/"+totalAnimTime;

1 Ответ

0 голосов
/ 30 ноября 2011
  1. проблема заключается в расчете spanPercentage возле линии 106. Если щелкнуть близко к концу, это может быть число> 1, что дает вам значение FramePosition, превышающее количество кадров в анимации.

Поскольку вы не можете переместить игровую головку за количество кадров, она возвращается к первому кадру.

Быстрое решение - сделать spanPercentage = 1, если spanPercentage> 1. Ниже приведены соответствующие строки.

function snapTo (event:MouseEvent){

    slider_mc.scrub.x = mouseX;
    //trace("mouseX: "+root.mouseX , slider_mc.scrub.x);
    trace("animationMc.currentFrame: "+ Math.floor((barLength/animationMc.totalFrames)* animationMc.currentFrame));

    //slider_mc.bar.sliderFill_mc.scaleX=((440/animationMc.totalFrames)*animationMc.currentFrame);

    var spanPercentage : Number = (slider_mc.scrub.x - slider_mc.bar.x) / barLength;
    trace("spanPercentage: " +spanPercentage);
    if(spanPercentage > 1){
        spanPercentage = 1;
    }
    var framePosition : int = int (animationMc.totalFrames * spanPercentage);

    slider_mc.bar.sliderFill_mc.scaleX=((440/animationMc.totalFrames)*animationMc.currentFrame)
    //trace (framePosition);



    if (moviePlaying==true){
        animationMc.gotoAndPlay(framePosition);
        //moviePlaying = false;
    }
    else if(moviePlaying==false) {
        animationMc.gotoAndStop(framePosition);
    }

}
  1. Ваш экземпляр slider_mc растянулся на сцене с 440 до 574. Возвращение его к правильному размеру в 440 пикселей исправит ваш фанк-скруббер.

Проверьте это в действии и загрузите: http://micromedia.vaniercollege.qc.ca/home/nortonb/2011-12/flash2/stackoverflow/scrubber.htm

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...