보기 애니메이션

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

트윈 애니메이션에서는 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에는 다양한 속도 곡선을 지정하는 여러 개의 Interpolator 하위 클래스가 있습니다. 예를 들어 AccelerateInterpolator에서는 변환이 느린 속도로 시작하다가 속도를 높이도록 지시합니다. 각 하위 클래스에는 XML에 적용할 수있는 속성 값이 있습니다.

이 XML을 프로젝트의 res/anim/ 디렉터리에 hyperspace_jump.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()으로 View에 애니메이션을 할당할 수 있습니다.

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

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