C# 如何使用Monotouch将动画同时应用于两个层

C# 如何使用Monotouch将动画同时应用于两个层,c#,animation,xamarin.ios,C#,Animation,Xamarin.ios,我正在尝试使用Monotouch制作两个在屏幕上移动的图像的动画。我一直在研究CATTransaction和Animation组,但MonoTouch的例子很少,而且两者之间也很公平,而且这两个对象似乎只适用于一个层 是否有人能够指向正确的方向,使用什么类型的对象同时为两个图像设置动画 谢谢 MovePos(img); MovePos(img2); 公共作废移动位置(UIView) { var theAnimation=cabasicaniation.FromKeyPath(“位置”); 动画。

我正在尝试使用Monotouch制作两个在屏幕上移动的图像的动画。我一直在研究CATTransaction和Animation组,但MonoTouch的例子很少,而且两者之间也很公平,而且这两个对象似乎只适用于一个层

是否有人能够指向正确的方向,使用什么类型的对象同时为两个图像设置动画

谢谢

MovePos(img);
MovePos(img2);
公共作废移动位置(UIView)
{
var theAnimation=cabasicaniation.FromKeyPath(“位置”);
动画。持续时间=2;
animation.From=NSValue.FromPointF(新的点f(74,74));
To=NSValue.FromPointF(新的点f(566406));
animation.timing函数=新的Camediatiming函数(0.25f、0.1f、0.25f、1.0f);
view.Layer.AddAnimation(动画,“animateLabel”);
}

我使用三种不同的方法来设置对象的动画。为了满足您的需求,这一点应该在您的控制范围内:

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

您可以查看TweetStation的“滑动”单元支持的源代码,它可以立即执行varios动画:

  • 它会将单元格设置为右侧的动画
  • 它会在图标中淡出
  • 它使图标增长,然后缩小到其大小
  • 反弹上一个现有菜单
所有这些都是在一个事务中完成的。源代码位于:

动画实际上分布在不同的地方。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.Committeanimations分隔的事务块中的更改进行分组来触发动画:

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

我不习惯处理CATTransaction和动画,但是如果上面的代码适用于一个层,您可能可以使用线程同时为两个视图运行
MovePos()
方法。汉克斯。这正是我想要的。