C # WPF 프레임 워크를 기반으로 - 애니메이션

WPF는 고급 모델을 제공, 우리는 관계없이 렌더링이 모델의 정의 애니메이션에 집중할 수 있습니다. 이 모델은 종속성 속성 인프라를 기반으로합니다. 기본적으로 WPF 애니메이션은 약간의 시간 간격 염색 방법을 복구한다. 이 모델은 종속성 속성 인프라를 기반으로합니다. 본질적으로, WPF 애니메이션 단순히 시간 내에 방식 종속성 속성 값을 변경.

WPF 있지만 세 가지 방법 (애니메이션 사용할 수있다 선형 보간 및 경로 키 프레임 )뿐만 아니라 애니메이션 클래스의 값을 수정하는보다 완전한 사용을 완전히 다른 방법을 만들 수 있습니다. 유일한 요구 사항은 사용자 정의 애니메이션 클래스의 기반이되어야한다는 것이다 시간 값을 수정합니다.
많은 완전히 다른 방법으로는 애니메이션 클래스의 값을 수정합니다. 유일한 요구 사항은 사용자 정의 애니메이션 클래스는 시간 값에 따라 수정해야한다는 것입니다.

애니메이션 카테고리

모든 애니메이션 클래스 "가되는 유형 이름 + 애니메이션 방식 명". 이보기는 매우 정확 매우 실제 상황에 가까운, 그러나 아니다.

  • == == 보간을 사용하여 17 "형명 + 애니메이션"클래스.
  • 22 "형 이름 + AnimationUsingKeyFrames"클래스가 사용 == == 키 프레임 애니메이션.
  • 3 "형명 + AnimationUsingPath"== == 기반의 애니메이션 경로를 사용하여 클래스.
    이러한 모든 클래스는 "형식 이름 + AnimationBase"카테고리의 추상적 인 애니메이션에서 상속이 기본 클래스는 사용자 정의 애니메이션 클래스를 만들기위한 바로 가기를 제공하는 몇 가지 기본 기능을 구현합니다. 데이터 유형이 애니메이션의 여러 유형을 지원하는 경우, 모든 애니메이션 클래스는 추상 기본 클래스 애니메이션에서 상속합니다.

    이 42 개 클래스는 유일한 네임 스페이스 System.Windows.Media.Animation 없습니다 - - 내용. 각 키 프레임 애니메이션 키 프레임은 또한 자신의 클래스와 키 프레임 컬렉션을 사용하여,이 두 가지 분류는 약간의 혼란으로 이어질 수 있습니다. 즉, 100 개 이상의 클래스 == System.Windows.Media.Animation == 네임 스페이스가 있습니다.

BooleanAnimationUsingKeyFrames ByteAnimation
ByteAnimationUsingKeyFrames CharAnimationUsingKeyFrames
ColorAnimation ColorAnimationUsingKeyFrames
DecimalAnimation DecimalAnimationUsingKeyFrames
DoubleAnimation DoubleAnimationUsingKeyFrames
DoubleAnimationUsingPath Int16Animation
국제 6AnimationUsingKeyFrames Int32Animation
Int32AnimationUsingKeyFrames Int64Animation
Int64AnimationUsingKeyFrames MatrixAnimationUsingKeyFrames
MatrixAnimationUsingPath ObjectAnimationUsingKeyFrames.
Fointanimtion PointAnimationUsingKeyFrames
Fointanimtionusidagfth Point3DAnimation
Point3DAnimationUsingKeyFrames QuarternionAnimation
QuarternionAnimationUsingKeyFrames RectAnimation
RectAnimationUsingKeyFrames Rotation3DAnimation
Rotation3DAnimationUsingKeyFrames SingleAnimation
SingleAnimationUsingKeyFrames SizeAnimation
SizeAnimationUsingKeyFrames StringAnimationUsingKeyFrames
ThicknessAnimation ThicknessAnimationUsingKeyFrames
VectorAnimation VectorAnimationUsingKeyFrames
Vector3DAnimation Vector3DAnimationUsingKeyFrames

이 계곡의 네임 스페이스 내에서 42 개 개방 클래스 시스템. Windows.Media.Animation 고유하지 않습니다. 각 키 프레임 애니메이션은
또한 자신의 키 프레임과 키 프레임 클래스 컬렉션을 사용하여,이 두 가지 분류는 약간의 혼란으로 이어질 수 있습니다. System.Windows에서, 짧은에서
Media.Animation 네임 스페이스 100 개 이상의 종류.

