C# 如何使用Monotouch将动画同时应用于两个层
我正在尝试使用Monotouch制作两个在屏幕上移动的图像的动画。我一直在研究CATTransaction和Animation组,但MonoTouch的例子很少,而且两者之间也很公平,而且这两个对象似乎只适用于一个层 是否有人能够指向正确的方向,使用什么类型的对象同时为两个图像设置动画 谢谢C# 如何使用Monotouch将动画同时应用于两个层,c#,animation,xamarin.ios,C#,Animation,Xamarin.ios,我正在尝试使用Monotouch制作两个在屏幕上移动的图像的动画。我一直在研究CATTransaction和Animation组,但MonoTouch的例子很少,而且两者之间也很公平,而且这两个对象似乎只适用于一个层 是否有人能够指向正确的方向,使用什么类型的对象同时为两个图像设置动画 谢谢 MovePos(img); MovePos(img2); 公共作废移动位置(UIView) { var theAnimation=cabasicaniation.FromKeyPath(“位置”); 动画。
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动画:
- 它会将单元格设置为右侧的动画
- 它会在图标中淡出
- 它使图标增长,然后缩小到其大小
- 反弹上一个现有菜单
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()
方法。汉克斯。这正是我想要的。