0

我正在尝试在 Flash 中创建一个类似 jQuery 的滑块。我目前正在使用 tween 类来移动对象的 x 位置,但它有点问题。我必须使用 Flash,因为它被整合到一个最适合 Flash 的宣传册软件中。

当我单击右箭头按钮时,对象将移动到新的 x 位置。当我再次单击该按钮时,它会移动,但有时会跳回当前位置。当我单击左侧按钮时,它有时会超出目的地。

我可以创建一个简单的“单击以转到下一帧”类型的滚动条,但它不会提供相同的补间/滚动效果。

这是我正在使用的代码:

import fl.transitions.Tween;
import fl.transitions.easing.*;
import fl.transitions.TweenEvent;

var scrollTweenRight:Tween = new Tween(mc_scroll, "x", Strong.easeOut, mc_scroll.x, mc_scroll.x-1940, 3, true);
scrollTweenRight.stop();

var scrollTweenLeft:Tween = new Tween(mc_scroll, "x", Strong.easeOut, mc_scroll.x, mc_scroll.x+1940, 3, true);
scrollTweenLeft.stop();


// functions 
function scrollRight(e:MouseEvent){
    scrollTweenRight.start();
}
function scrollLeft(e:MouseEvent){
    scrollTweenLeft.start();
}


// listeners 
btn_right.addEventListener(MouseEvent.CLICK, scrollRight);
btn_left.addEventListener(MouseEvent.CLICK, scrollLeft);
4

1 回答 1

0

使用一些像 TweenLite/TweenMax/Tweener 这样的库,内置的不是太好(而且也很慢)。

如果您想以常规的“步数”移动,请不要使用 mc.x 来确定最终位置,因为每次单击按钮时都会采用该位置。始终将“最终”(所需)位置存储在 var 中。例子:

var shouldMoveToX:Number = 0; //initial position value
var step:Number = 500;
function scrollLeft(e:MouseEvent):void {
  shouldMoveToX += step;
  //kill the tween if any - I dunno if this is necessary, I haven't used Tween class in ages
  //start the tween, pass the final position as shouldMoveToX
}

编辑:哦,我知道现在的问题是什么——你将 mc 的 X pos 传递给 Tween 的构造函数,而你实际上从未更新它。补间将始终从这一点开始。将其放入您的 scrollLeft/Right 函数中:

function scrollRight(e:MouseEvent){
    scrollTweenRight.begin = mc_scroll.x;
    scrollTweenRight.start();
}

我上面写的仍然适用,始终使用 shouldMoveToX 作为最终位置,否则在快速单击时会出现不规则移动。

...所以你的完整代码应该是这样的:

import fl.transitions.Tween;
import fl.transitions.easing.*;
import fl.transitions.TweenEvent;

var scrollTweenRight:Tween = new Tween(mc_scroll, "x", Strong.easeOut, mc_scroll.x, mc_scroll.x, 3, true);
scrollTweenRight.stop();

var scrollTweenLeft:Tween = new Tween(mc_scroll, "x", Strong.easeOut, mc_scroll.x, mc_scroll.x, 3, true);
scrollTweenLeft.stop();

var step:Number = 100;
var shouldMoveToX:Number = mc_scroll.x;

// functions 
function scrollRight(e:MouseEvent){
    scrollTweenRight.begin = mc_scroll.x;
    shouldMoveToX -= step;
    scrollTweenRight.finish = shouldMoveToX;
    scrollTweenRight.start();
}
function scrollLeft(e:MouseEvent){
    scrollTweenLeft.begin = mc_scroll.x;
    shouldMoveToX += step;
    scrollTweenLeft.finish = shouldMoveToX;
    scrollTweenLeft.start();
}


// listeners 
btn_right.addEventListener(MouseEvent.CLICK, scrollRight);
btn_left.addEventListener(MouseEvent.CLICK, scrollLeft);
于 2013-08-01T15:53:32.783 回答