직선 보간의 사용 애니메이션은 세 가지 사실의 최소 필요 :
== 종료 값 (에게) 시간 (지속 시간) 및 == == == 실행 전체 애니메이션 == (에서) 값을 시작 ==.
사용하지 않고 속성, 속성으로 사용할 수있다. 속성으로보다는 주어진 목표 값을 변경하여 다수의 값을 변경하여 애니메이션을 생성하는 데 사용된다.
값으로 단순히 값에서 추가되는 재산부터를 사용하여 결합 할 수 있지만,이 모든 작업을 감소하지 않습니다으로.,에 값에 도달한다.
대부분의 보간 애니메이션 클래스들은 모든 경우를 속성으로 제공하지만,하지. 예를 들어, 숫자가 아닌 데이터 형식 ,, 속성으로는 클래스 ColorAnimation 색상 구조를 사용하는 것과 같은 의미이다.
그렇지 않으면 방법은 유사한 동작 특성을 사용하지 않고 얻어 질 수는 IsAdditive 속성을 설정하여 값을 증가시켜 애니메이션 생성 할 수있다. 이 애니메이션을 생성 할 때, 전류 값은 자동으로 값 값에서 추가된다.

수명주기의 애니메이션

애니메이션이 새 값 버튼의 폭을 유지하기 위해 필요하기 때문에 실행의 끝에서 (예 : 애니메이션 성장 버튼 등) 편도 애니메이션, 활성 상태로 유지됩니다. 당신이 애니메이션이 완료된 후 속성 값을 수정하는 코드를 사용하려고하면 다음이 리드는 코드가 작동하지 않습니다, 공통의 문제가 아니다. 코드는 속성에 대한 새 로컬 값을 지정하지만 때문에 애니메이션 후 속성 값은 여전히 우선 순위를 갖습니다.
다음과 같이이 문제를 해결하기 위해 여러 가지 방법으로 작업을 완료 할 준비 따르면
요소를 만들 ● 것은 애니메이션의 원래 상태로 재설정됩니다. 목적은 속성 애니메이션으로 설정되어 있지 생성함으로써 달성 될 수있다.
예를 들어, 버튼의 폭이 감소 마지막 설정 버튼 애니메이션의 크기 감소, 당신은 코드 변경이 속성을 사용할 수 있습니다.
플립 애니메이션을 만들 ●. AutoReverse 속성에 의해 플립 애니메이션이 true로 설정되어 만듭니다. 예를 들어, 버튼의 성장시 - 애니메이션 버튼의 폭이 증가없이 역방향 원래 폭으로 돌아 애니메이션을 재생할. 애니메이션의 총 기간은 두 배가됩니다.
FillBehavior 속성을 변경 ●. 일반적 FillBehavior 특성은 애니메이션의 종료가, 타겟 구성 요소의 최종 값을 계속 적용 할 경우 즉 HoldEnd로 설정된다. 정지에 FillBehavior 속성은, 한 애니메이션 끝으로,이 건물은 원래의 값으로 복귀됩니다.
● 애니메이션은 애니메이션 오브젝트 애니메이션 완료 이벤트 핸들러 객체를 삭제하여 완료됩니다.
상위 3 가지 애니메이션의 동작을 변경합니다. 어느 쪽이든, 그들은 그것의 원래 값으로 애니메이션 속성 것입니다. 방법 -이 원하지 않을 경우, 마지막을 사용해야합니다.
우선, 애니메이션 이벤트의 완료에 응답하여, 애니메이션, 관련 이벤트 핸들러를 시작하기 전에 :
widthAnimation 완료된 + = animation_ 완료된 ;.
== 참고 ==
완료된 이벤트는 추가 정보를 개체 종래있는 EventArgs를 사용하지 않고, 종래 이벤트 .NET이다. 이벤트는 이벤트를 라우팅됩니다.

