기본 애니메이션
.NET 다중 플랫폼 앱 UI(.NET MAUI) 애니메이션 클래스는 시각적 요소의 다양한 속성을 대상으로 하며, 일반적인 기본 애니메이션은 일정 기간 동안 속성을 한 값에서 다른 값으로 점진적으로 변경합니다.
기본 애니메이션은 개체에서 작동하는 VisualElement
네임스페이스에서 클래스에서 Microsoft.Maui.Controls
제공하는 ViewExtensions
확장 메서드를 사용하여 만들 수 있습니다.
CancelAnimations
는 애니메이션을 취소합니다.FadeTo
의 속성에Opacity
애니메이션 효과를 시킵VisualElement
니다.RelScaleTo
는 애니메이션된 증분 증가 또는 감소를 해당VisualElement
속성에Scale
적용합니다.RotateTo
의 속성에Rotation
애니메이션 효과를 시킵VisualElement
니다.RelRotateTo
는 애니메이션된 증분 증가 또는 감소를 해당VisualElement
속성에Rotation
적용합니다.RotateXTo
의 속성에RotationX
애니메이션 효과를 시킵VisualElement
니다.RotateYTo
의 속성에RotationY
애니메이션 효과를 시킵VisualElement
니다.ScaleTo
의 속성에Scale
애니메이션 효과를 시킵VisualElement
니다.ScaleXTo
의 속성에ScaleX
애니메이션 효과를 시킵VisualElement
니다.ScaleYTo
의 속성에ScaleY
애니메이션 효과를 시킵VisualElement
니다.TranslateTo
의 속성과TranslationY
애니메이션 효과를 시킵VisualElement
니다TranslationX
.
기본적으로 각 애니메이션에는 250밀리초가 걸립니다. 그러나 애니메이션을 만들 때 각 애니메이션에 대한 기간을 지정할 수 있습니다.
참고
클래스는 ViewExtensions
확장 메서드도 제공합니다 LayoutTo
. 그러나 이 메서드는 레이아웃에서 크기와 위치 변경 내용을 포함하는 레이아웃 상태 간의 전환에 애니메이션 효과를 주는 데 사용됩니다.
클래스의 ViewExtensions
애니메이션 확장 메서드는 모두 비동기이며 개체를 Task<bool>
반환합니다. 반환 값은 false
애니메이션이 완료되고 true
애니메이션이 취소된 경우입니다. 따라서 애니메이션 연산을 연산자와 await
결합하면 이전 메서드가 완료된 후 실행되는 후속 애니메이션 메서드를 사용하여 순차적 애니메이션을 만들 수 있습니다. 자세한 내용은 복합 애니메이션을 참조하세요.
백그라운드에서 애니메이션을 완료하도록 해야 하는 요구 사항이 있는 경우 연산자를 await
생략할 수 있습니다. 이 시나리오에서는 애니메이션 확장 메서드가 애니메이션을 시작한 후 신속하게 반환되며 애니메이션이 백그라운드에서 발생합니다. 이 작업은 복합 애니메이션을 만들 때 활용할 수 있습니다. 자세한 내용은 복합 애니메이션을 참조하세요.
단일 애니메이션
클래스의 ViewExtensions
각 확장 메서드는 일정 기간 동안 속성을 한 값에서 다른 값으로 점진적으로 변경하는 단일 애니메이션 작업을 구현합니다.
회전
회전은 요소의 RotateTo
속성을 점진적으로 변경하는 메서드를 Rotation
사용하여 수행됩니다.
await image.RotateTo(360, 2000);
image.Rotation = 0;
이 예제 Image
에서는 인스턴스가 2초(2000밀리초)에 걸쳐 최대 360도 회전됩니다. 이 메서드는 RotateTo
애니메이션의 시작 부분에 대한 요소의 현재 Rotation
속성 값을 가져온 다음 해당 값에서 첫 번째 인수(360)로 회전합니다. 애니메이션이 완료되면 이미지의 Rotation
속성이 0으로 다시 설정됩니다. 이렇게 하면 애니메이션이 Rotation
종료된 후 속성이 360으로 유지되지 않으므로 추가 회전을 방지할 수 있습니다.
참고
메서드 외에도 RotateTo
각각 및 RotateYTo
속성에 애니메이션 효과를 RotationX
주는 메서드도 RotationY
RotateXTo
있습니다.
상대 회전
상대 회전은 요소의 RelRotateTo
속성을 점진적으로 변경하는 메서드를 Rotation
사용하여 수행됩니다.
await image.RelRotateTo(360, 2000);
이 예제 Image
에서는 인스턴스가 시작 위치에서 2초(2000밀리초)를 초과하여 360도 회전됩니다. 이 메서드는 RelRotateTo
애니메이션의 시작 부분에 대한 요소의 현재 Rotation
속성 값을 가져온 다음 해당 값에서 첫 번째 인수(360)를 더한 값으로 회전합니다. 이렇게 하면 각 애니메이션이 항상 시작 위치에서 360도 회전됩니다. 따라서 애니메이션이 이미 진행 중인 동안 새 애니메이션이 호출되면 현재 위치에서 시작하여 360도 증가하지 않는 위치에서 끝날 수 있습니다.
크기 조정
크기 조정은 요소의 ScaleTo
속성을 점진적으로 변경하는 메서드를 Scale
사용하여 수행됩니다.
await image.ScaleTo(2, 2000);
이 예제 Image
에서 인스턴스는 2초(2000밀리초)를 초과하여 크기가 두 배까지 확장됩니다. 이 메서드는 ScaleTo
애니메이션의 시작 부분에 대한 요소의 현재 Scale
속성 값을 가져온 다음 해당 값에서 첫 번째 인수로 크기가 조정됩니다. 이미지 크기를 두 배 크기로 확장하는 효과가 있습니다.
참고
메서드 외에도 ScaleTo
각각 및 ScaleYTo
속성에 애니메이션 효과를 ScaleX
주는 메서드도 ScaleY
ScaleXTo
있습니다.
상대 크기 조정
상대 크기 조정은 요소의 RelScaleTo
속성을 점진적으로 변경하는 메서드를 Scale
사용하여 수행됩니다.
await image.RelScaleTo(2, 2000);
이 예제 Image
에서 인스턴스는 2초(2000밀리초)를 초과하여 크기가 두 배까지 확장됩니다. 이 메서드는 RelScaleTo
애니메이션의 시작 부분에 대한 요소의 현재 Scale
속성 값을 가져온 다음 해당 값에서 첫 번째 인수를 더한 값으로 크기를 조정합니다. 이렇게 하면 각 애니메이션이 항상 시작 위치에서 2의 크기 조정이 됩니다.
앵커를 사용하여 크기 조정 및 회전
시각적 요소의 속성 및 AnchorY
속성은 AnchorX
및 속성에 대한 크기 조정 또는 회전의 중심을 Scale
Rotation
설정합니다. 따라서 해당 값은 및 ScaleTo
메서드에도 RotateTo
영향을 줍니다.
Image
레이아웃의 중앙에 배치된 경우 다음 코드 예제에서는 해당 AnchorY
속성을 설정하여 레이아웃의 중심을 중심으로 이미지를 회전하는 방법을 보여 줍니다.
double radius = Math.Min(absoluteLayout.Width, absoluteLayout.Height) / 2;
image.AnchorY = radius / image.Height;
await image.RotateTo(360, 2000);
레이아웃 AnchorX
의 중심을 중심으로 인스턴스를 회전 Image
하려면 해당 값과 속성을 너비와 AnchorY
높이Image
를 기준으로 하는 값으로 설정해야 합니다. 이 예제에서 중심은 레이아웃의 Image
가운데에 정의되므로 기본값 AnchorX
0.5는 변경할 필요가 없습니다. 그러나 AnchorY
속성은 레이아웃의 위쪽에서 가운데 지점까지 값 Image
으로 다시 정의됩니다. 이렇게 하면 Image
레이아웃의 중심점 주위에 360도의 전체 회전이 수행됩니다.
Translation
변환은 요소의 TranslateTo
속성 및 TranslationY
속성을 점진적으로 변경하는 TranslationX
메서드를 사용하여 수행됩니다.
await image.TranslateTo(-100, -100, 1000);
이 예제에서는 인스턴스가 Image
1초(1000밀리초)를 초과하여 가로 및 세로로 변환됩니다. 이 메서드는 TranslateTo
동시에 이미지 100개의 디바이스 독립적 단위를 왼쪽으로 변환하고 100개의 디바이스 독립적 단위를 위쪽으로 변환합니다. 첫 번째 인수와 두 번째 인수가 모두 음수이기 때문입니다. 양수를 제공하면 이미지가 오른쪽 및 아래로 변환됩니다.
중요
요소가 처음에 화면에서 배치된 다음 화면으로 변환된 경우 변환 후 요소의 입력 레이아웃이 화면 외부에 유지되고 사용자가 상호 작용할 수 없습니다. 따라서 뷰를 최종 위치에 배치한 다음 필요한 번역을 수행하는 것이 좋습니다.
페이딩
페이딩은 요소의 FadeTo
속성을 점진적으로 변경하는 메서드를 Opacity
사용하여 수행됩니다.
image.Opacity = 0;
await image.FadeTo(1, 4000);
이 예제에서는 인스턴스가 Image
4초(4000밀리초) 이상 페이드됩니다. 이 메서드는 FadeTo
애니메이션의 시작 부분에 대한 요소의 현재 Opacity
속성 값을 가져온 다음 해당 값에서 첫 번째 인수로 페이드 인합니다.
복합 애니메이션
복합 애니메이션은 애니메이션의 순차적 조합이며 연산자를 await
사용하여 만들 수 있습니다.
await image.TranslateTo(-100, 0, 1000); // Move image left
await image.TranslateTo(-100, -100, 1000); // Move image diagonally up and left
await image.TranslateTo(100, 100, 2000); // Move image diagonally down and right
await image.TranslateTo(0, 100, 1000); // Move image left
await image.TranslateTo(0, 0, 1000); // Move image up
이 예제에서는 인스턴스가 Image
6초(6000밀리초)를 초과하여 변환됩니다. 변환 Image
은 5개의 애니메이션을 사용하며 await
, 연산자는 각 애니메이션이 순차적으로 실행된다는 것을 나타냅니다. 따라서 이전 메서드가 완료된 후 후속 애니메이션 메서드가 실행됩니다.
복합 애니메이션
복합 애니메이션은 둘 이상의 애니메이션이 동시에 실행되는 애니메이션의 조합입니다. 대기 중인 애니메이션과 대기되지 않은 애니메이션을 결합하여 복합 애니메이션을 만들 수 있습니다.
image.RotateTo(360, 4000);
await image.ScaleTo(2, 2000);
await image.ScaleTo(1, 2000);
이 예제에서는 인스턴스의 Image
크기를 조정하고 4초(4000밀리초)에 걸쳐 동시에 회전합니다. 크기 조정 Image
은 회전과 동시에 발생하는 두 개의 순차적 애니메이션을 사용합니다. 메서드는 RotateTo
연산자 await
없이 실행되고 첫 번째 ScaleTo
애니메이션이 시작된 후 즉시 반환됩니다. await
첫 번째 메서드의 연산자는 첫 ScaleTo
번째 메서드가 완료될 때까지 두 번째 ScaleTo
메서드를 ScaleTo
지연합니다. 이 시점에서 RotateTo
애니메이션이 절반으로 완료되고 Image
180도 회전됩니다. 마지막 2초(2000밀리초) 동안 두 번째 ScaleTo
애니메이션과 애니메이션이 RotateTo
모두 완료됩니다.
여러 애니메이션을 동시에 실행
및 Task.WhenAll
메서드를 Task.WhenAny
사용하여 여러 비동기 메서드를 동시에 실행할 수 있으므로 복합 애니메이션을 만들 수 있습니다. 두 메서드 모두 개체를 Task
반환하고 각각 개체를 반환 Task
하는 메서드 컬렉션을 수락합니다. 다음 Task.WhenAny
코드 예제와 같이 컬렉션의 메서드가 실행을 완료하면 메서드가 완료됩니다.
await Task.WhenAny<bool>
(
image.RotateTo(360, 4000),
image.ScaleTo(2, 2000)
);
await image.ScaleTo(1, 2000);
이 예제에서 메서드는 Task.WhenAny
두 개의 작업을 포함합니다. 첫 번째 작업은 인스턴스를 Image
4초(4,000밀리초)에 걸쳐 회전하고, 두 번째 작업은 2초(2000밀리초)를 초과하여 이미지의 크기를 조정합니다. 두 번째 작업이 완료되면 메서드 호출이 Task.WhenAny
완료됩니다. 그러나 메서드가 RotateTo
계속 실행되고 있더라도 두 번째 ScaleTo
메서드를 시작할 수 있습니다.
다음 Task.WhenAll
코드 예제와 같이 컬렉션의 모든 메서드가 완료되면 메서드가 완료됩니다.
// 10 minute animation
uint duration = 10 * 60 * 1000;
await Task.WhenAll
(
image.RotateTo(307 * 360, duration),
image.RotateXTo(251 * 360, duration),
image.RotateYTo(199 * 360, duration)
);
이 예제에서 메서드는 Task.WhenAll
각각 10분 이상 실행되는 세 가지 태스크를 포함합니다. 각각 Task
은 360도 회전의 다른 수를 만듭니다 - 307 RotateTo
회전, 251 회전 RotateXTo
및 199 회전.RotateYTo
이러한 값은 소수이므로 회전이 동기화되지 않으므로 반복 패턴이 발생하지 않습니다.
애니메이션 취소
앱은 확장 메서드를 호출하여 하나 이상의 애니메이션을 CancelAnimations
취소할 수 있습니다.
image.CancelAnimations();
이 예제에서는 인스턴스에서 실행되는 모든 애니메이션이 Image
즉시 취소됩니다.