사용자 지정 애니메이션 개요
업데이트: 2007년 11월
이 항목에서는 사용자 지정 키 프레임, 애니메이션 클래스를 만들거나 이를 건너뛰기 위한 프레임당 콜백을 사용하여 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와 함께 사용할 수 있습니다.
사용자 지정 애니메이션 클래스 만들기
자체적인 애니메이션 형식을 만들면 개체에 애니메이션 효과를 주는 방법을 보다 세부적으로 제어할 수 있습니다. 자체 애니메이션 형식을 만들기 위한 두 가지 권장 방법이 있습니다. 하나는 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 애니메이션에서 사용)은 두 상속 수준을 사용하는 것입니다.
AnimationTimeline에서 파생되는 추상 *<Type>*AnimationBase 클래스를 만듭니다. 이 클래스는 TargetPropertyType 메서드를 재정의해야 합니다. 또한 새 추상 메서드 GetCurrentValueCore를 도입하고 GetCurrentValue를 재정의하여 기본 원점 값 및 기본 대상 값 매개 변수 형식의 유효성을 검사한 다음 GetCurrentValueCore를 호출하도록 합니다.
새 *<Type>*AnimationBase 클래스에서 상속하는 또 다른 클래스를 만들고 CreateInstanceCore 메서드, 도입한 GetCurrentValueCore 메서드 및 IsDestinationDefault 속성을 재정의합니다.
다른 방법
해당하는 From/To/By 애니메이션 또는 키 프레임 애니메이션이 없는 형식에 애니메이션 효과를 지정하려면 ObjectAnimationUsingKeyFrames를 사용하는 것을 고려해 보십시오. 약한 형식이기 때문에 ObjectAnimationUsingKeyFrames가 모든 값 형식에 애니메이션 효과를 지정할 수 있습니다. 이 방법의 단점은 ObjectAnimationUsingKeyFrames가 불연속 보간만 지원한다는 것입니다.
프레임당 콜백 사용
WPF 애니메이션 시스템을 완전히 건너뛰어야 할 때 이 방법을 사용하십시오. 이 방법의 한 가지 시나리오는 물리학 애니메이션입니다. 여기에서는 각 애니메이션 단계에 있는 애니메이션 효과가 지정된 개체의 새 방향 또는 위치를 마지막 개체 상호 작용 집합을 기준으로 다시 계산해야 합니다.
구현 명령
이 개요에 설명된 다른 방법과 달리 프레임당 콜백을 사용하기 위해서는 사용자 지정 애니메이션이나 키 프레임 클래스를 만들 필요가 없습니다.
대신 애니메이션 효과를 지정할 개체가 들어 있는 개체의 Rendering 이벤트를 등록하십시오. 이 이벤트 처리기 메서드는 프레임당 한 번씩 호출됩니다. WPF가 시각적 트리에 있는 일관된 렌더링 데이터를 컴포지션 트리를 통해 마샬링하는 경우 이벤트 처리기 메서드가 호출됩니다.
이벤트 처리기에서 애니메이션 효과에 필요한 모든 계산을 수행하고 애니메이션 효과를 지정할 개체의 속성을 해당 값으로 설정하십시오.
현재 프레임의 표시 시간을 얻기 위해 이 이벤트와 연결된 EventArgs가 RenderingEventArgs로 캐스팅되어 현재 프레임의 렌더링 시간을 얻는 데 사용할 수 있는 RenderingTime 속성을 제공합니다.
자세한 내용은 Rendering 페이지를 참조하십시오. 예제를 보려면 프레임별 애니메이션 샘플을 참조하십시오.