C# 在c中完成双动画后如何正确控制平移变换位置#
我在画布的中间有一个椭圆,使用以下代码:C# 在c中完成双动画后如何正确控制平移变换位置#,c#,wpf,animation,C#,Wpf,Animation,我在画布的中间有一个椭圆,使用以下代码: var FixedCircle = new Ellipse { Width = 25, Height = 25, Stroke = color, Fill = color, StrokeThickness = 3 }; var centerX = ActualWidth / 2; var centerY = ActualHeight / 2; FixedCircle.Margin = new Thickness(c
var FixedCircle = new Ellipse
{
Width = 25,
Height = 25,
Stroke = color,
Fill = color,
StrokeThickness = 3
};
var centerX = ActualWidth / 2;
var centerY = ActualHeight / 2;
FixedCircle.Margin = new Thickness(centerX, centerY, 1, 1);
Children.Add(FixedCircle);
InvalidateVisual();
我想为椭圆设置动画,使其从左往回移动到中心(中间点)
我正在设置坐标(centerX,centerY)
和(0,centerY)
作为起点和终点,并且我正在使用直线
Point oldPoint = FixedCircle.TransformToAncestor(this).Transform(new Point(centerX,centerY));
Point newPoint = FixedCircle.TransformToAncestor(this).Transform(new Point(0,centerY));
为了表明转换必须设置为起始点G,我尝试删除它,但移动变得更糟,从botton开始,或者坐标(0,0)
被视为中间,而不是(实际宽度/2,实际高度/2)
,这是我不想要的
TranslateTransform trans = new TranslateTransform();
FixedCircle.RenderTransform = trans;
Point oldPoint = FixedCircle.TransformToAncestor(this).Transform(new Point(centerX,centerY));
Point newPoint = FixedCircle.TransformToAncestor(this).Transform(new Point(0,centerY));
var EndX = FixedCircle.Width / 2 + newPoint.X - oldPoint.X - (FixedCircle.Width);
var EndY = FixedCircle.Height / 2 + newPoint.Y - oldPoint.Y - (FixedCircle.Height);
var a1X = new DoubleAnimation(0, EndX, TimeSpan.FromSeconds(3));
a1X.Completed += (s, e) =>
{
oldPoint = FixedCircle.TransformToAncestor(this).Transform(new Point(0, centerY));
newPoint = FixedCircle.TransformToAncestor(this).Transform(new Point(centerX, centerY));
EndX = FixedCircle.Width / 2 + newPoint.X - oldPoint.X - (FixedCircle.Width);
EndY = FixedCircle.Height / 2 + newPoint.Y - oldPoint.Y - (FixedCircle.Height);
var a2X = new DoubleAnimation(0, EndX, TimeSpan.FromSeconds(3));
trans.BeginAnimation(TranslateTransform.XProperty, a2X);
};
trans.BeginAnimation(TranslateTransform.XProperty, a1X);
我得到的效果是椭圆正确地从中间向左移动
那么,我的<强>问题< /强>,<强>从中间开始,到右边,当我需要椭圆从“强>左到中间,不是中到右< /强>:
我缺少什么?下面的代码从中间到左边和后面重复运行动画。它使用带有椭圆等高线的路径,因为该路径居中(而不是像椭圆一样上/左对齐)。它也不绘制笔划,只是将笔划厚度添加到椭圆的半径中
var transform = new TranslateTransform(canvas.ActualWidth / 2, canvas.ActualHeight / 2);
var radius = 14;
var circle = new Path
{
Data = new EllipseGeometry(new Point(), radius, radius),
Fill = Brushes.White,
RenderTransform = transform
};
canvas.Children.Add(circle);
var animation = new DoubleAnimation
{
To = radius,
Duration = TimeSpan.FromSeconds(3),
AutoReverse = true,
RepeatBehavior = RepeatBehavior.Forever
};
transform.BeginAnimation(TranslateTransform.XProperty, animation);
对于从中心点开始的从右到左和从后的重复动画,请使用负起始时间:
var transform = new TranslateTransform(
canvas.ActualWidth - radius, canvas.ActualHeight / 2);
var animation = new DoubleAnimation
{
To = radius,
Duration = TimeSpan.FromSeconds(6),
AutoReverse = true,
RepeatBehavior = RepeatBehavior.Forever,
BeginTime = TimeSpan.FromSeconds(-3)
};
如果不通读所有代码,有一点是清楚的。不应设置椭圆的边距。要么为Canvas.Left和Canvas.Top属性设置动画,并从适当的初始值开始,要么为TranslateTransform设置动画,并使用适当的初始RenderTransform。Elipse应该如何移动?它是一个连续的动画,或者应该被多次触发,从当前位置移动到新的位置?想要成为一个连续的动画,从中间到左边,然后从左边到中间等等,所以,我删除了设置边距代码,我如何初始化屏幕中心的椭圆,制作动画的过程是什么?to=radius,在做什么?但是,我不知道你怎么告诉我向左走,我的意思是,我得到了自动翻转部分,但是你怎么能改变你的代码使椭圆向右移动,例如,它是圆中心X值的最左边的值。否则if将在左边框处消失一半。向右移动
to=canvas.ActualWidth-radius
您可能还希望为动画添加一个测量功能,以实现变速移动。