2011-09-09 7 views
1

Monotouchを使用して2つのイメージをアニメーション化しようとしています。私はCATransactionとAnimationグループを検討してきましたが、MonoTouchの例はあまり公平ではなく、これらのオブジェクトはどちらも1つのレイヤーにしか当てはまらないようです。Monotouchを使用して同時に2つのレイヤーにアニメーションを適用する方法

誰かが、両方の画像を同時にアニメーション化するためにどのような種類のオブジェクトを正しい方向に向けることができますか?

おかげ

 MovePos(img); 
     MovePos(img2); 

     public void MovePos (UIView view) 
     { 
      var theAnimation = CABasicAnimation.FromKeyPath ("position"); 
      theAnimation.Duration = 2; 
      theAnimation.From = NSValue.FromPointF (new PointF (74, 74)); 
      theAnimation.To = NSValue.FromPointF (new PointF (566, 406)); 
      theAnimation.TimingFunction = new CAMediaTimingFunction (0.25f ,0.1f ,0.25f ,1.0f); 

      view.Layer.AddAnimation (theAnimation, "animateLabel"); 
     } 
+0

私はCATransactionとAnimationを扱うのに慣れていませんが、上記のコードが1つのレイヤーで動作する場合、おそらくスレッドを使用してMovを実行できます両方のビューのePos()メソッドを同時に使用できます。 HTH – psycho

答えて

3

をあなたがTweetStationの「スワイプ」のセルのためのソースコードを見ることができます実行サポートは、一度にアニメーションをVARIOS:

  • が、それがアイコンでフェード右
  • にセルをアニメーション化
  • これは、アイコンが成長し、その後、戻って自分のサイズに
  • をスケーリング可能
  • は、これらのすべてが単一のトランザクションで実行されている以前の既存のメニュー

をバウンス。ソースコードはである:

https://github.com/migueldeicaza/TweetStation/blob/06e2ae5484103a85660201592bd7f06fb1b69395/TweetStation/UI/SwipeSupport.cs

アニメーションは、実際にさまざまな場所に分散しています。 SwipeMenuViewは、コンストラクタで独自のアニメーション(背景にアイコンをフェードアウトさせ、アイコンを拡大/縮小)を設定し、アニメーションはCAAnimationGroupに追加され、結果のアニメーションはlayer.AddAnimation(group)を使用してレイヤーに追加されます。

このメソッドのコードスニペットここで:アニメーションの他の部分はShowMenuに構成されている

var alpha = (CAKeyFrameAnimation) CAKeyFrameAnimation.FromKeyPath ("opacity"); 
    alpha.Values = new NSNumber [] { 
     NSNumber.FromFloat (0), 
     NSNumber.FromFloat (0.1f), 
     NSNumber.FromFloat (1), 
    }; 
    alpha.KeyTimes = new NSNumber [] { 
     NSNumber.FromFloat (0), 
     NSNumber.FromFloat (1f/(layers.Length-i)), 
     NSNumber.FromFloat (1), 
    }; 

    var size = (CAKeyFrameAnimation) CAKeyFrameAnimation.FromKeyPath ("transform.scale"); 
    size.Values = new NSNumber [] { 
     NSNumber.FromFloat (0.7f), 
     NSNumber.FromFloat (1.3f), 
     NSNumber.FromFloat (1), 
    }; 

    var group = CAAnimationGroup.CreateAnimation(); 
    group.Animations = new CAAnimation [] { alpha, size /*, pos */ }; 
    group.Duration = delay; 

    layer.AddAnimation (group, "showup");     

、その一方が画面の外に細胞をスワイプし、既にあった場合、メニューが表示さ、それセルをアニメーションして、新しい位置に戻します。

ShowMenuがUIView.BeginAnimationsで区切らトランザクションブロックの変更()とUIView.CommitAnimationsグルーピングによるアニメーション:単に

CAAnimation MakeBounceAnimation (float offset, string key) 
{ 
    var animation = (CAKeyFrameAnimation) CAKeyFrameAnimation.FromKeyPath (key); 

    animation.Duration = hideDelay; 
    float left = offset/2; 
    animation.Values = new NSNumber [] { 
     NSNumber.FromFloat (offset+left), 
     NSNumber.FromFloat (left-30), 
     NSNumber.FromFloat (left+10), 
     NSNumber.FromFloat (left-10), 
     NSNumber.FromFloat (left), 
    }; 

    return animation; 
} 

AnimateBack方法:

 UIView.BeginAnimations ("Foo"); 
     UIView.SetAnimationDuration (hideDelay); 
     UIView.SetAnimationCurve (UIViewAnimationCurve.EaseInOut);   

     var animation = MakeBounceAnimation (Math.Abs (offset), "position.x"); 

     foreach (var view in menuCell.ContentView.Subviews){ 
      if (view == currentMenuView) 
       continue; 

      view.SetNeedsDisplay(); 
      AnimateBack (view, animation); 
     } 
     AnimateBack (menuCell.SelectedBackgroundView, animation); 

     UIView.CommitAnimations(); 

は、メニューアニメーションがバウンス効果を有するように作成され

void AnimateBack (UIView view, CAAnimation animation) 
{ 
    var b = view.Bounds; 
    view.Layer.Position = new PointF (b.Width/2, b.Height/2); 
    view.Layer.AddAnimation (animation, "position"); 
} 
+0

ありがとうございます。それはまさに私が探していたものです。 – Kye

0

私は、オブジェクトをアニメーション化する3つの異なる方法を使用します。ニーズのためにこの1つはあなたのコントロール内部の作業を行う必要があります。

Animate (animationDuration, 0, UIViewAnimationOptions.CurveEaseOut, delegate { 
    //your changes here 
    Position = new PointF (566, 406); 
    }, null); 

この問題が解決しない場合は、代わりにこれを使用することができます:

BeginAnimations("MovingStuff"); 
SetAnimationDuration(2f); 
//your changes here, you can modify multiple objects at once and then commit it all together. 
Position = new PointF (566, 406); 
CommitAnimations(); 
関連する問題