타임 라인 클래스
이름 설명
시작 시간 설정은 영화 시작하기 전에 지연 시간 (시간 범위 유형)에 추가됩니다. 이것은 - 애니메이션 5 초 5 초 지연을 가지고 있으므로, 총 지연 시간에 추가되고, 총 시간은 10 초이다. 때 동시에 동기 시작하지만 순서의 다른 응용 애니메이션 효과, BEGINTIME 속성 유용
지속 사용 기간 애니메이션은 실행 시간의 처음부터 끝까지 객체
속도 비율 속도를 높이거나 애니메이션을 늦출. 일반적 SpeedRatio 속성 값은 1이다. 속성 값이 증가하는 경우, 애니메이션을 가속 (예를 들어, 속성 값 SpeedRatio 5 애니메이션 속도가 5 배 일본어지면) 속성 값이 감소되는 경우 경우, 애니메이션, 예컨대 (느려지을 속성 SpeedRatio 0.5 값 애니메이션 시간) 회 원이된다. 애니메이션 기간 속성을 변경하여 동일한 결과 가치가있을합니다. SpeedRatio 속성의 값에 관계없이, BEGINTIME 지연을 적용 할 때
AccclerationRatio; DecelerationRatio 그래서, 애니메이션은 선형되지 않으며, 시작 느리고 (AcelerationRatio 속성 값을 증가시킴으로써) 성장률 있음 : 속도가 감소되거나 또는 종료된다 (DecelerationRatio 속성 값을 증가시킴으로써). 이 두 속성은 0과 1 사이의 값이며, 처음에 0으로 설정됩니다. 또한, 이러한 두 가지 특성의 합은 1 이상이 될 수 없다
AutoReverse true의 경우, 애니메이션은 플레이어가 자동으로 반대하고 원래 값으로 복귀 할 때 완료됩니다. 또한 애니메이션 실행 시간이 두 배로 증가 할 것이다. 속성 값을 증가 SpeedRatio 경우, 원래의 동영상에 적용된 애니메이션을 반전한다. BEGINTIME 속성 값은 역방향 애니메이션의 시작을 지연시키지 않고 단지 애니메이션인가
FillBehavior 이동이 완료되면 수행 할 작업을 결정합니다. 일반적으로, 속성 값이 일정한 최종 값 (FillBchavior. HoldEnd)를 유지할 수있다,뿐만 아니라 속성 수의 원래 값으로 반환하도록 선택할 수 있습니다 (FillBehavior 정지)
RepeatBehavior 이 속성함으로써, 당신은 간격으로 또는 반복 애니메이션의 수를 지정하는 데 사용할 수 있습니다. RepeatBehavior 개체가이 속성을 설정하는 데 사용됩니다 정확한 동작을 결정합니다
스토리 보드

在所有声明式动画中都会用到如下两个要素:
故事板: 故事板是BeginAnimation( )方法的XAML等价物。通过故事板将动画指定到合适的元素和属性。
事件触发器: 事件触发器响应属性变化或事件(如按钮的Click事件),并控制故事板。例如,为了开始动画,事件触发器必须开始故事板。
小案例:
在这里插入图片描述

以上小案例为点单击按钮时,原形先向右移动到达To值后继续向左移动,矩形向右下角移动,当到达To值后原路返回向左上角移动,此动画为重复执行动画

首先需要引入动画类命名空间;

using System.Windows.Media.Animation;

创建故事板:

        Storyboard sto = new Storyboard(); // 故事板
        Storyboard stt = new Storyboard(); // 向下故事板

初始化图形大小,位置:

            Border bod = new Border(); // 圆形
            bod.Width = 100;
            bod.Height = 100;
            bod.BorderThickness =new Thickness(10); // 设置原形边框厚度
            bod.BorderBrush = Brushes.Yellow; // 边框颜色
            bod.Background = Brushes.Purple; // 圆形背景色
            bod.CornerRadius = new CornerRadius(50); // 画圆
            BG.Children.Add(bod);
            Border boo = new Border(); // 矩形
            boo.Width = 100;
            boo.Height = 100;
            boo.Background = Brushes.Cyan;
            Canvas.SetLeft(boo, 100);
            Canvas.SetTop(boo, 300);
            boo.CornerRadius = new CornerRadius(20);
            BG.Children.Add(boo);

动画情节:

