사용자 지정 애니메이션 개요

이 항목에서는 사용자 지정 키 프레임, 애니메이션 클래스를 만들거나, 프레임당 콜백을 사용하여 애니메이션 시스템을 무시하는 방식으로 WPF 애니메이션 시스템을 확장하는 방법 및 시기에 대해 설명합니다.

필수 구성 요소

이 항목을 이해하려면 WPF에서 제공하는 다양한 형식의 애니메이션에 대해 잘 알고 있어야 합니다. 자세한 내용은 From/To/By 애니메이션 개요, 키 프레임 애니메이션 개요경로 애니메이션 개요를 참조하세요.

애니메이션 클래스는 Freezable 클래스에서 상속하므로 Freezable 개체와 Freezable에서 상속하는 방법을 잘 알고 있어야 합니다. 자세한 내용은 Freezable 개체 개요를 참조하세요.

애니메이션 시스템 확장

사용하려는 기본 제공 기능 수준에 따라, WPF 애니메이션 시스템을 확장하는 다양한 방법이 있습니다. WPF 애니메이션 엔진에는 다음과 같은 세 가지 기본 확장 지점이 있습니다.

  • DoubleKeyFrame과 같은 *<Type>*KeyFrame 클래스 중 하나에서 상속하여 사용자 지정 키 프레임 개체를 만듭니다. 이 방법은 WPF 애니메이션 엔진의 기본 제공 기능 대부분을 사용합니다.

  • AnimationTimeline 또는 *<Type>*AnimationBase 클래스 중 하나에서 상속하여 애니메이션 클래스를 직접 만듭니다.

  • 프레임당 콜백을 사용하여 프레임별로 애니메이션을 생성합니다. 이 방법은 애니메이션 및 타이밍 시스템을 완전히 무시합니다.

다음 표에서는 애니메이션 시스템을 확장하기 위한 몇 가지 시나리오에 대해 설명합니다.

원하는 작업... 사용하는 방법
해당 *<Type>*AnimationUsingKeyFrames를 갖는 형식에 대한 값 사이의 보간 사용자 지정 사용자 지정 키 프레임을 만듭니다. 자세한 내용은 사용자 지정 키 프레임 만들기 섹션을 참조하세요.
해당 *<Type>*Animation을 갖는 형식에 대한 값 사이의 보간 이상을 사용자 지정합니다. 애니메이션 효과를 적용할 형식에 해당하는 *<Type>*AnimationBase 클래스에서 상속하는 사용자 지정 애니메이션 클래스를 만듭니다. 자세한 내용은 사용자 지정 애니메이션 클래스 만들기 섹션을 참조하세요.
WPF 애니메이션이 없는 형식에 애니메이션 효과 적용 ObjectAnimationUsingKeyFrames를 사용하거나 AnimationTimeline에서 상속하는 클래스를 만듭니다. 자세한 내용은 사용자 지정 애니메이션 클래스 만들기 섹션을 참조하세요.
프레임별로 계산되고 개체 상호 작용의 마지막 집합을 기준으로 하는 값을 사용하여 여러 개체에 애니메이션 효과 적용 프레임당 콜백을 사용합니다. 자세한 내용은 프레임당 콜백 사용 만들기 섹션을 참조하세요.

사용자 지정 키 프레임 만들기

사용자 지정 키 프레임 클래스를 만드는 것은 애니메이션 시스템을 확장하는 가장 간단한 방법입니다. 이 방법은 키 프레임 애니메이션에 대해 다른 보간 방법을 사용하려는 경우에 사용합니다. 키 프레임 애니메이션 개요에 설명된 것처럼 키 프레임 애니메이션은 키 프레임 개체를 사용하여 해당 출력 값을 생성합니다. 각 키 프레임 개체는 다음 세 가지 기능을 수행합니다.

  • 해당 Value 속성을 사용하여 대상 값을 지정합니다.

  • KeyTime 속성을 사용하여 값이 도달해야 하는 시간을 지정합니다.

  • InterpolateValueCore 메서드를 구현하여 이전 키 프레임의 값과 고유한 값 간을 보간합니다.

구현 지침

