2015-05-21 133 views
2

我已经做了一个as3 android应用程序,我已经使用滑动手势去下一帧和前一帧。但我希望当我跳转到下一个或上一帧它滑动顺畅。我试图使用补间最大,但它不起作用。我发现补间插件总是工作的电影剪辑。所以我怎样才能让滑动平滑。可以我使其光滑无吐温插件吗?这里是我的代码....滑动手势不光滑,跳帧

Multitouch.inputMode = MultitouchInputMode.GESTURE; 
stage.addEventListener (TransformGestureEvent.GESTURE_SWIPE, SwipeHandler); 
function SwipeHandler(event:TransformGestureEvent):void 
{ 
    switch(event.offsetX) 
    { 
     // swiped right 
     case 1: 
     { 
     prevFrame(); 
     break; 
     } 

    // swiped left 
    case -1: 
    { 
     if(currentFrame == 10) 
     { 
      stop(); 
     } 
     else 
     { 
      nextFrame(); 
      break; 
     } 
     } 
    } 
} 

回答

1

为了您能够顺利交换,你需要在你的屏幕上,这是不符合正品的情况下在两个帧的Flash帧。平滑过渡通过ENTER_FRAME处理程序进行动画处理,可能隐藏实际的帧更改过程。所以,为了平滑过渡,您需要将一帧的图片移动到左侧,而另一帧从右侧移动而不是简单的nextFrame()。假设你有一个60fpa的舞台,并尝试平滑过渡。您将需要两个屏幕大小的对象,一个描绘当前帧和一个要显示的帧,随时可以显示为单个过渡。举例:

var transition:Sprite; 
var bitmaps:Array; 
var leftSide:Bitmap 
var rightSide:Bitmap; 
// initialization code, best placed in constructor 
leftSide=new Bitmap(); 
rightSide=new Bitmap(); 
bitmaps=[]; 
transition=new Sprite(); 
transition.addChild(leftSide); 
transition.addChild(rightSide); 
rightSide.x=stage.stageWidth; //left side and right side should be aside each other 

这是所需结构的声明。计划将显示transition,给它两个Bitmap s,它们将链接到两个不同的BitmapData对象,该对象将保存新帧和旧帧的图片。我们将在当前帧的位图数据上绘制当前帧,然后获取存储的下一帧位图数据和do过渡。

function swipeHandler((event:TransformGestureEvent):void { 
    var doSwitch:Boolean=false; 
    var targetFrame:int=currentFrame; 
    switch(event.offsetX) { 
     // swiped right 
     case 1: { 
      if (currentFrame>2) { 
       // let's say we're not allowed to swipe right from frame 2 
       targetframe=currentFrame-1; 
       doSwitch=true; 
      } 
      break; 
     } 
     // swiped left 
     case -1: { 
      if(currentFrame < 10) { 
       targetFrame=currentFrame+1; 
       doSwitch=true; 
      } 
      break; 
     } 
    } 
    if (!doSwitch) return; 
    // prepare transition 
    if (!bitmaps[targetFrame]) bitmaps[targetFrame]=new BitmapData(stage.stageWidth,stage.stageHeight,false,0xffffff); 
    //^make a new bitmap if there's none for target frame 
    if (!bitmaps[currentFrame]) bitmaps[currentFrame]=new BitmapData(stage.stageWidth,stage.stageHeight,false,0xffffff); 
    // the same for source frame 
    bitmaps[currentFrame].fillRect(bitmaps[currentFrame].rect,0xffffff); 
    bitmaps[currentFrame].draw(stage); // draw current frame on the bitmap 
    // with this and stored bitmaps, old frame would remain drawn on the cached bitmap 
    // and able to be used as a transition image 
    if (targetFrame>currentFrame) { 
     leftSide.bitmapData=bitmaps[currentFrame]; 
     rightSide.bitmapData=bitmaps[targetFrame]; 
     transition.x=0; 
     // here is the place to initialize TweenMax tween to move "transition" 
     // and don't forget to removeChild(transition) at the end of the tween 
    } else { 
     rightSide.bitmapData=bitmaps[currentFrame]; 
     leftSide.bitmapData=bitmaps[targetFrame]; 
     transition.x=-1*stage.stageWidth; 
     // same here for tweening 
    } 
    stage.addChild(transition); 
    gotoAndStop(targetFrame); 
} 

这会将准备好的transition对象在屏幕上的所有标的项目以上,有效地掩蔽确切帧交换机,通过gotoAndStop()呼叫完成。此对象的x坐标可以在之后进行补间,并且一旦补间完成,对象应从舞台上移除。

希望这会有所帮助。