뷰 애니메이션

보기 애니메이션 시스템을 사용하여 보기에서 트윈 애니메이션을 실행할 수 있습니다. 트윈 애니메이션에서는 시작점, 끝점, 크기, 회전 및 애니메이션의 기타 일반적인 측면과 같은 정보를 사용하여 애니메이션을 계산합니다.

트윈 애니메이션에서는 View 객체의 콘텐츠에 일련의 간단한 변환 (위치, 크기, 회전, 투명도)을 실행할 수 있습니다. 따라서 TextView 객체가 있으면 텍스트를 이동, 회전, 증가 또는 축소시킬 수 있습니다. 배경 이미지가 있으면 텍스트와 함께 배경 이미지가 변환됩니다. animation package에서는 트윈 애니메이션에서 사용되는 모든 클래스를 제공합니다.

일련의 애니메이션 명령은 XML 또는 Android 코드로 정의되는 트윈 애니메이션을 정의합니다. 레이아웃 정의와 마찬가지로 애니메이션을 하드 코딩하는 것보다 읽기 쉽고 재사용 가능하며 교체 가능하기 때문에 XML 파일을 사용하는 것이 좋습니다. 아래 예에서는 XML을 사용합니다. XML 대신 애플리케이션 코드에서 애니메이션을 정의하는 방법을 자세히 알아보려면 AnimationSet 클래스 및 기타 Animation 서브클래스를 참고하세요.

애니메이션 안내는 실행하려는 변환, 변환이 발생하는 시점 및 적용하는 데 걸리는 시간을 정의합니다. 변환은 순차적이거나 동시에 이루어질 수 있습니다. 예를 들어, TextView의 콘텐츠를 왼쪽에서 오른쪽으로 이동한 후 180도 회전하도록 할 수 있습니다. 또는 텍스트를 동시에 이동하고 회전할 수도 있습니다. 각 변환은 해당 변환에 해당하는 매개변수 집합 (크기 변경을 위한 시작 크기와 종료 크기, 회전을 위한 시작 각도 및 종료 각도 등)과 일반적인 매개변수 집합 (예: 시작 시간 및 지속 시간)도 사용합니다. 여러 변환을 동시에 실행하려면 시작 시간을 동일하게 지정하고, 순차적으로 만들려면 시작 시간과 이전 변환의 지속 시간을 더한 값을 계산합니다.

애니메이션 XML 파일은 Android 프로젝트의 res/anim/ 디렉터리에 있습니다. 파일에는 단일 루트 요소가 있어야 합니다. 이는 단일 <alpha>, <scale>, <translate>, <rotate>, 보간기 요소 또는 이러한 요소 (다른 <set>가 포함될 수 있음) 그룹을 보유하는 <set> 요소 중 하나입니다. 기본적으로 모든 애니메이션 명령은 동시에 적용됩니다. 순차적으로 실행하려면 아래 예와 같이 startOffset 속성을 지정해야 합니다.

ApiDemos 중 하나의 다음 XML은 View 객체를 확장한 다음 동시에 회전하고 회전하는 데 사용됩니다.

<set android:shareInterpolator="false">
    <scale
        android:interpolator="@android:anim/accelerate_decelerate_interpolator"
        android:fromXScale="1.0"
        android:toXScale="1.4"
        android:fromYScale="1.0"
        android:toYScale="0.6"
        android:pivotX="50%"
        android:pivotY="50%"
        android:fillAfter="false"
        android:duration="700" />
    <set android:interpolator="@android:anim/decelerate_interpolator">
        <scale
           android:fromXScale="1.4"
           android:toXScale="0.0"
           android:fromYScale="0.6"
           android:toYScale="0.0"
           android:pivotX="50%"
           android:pivotY="50%"
           android:startOffset="700"
           android:duration="400"
           android:fillBefore="false" />
        <rotate
           android:fromDegrees="0"
           android:toDegrees="-45"
           android:toYScale="0.0"
           android:pivotX="50%"
           android:pivotY="50%"
           android:startOffset="700"
           android:duration="400" />
    </set>
</set>

화면 좌표 (이 예에서는 사용되지 않음)는 왼쪽 상단 모서리에 (0,0)이며 오른쪽 아래로 갈수록 증가합니다.

PivotX와 같은 일부 값은 객체 자체를 기준으로 또는 상위 요소를 기준으로 지정될 수 있습니다. 원하는 항목에 적절한 형식을 사용해야 합니다 ('50'은 상위 요소를 기준으로 50%, '50%'는 상위 요소를 기준으로 하면 50% 입니다).

Interpolator를 할당하여 시간에 따른 변환 적용 방법을 판별할 수 있습니다. Android에는 다양한 속도 곡선을 지정하는 보간기 서브클래스가 여러 개 포함되어 있습니다. 예를 들어 AccelerateInterpolator는 변환에 느린 속도로 시작하고 속도를 높이도록 지시합니다. 각 클래스에는 XML에 적용할 수 있는 속성 값이 있습니다.

이 XML을 프로젝트의 res/anim/ 디렉터리에 hyperspace_jump.xml로 저장하면 다음 코드는 이 XML을 참조하고 레이아웃의 ImageView 객체에 적용합니다.

Kotlin

AnimationUtils.loadAnimation(this, R.anim.hyperspace_jump).also { hyperspaceJumpAnimation ->
    findViewById<ImageView>(R.id.spaceshipImage).startAnimation(hyperspaceJumpAnimation)
}

Java

ImageView spaceshipImage = (ImageView) findViewById(R.id.spaceshipImage);
Animation hyperspaceJumpAnimation = AnimationUtils.loadAnimation(this, R.anim.hyperspace_jump);
spaceshipImage.startAnimation(hyperspaceJumpAnimation);

startAnimation()의 대안으로, Animation.setStartTime()를 사용하여 애니메이션 시작 시간을 정의한 다음 View.setAnimation()를 사용하여 애니메이션을 뷰에 할당할 수 있습니다.

XML 구문, 사용 가능한 태그 및 속성에 관한 자세한 내용은 애니메이션 리소스를 참조하세요.

참고: 애니메이션이 이동하거나 크기가 조절되는 방식에 관계없이 애니메이션이 있는 뷰의 경계는 이에 맞게 자동으로 조정되지 않습니다. 그래도 애니메이션은 여전히 보기의 경계를 벗어나 그려지며 잘리지 않습니다/ 그러나 애니메이션이 상위 View의 경계를 초과하면 자르기가 발생합니다.