*<Type>*KeyFrame 추상 클래스에서 파생하고 InterpolateValueCore 메서드를 구현합니다. InterpolateValueCore 메서드는 키 프레임의 현재 값을 반환합니다. 두 개의 매개 변수, 즉 이전 키 프레임의 값과 0~1 사이의 진행률 값을 사용합니다. 진행률 값이 0이면 키 프레임이 방금 시작했음을 나타내고 진행률 값이 1이면 키 프레임이 막 완료되었으며 해당 Value 속성으로 지정된 값을 반환해야 함을 나타냅니다.

*<Type>*KeyFrame 클래스는 Freezable 클래스에서 상속하므로 CreateInstanceCore 코어를 재정의하여 클래스의 새 인스턴스를 반환해야 합니다. 이 클래스가 데이터를 저장하는 데 종속성 속성을 사용하지 않거나 생성 후 추가 초기화를 요구할 경우 추가 메서드를 재정의해야 할 수 있습니다. 자세한 내용은 Freezable 개체 개요를 참조하세요.

사용자 지정 *<Type>*KeyFrame 애니메이션을 만든 후에 해당 형식에 대한 *<Type>*AnimationUsingKeyFrames와 함께 사용할 수 있습니다.

사용자 지정 애니메이션 클래스 만들기

애니메이션 형식을 직접 만들면 개체에 애니메이션 효과를 적용하는 방식을 보다 강력하게 제어할 수 있습니다. 애니메이션 형식을 직접 만드는 방법으로 2가지가 권장됩니다. 즉, AnimationTimeline 클래스 또는 *<Type>*AnimationBase 클래스에서 파생할 수 있습니다. *<Type>*Animation 또는 *<Type>*AnimationUsingKeyFrames 클래스에서 파생하는 것은 권장되지 않습니다.

<Type>AnimationBase에서 파생

*<Type>*AnimationBase 클래스에서 파생하는 것이 새 애니메이션 형식을 만드는 가장 간단한 방법입니다. 이 방법은 해당하는 *<Type>*AnimationBase 클래스가 이미 있는 형식에 대해 새 애니메이션을 만들려는 경우에 사용합니다.

구현 지침

*<Type>*Animation 클래스에서 파생하고 GetCurrentValueCore 메서드를 구현합니다. GetCurrentValueCore 메서드는 애니메이션의 현재 값을 반환합니다. 이 메서드는 세 개의 매개 변수, 즉 제안된 시작 값, 제안된 끝 값 및 애니메이션의 진행 상태를 확인하는 데 사용할 수 있는 AnimationClock을 사용합니다.

*<Type>*AnimationBase 클래스는 Freezable 클래스에서 상속하므로 CreateInstanceCore 코어를 재정의하여 클래스의 새 인스턴스를 반환해야 합니다. 이 클래스가 데이터를 저장하는 데 종속성 속성을 사용하지 않거나 생성 후 추가 초기화를 요구할 경우 추가 메서드를 재정의해야 할 수 있습니다. 자세한 내용은 Freezable 개체 개요를 참조하세요.

자세한 내용은 애니메이션 효과를 적용할 형식의 *<Type>*AnimationBase 클래스에 대한 GetCurrentValueCore 메서드 설명서를 참조하세요. 예제를 보려면 사용자 지정 애니메이션 샘플을 참조하세요.

대체 방법

애니메이션 값이 보간되는 방식을 변경하려면 *<Type>*KeyFrame 클래스 중 하나에서 파생하는 것을 고려하세요. 만드는 키 프레임은 WPF에서 제공하는 해당 *<Type>*AnimationUsingKeyFrames와 함께 사용할 수 있습니다.

AnimationTimeline에서 파생

일치하는 WPF 애니메이션이 아직 없는 형식에 대해 애니메이션을 만들거나 강력한 형식이 아닌 애니메이션을 만들려면 AnimationTimeline 클래스에서 파생합니다.

구현 지침