DoubleAnimation move = new DoubleAnimation(); // 移动情节
            move.From = 0; // 初始值
            move.To = 400; // 结束值
            move.Duration = new Duration(new TimeSpan(0, 0, 0, 3, 0)); // 需要的时间
            move.AutoReverse = true; // 设置成返回
            move.RepeatBehavior = RepeatBehavior.Forever; // 重复执行
            Storyboard.SetTarget(move,bod); // 情节添加给对象
            //Storyboard.SetTargetProperty(move, new PropertyPath(Canvas.LeftProperty)); // 改变lef位置
            Storyboard.SetTargetProperty(move, new PropertyPath("(Canvas.Left)"));
            sto.Children.Add(move);

            ColorAnimation bianSe = new ColorAnimation(Colors.Purple,Colors.Orange,TimeSpan.FromMilliseconds(300)); // 改背景色情节
            Storyboard.SetTarget(bianSe, bod);
            Storyboard.SetTargetProperty(bianSe, new PropertyPath("(Border.Background).(SolidColorBrush.Color)"));
            sto.Children.Add(bianSe);

            ColorAnimation biankuSe = new ColorAnimation(Colors.Blue, Colors.DarkViolet,TimeSpan.FromSeconds(3));  // 改变边框颜色
            Storyboard.SetTarget(biankuSe, bod);
            Storyboard.SetTargetProperty(biankuSe, new PropertyPath("(Border.BorderBrush).(SolidColorBrush.Color)"));
            sto.Children.Add(biankuSe);

            ThicknessAnimation kuang=new ThicknessAnimation(new Thickness(10),new Thickness(20),TimeSpan.FromMilliseconds(30));  // 改变边框厚度
            Storyboard.SetTarget(kuang, bod);
            Storyboard.SetTargetProperty(kuang, new PropertyPath("BorderThickness"));
            sto.Children.Add(kuang);

            DoubleAnimation zhuan = new DoubleAnimation(0, 360, new Duration(TimeSpan.FromSeconds(3))); // 旋转情节
            Storyboard.SetTarget(zhuan, bod);
            zhuan.AutoReverse = true;
            zhuan.RepeatBehavior = RepeatBehavior.Forever;
            Storyboard.SetTargetProperty(zhuan, new PropertyPath("RenderTransform.Angle"));
            sto.Children.Add(zhuan);
            RotateTransform xuanZhuan = new RotateTransform(); // 旋转对象
            bod.RenderTransform = xuanZhuan;
            bod.RenderTransformOrigin = new Point(0.5,0.5);

            // 控制boo  向下移动并 旋转
            DoubleAnimation yidong = new DoubleAnimation();// 移动右
            yidong.From = 0;
            yidong.To = 500;
            yidong.Duration = new Duration(TimeSpan.FromSeconds(3)); // 设置毫秒数
            yidong.AutoReverse = true; // 返回原路
            yidong.RepeatBehavior = RepeatBehavior.Forever; // 重复执行
            Storyboard.SetTarget(yidong, boo);
            Storyboard.SetTargetProperty(yidong, new PropertyPath("(Canvas.Left)"));
            stt.Children.Add(yidong);
            DoubleAnimation yidong_ = new DoubleAnimation(Canvas.GetTop(boo),(Canvas.GetTop(boo)+400),new Duration(TimeSpan.FromSeconds(3))); // 移动下
            yidong_.AutoReverse = true;
            yidong_.RepeatBehavior = RepeatBehavior.Forever;
            Storyboard.SetTarget(yidong_, boo);
            Storyboard.SetTargetProperty(yidong_,new PropertyPath("(Canvas.Top)"));
            stt.Children.Add(yidong_);
            DoubleAnimation xiazhuan = new DoubleAnimation(0, 360, new Duration(TimeSpan.FromSeconds(3))); //旋转情节
            Storyboard.SetTarget(xiazhuan, boo);
            xiazhuan.AutoReverse = true; //可原路返回
            xiazhuan.RepeatBehavior = RepeatBehavior.Forever;// 重复执行
            Storyboard.SetTargetProperty(xiazhuan, new PropertyPath("RenderTransform.Angle"));
            stt.Children.Add(xiazhuan);
            RotateTransform xuanzhuan = new RotateTransform(); // 旋转对象
            boo.RenderTransform = xuanzhuan;
            boo.RenderTransformOrigin = new Point(0.5, 0.5);

点击按钮:

        private void btn_Click(object sender, RoutedEventArgs e)
        {
            sto.Begin(); // 开启动画
            stt.Begin();
        }

추천

출처www.cnblogs.com/dust-856/p/12080006.html