Как применить анимацию к двум слоям одновременно, используя Monotouch - PullRequest
1 голос
/ 09 сентября 2011

Я пытаюсь анимировать два изображения, перемещающихся по экрану, используя Monotouch. Я изучал группы CATransaction и Animation, но примеров MonoTouch немного и они справедливы, и оба этих объекта, похоже, применимы только к одному слою.

Может ли кто-нибудь указывать в правильном направлении, какой объект использовать для анимации обоих изображений одновременно?

Спасибо

        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"); 
        }

Ответы [ 2 ]

3 голосов
/ 09 сентября 2011

Вы можете посмотреть исходный код для поддержки ячейки TweetStation «swipe», которая выполняет анимацию сразу:

  • Анимирует ячейку вправо
  • Она исчезает взначки
  • Значения растут, а затем уменьшаются до их размера
  • Отскакивает предыдущее существующее меню

Все они выполняются в одной транзакции.Исходный код находится в:

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

Анимации фактически распространены в разных местах.SwipeMenuView настраивает свою собственную анимацию (переход значков в фоновый режим, увеличение / уменьшение значков) в своем конструкторе, и анимация добавляется в CAAnimationGroup, а полученная анимация добавляется в слой с помощью layer.AddAnimation (group):

Фрагмент кода этого метода приведен здесь:

    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, которая смахивает ячейку с экрана, и если она уже былаотображаемое меню оживляет ячейку, возвращая ее обратно в новое местоположение:

ShowMenu запускает анимацию, группируя изменения в блоке транзакции, ограниченном UIView.BeginAnimations () и UIView.CommitAnimations:

        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 ();

Анимация меню создается с эффектом отскакивания:

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 просто присоединяет анимацию:

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 голосов
/ 09 сентября 2011

Я использую три разных способа анимации объекта.Для ваших нужд это должно работать внутри вашего контроля:

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();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...