AnimationTimeline 클래스에서 파생하고 다음 멤버를 재정의합니다.

  • CreateInstanceCore - 새 클래스가 구체적 클래스인 경우 CreateInstanceCore를 재정의하여 클래스의 새 인스턴스를 반환해야 합니다.

  • GetCurrentValue - 이 메서드를 재정의하여 애니메이션의 현재 값을 반환합니다. 이 메서드는 세 개의 매개 변수, 즉 기본 원본 값, 기본 대상 값 및 AnimationClock을 사용합니다. AnimationClock을 사용하여 애니메이션의 현재 시간 또는 진행률을 가져옵니다. 기본 원본 및 대상 값을 사용할 것인지 여부를 선택할 수 있습니다.

  • IsDestinationDefault – 이 속성을 재정의하여 애니메이션이 GetCurrentValue 메서드로 지정된 기본 대상 값을 사용하는지 여부를 나타냅니다.

  • TargetPropertyType – 이 속성을 재정의하여 애니메이션이 생성하는 출력의 Type을 나타냅니다.

이 클래스가 데이터를 저장하는 데 종속성 속성을 사용하지 않거나 생성 후 추가 초기화를 요구할 경우 추가 메서드를 재정의해야 할 수 있습니다. 자세한 내용은 Freezable 개체 개요를 참조하세요.

권장되는 패러다임(WPF 애니메이션에서 사용)은 다음 두 상속 수준을 사용하는 것입니다.

  1. AnimationTimeline에서 파생되는 추상 *<Type>*AnimationBase 클래스를 만듭니다. 이 클래스는 TargetPropertyType 메서드를 재정의해야 합니다. 또한 새로운 추상 메서드인 GetCurrentValueCore를 도입하고 GetCurrentValue를 기본 원본 값 및 기본 대상 값 매개 변수 형식의 유효성을 검사한 후 GetCurrentValueCore를 호출하도록 재정의해야 합니다.

  2. 새 *<Type>*AnimationBase 클래스에서 상속하고 IsDestinationDefault 메서드, 도입한 GetCurrentValueCore 메서드 및 CreateInstanceCore 속성을 재정의하는 또 다른 클래스를 만듭니다.

대체 방법

해당 From/To/By 애니메이션 또는 키 프레임 애니메이션이 없는 형식에 애니메이션 효과를 주려면 ObjectAnimationUsingKeyFrames를 사용하는 것이 좋습니다. ObjectAnimationUsingKeyFrames는 약한 형식을 가지므로 어떤 형식의 값에도 애니메이션 효과를 줄 수 있습니다. 이 접근 방법의 단점은 ObjectAnimationUsingKeyFrames가 불연속 보간만 지원한다는 것입니다.

프레임당 콜백 사용

이 접근 방법은 WPF 애니메이션 시스템을 완전히 무시해야 할 때 사용합니다. 이 방법에 대한 한 가지 시나리오는 각 애니메이션이 새 방향으로 단계별로 이동하거나 애니메이션 개체의 위치가 개체 상호 작용의 마지막 집합에 따라 다시 계산되어야 하는 물리학 애니메이션입니다.

구현 지침

이 개요에 설명된 다른 방법과 달리, 프레임당 콜백을 사용하기 위해 사용자 지정 애니메이션 또는 키 프레임 클래스를 만들 필요가 없습니다.

대신 애니메이션 효과를 적용할 개체가 포함된 개체의 Rendering 이벤트에 등록합니다. 이 이벤트 처리기 메서드는 프레임마다 한 번씩 호출됩니다. WPF가 시각적 트리의 지속되는 렌더링 데이터를 컴퍼지션 트리로 마샬링할 때마다 이벤트 처리기 메서드가 호출됩니다.

이벤트 처리기에서 애니메이션 효과에 필요한 계산을 수행하고 이러한 값을 사용하여 애니메이션 효과를 적용하려는 개체의 속성을 설정합니다.

현재 프레임의 프레젠테이션 시간을 가져오려면 이 이벤트와 연결된 EventArgs를 현재 프레임의 렌더링 시간을 가져오는 데 사용할 수 있는 RenderingTime 속성을 제공하는 RenderingEventArgs로 캐스팅할 수 있습니다.

자세한 내용은 Rendering 페이지를 참조하세요.

참고 항목