전환을 사용하여 레이아웃 변경 애니메이션 처리

Android의 전환 프레임워크를 사용하면 단순히 시작 레이아웃과 종료 레이아웃을 제공하여 UI에서 모든 종류의 모션을 애니메이션으로 보여줄 수 있습니다. 개발자가 원하는 애니메이션 유형(예: 보기 페이드 인/아웃 또는 보기 크기 변경)을 선택할 수 있으며, 전환 프레임워크에서 시작 레이아웃부터 종료 레이아웃까지 애니메이션으로 보여주는 방법을 알아냅니다.

전환 프레임워크에는 다음 기능이 포함되어 있습니다.

  • 그룹 레벨 애니메이션: 보기 계층의 모든 보기에 하나 이상의 애니메이션 효과를 적용합니다.
  • 내장형 애니메이션: 페이드 아웃 또는 이동과 같은 일반 효과용으로 미리 정의된 애니메이션을 사용합니다.
  • 리소스 파일 지원: 레이아웃 리소스 파일에서 보기 계층 구조와 내장형 애니메이션을 로드합니다.
  • 수명 주기 콜백: 애니메이션과 계층 구조 변경 프로세스 제어 기능을 제공하는 콜백을 받습니다.

레이아웃 변경을 애니메이션으로 보여주는 샘플 코드는 BasicTransition을 참조하세요.

레이아웃이 다른 레이아웃으로 전환될 때 이를 애니메이션으로 보여주는 기본 프로세스는 다음과 같습니다.

  1. 시작 레이아웃과 종료 레이아웃 둘 다의 Scene 객체를 만듭니다. 그러나 시작 레이아웃의 장면은 종종 현재 레이아웃을 기반으로 자동으로 결정됩니다.
  2. 원하는 애니메이션 유형을 정의하는 Transition 객체를 만듭니다.
  3. TransitionManager.go()를 호출합니다. 그러면 시스템에서 애니메이션을 실행하여 레이아웃을 전환합니다.

그림 1의 다이어그램에서는 레이아웃, 장면, 전환 및 최종 애니메이션 사이의 관계를 보여줍니다.

그림 1. 전환 프레임워크에서 애니메이션을 만드는 방법을 보여주는 기본 삽화

장면 만들기

장면에서는 모든 보기와 속성 값을 비롯하여 보기 계층 구조의 상태를 저장합니다. 전환 프레임워크를 통해 시작 장면과 종료 장면 사이에 애니메이션을 실행할 수 있습니다.

레이아웃 리소스 파일 또는 코드의 보기 그룹에서 장면을 만들 수 있습니다. 그러나 전환할 시작 장면은 종종 현재 UI를 기반으로 자동으로 결정됩니다.

장면에서는 장면을 변경할 때 실행하는 고유 작업도 정의할 수 있습니다. 예를 들어 이 기능은 장면으로 전환한 후 보기 설정을 정리하는 데 유용합니다.

메모: 프레임워크에서는 장면을 사용하지 않고 전환 적용에 설명된 대로 장면을 사용하지 않고 단일 보기 계층 구조에 변경사항을 애니메이션으로 보여줄 수 있습니다. 그러나 전환과 관련된 작업을 하려면 장면을 이해해야 합니다.

레이아웃 리소스에서 장면 만들기

레이아웃 리소스 파일에서 직접 Scene 인스턴스를 만들 수 있습니다. 파일의 보기 계층 구조가 주로 정적이면 이 기법을 사용합니다. 결과적으로 생성되는 장면은 Scene 인스턴스를 만들 때의 보기 계층 구조 상태를 나타냅니다. 보기 계층 구조를 변경하면 장면을 다시 만들어야 합니다. 프레임워크가 파일에 있는 전체 보기 계층 구조에서 장면을 생성하므로, 레이아웃 파일의 일부에서 장면을 만들 수는 없습니다.

레이아웃 리소스 파일에서 Scene 인스턴스를 만들려면 레이아웃에서 장면 루트를 ViewGroup 인스턴스로 검색한 다음 장면의 보기 계층 구조를 포함하는 레이아웃 파일의 리소스 ID와 장면 루트를 사용하여 Scene.getSceneForLayout() 함수를 호출합니다.

장면의 레이아웃 정의

이 섹션의 나머지 부분에 있는 코드 스니펫에서는 장면 루트 요소가 같은 두 개의 서로 다른 장면을 만드는 방법을 보여줍니다. 또한 서로 관련되지 않은 여러 다른 Scene 객체를 서로 관련된 것처럼 암시하지 않고 로드할 수 있다는 점도 보여줍니다.

이 예는 다음과 같은 레이아웃 정의로 구성됩니다.

  • 텍스트 라벨과 하위 레이아웃이 있는 활동의 기본 레이아웃
  • 두 개의 텍스트 필드가 있는 첫 번째 장면의 상대 레이아웃
  • 두 개의 동일한 텍스트 필드가 서로 다른 순서로 지정된 두 번째 장면의 상대 레이아웃

이 예는 활동 기본 레이아웃의 하위 레이아웃에서 모든 애니메이션이 표시되도록 설계되어 있습니다. 기본 레이아웃의 텍스트 라벨은 정적으로 남아 있습니다.

활동의 기본 레이아웃은 다음과 같이 정의됩니다.

res/layout/activity_main.xml

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/master_layout">
        <TextView
            android:id="@+id/title"
            ...
            android:text="Title"/>
        <FrameLayout
            android:id="@+id/scene_root">
            <include layout="@layout/a_scene" />
        </FrameLayout>
    </LinearLayout>
    

이 레이아웃 정의에는 장면 루트의 하위 레이아웃과 텍스트 필드가 포함되어 있습니다. 첫 번째 장면의 레이아웃은 기본 레이아웃 파일에 포함되어 있습니다. 프레임워크는 전체 레이아웃 파일만 장면에 로드할 수 있기 때문에, 앱을 초기 사용자 인터페이스의 일부로 표시하고 장면에 로드할 수도 있습니다.

첫 번째 장면의 레이아웃은 다음과 같이 정의됩니다.

res/layout/a_scene.xml

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/scene_container"
        android:layout_width="match_parent"
        android:layout_height="match_parent" >
        <TextView
            android:id="@+id/text_view1
            android:text="Text Line 1" />
        <TextView
            android:id="@+id/text_view2
            android:text="Text Line 2" />
    </RelativeLayout>
    

두 번째 장면의 레이아웃은 서로 다른 순서로 지정된 두 개의 텍스트 필드(ID가 같음)를 포함하며 다음과 같이 정의됩니다.

res/layout/another_scene.xml

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/scene_container"
        android:layout_width="match_parent"
        android:layout_height="match_parent" >
        <TextView
            android:id="@+id/text_view2
            android:text="Text Line 2" />
        <TextView
            android:id="@+id/text_view1
            android:text="Text Line 1" />
    </RelativeLayout>
    

레이아웃에서 장면 생성

두 상대 레이아웃의 정의를 만든 다음 각 정의의 장면을 얻을 수 있습니다. 그러므로 나중에 두 개의 UI 구성을 서로 전환할 수 있습니다. 장면을 얻으려면 레이아웃 리소스 ID와 장면 루트의 참조가 필요합니다.

다음 코드 스니펫에서는 장면 루트의 참조를 가져오고 레이아웃 파일에서 두 개의 Scene 객체를 만드는 방법을 보여줍니다.

Kotlin

    val sceneRoot: ViewGroup = findViewById(R.id.scene_root)
    val aScene: Scene = Scene.getSceneForLayout(sceneRoot, R.layout.a_scene, this)
    val anotherScene: Scene = Scene.getSceneForLayout(sceneRoot, R.layout.another_scene, this)

    

자바

    Scene aScene;
    Scene anotherScene;

    // Create the scene root for the scenes in this app
    sceneRoot = (ViewGroup) findViewById(R.id.scene_root);

    // Create the scenes
    aScene = Scene.getSceneForLayout(sceneRoot, R.layout.a_scene, this);
    anotherScene =
        Scene.getSceneForLayout(sceneRoot, R.layout.another_scene, this);

    

이제 앱에는 보기 계층 구조를 기반으로 하는 두 개의 Scene 객체가 있습니다. 두 장면 모두 res/layout/activity_main.xml에서 FrameLayout 요소로 정의된 장면 루트를 사용합니다.

코드에 장면 만들기

개발자 코드의 ViewGroup 객체에서 Scene 인스턴스도 만들 수 있습니다. 개발자의 코드에서 직접 보기 계층 구조를 수정하거나 동적으로 생성할 때 이 기법을 사용합니다.

개발자 코드의 보기 계층 구조에서 장면을 만들려면 Scene(sceneRoot, viewHierarchy) 생성자를 사용합니다. 이 생성자를 호출하는 것은 레이아웃 파일이 이미 확장되어 있을 때 Scene.getSceneForLayout() 함수를 호출하는 것과 동일합니다.

다음 코드 스니펫에서는 개발자 코드에 있는 장면의 보기 계층 구조와 장면 루트 요소의 Scene 인스턴스를 만드는 방법을 보여줍니다.

Kotlin

    val sceneRoot = someLayoutElement as ViewGroup
    val viewHierarchy = someOtherLayoutElement as ViewGroup
    val scene: Scene = Scene(sceneRoot, mViewHierarchy)

    

자바

    Scene mScene;

    // Obtain the scene root element
    sceneRoot = (ViewGroup) someLayoutElement;

    // Obtain the view hierarchy to add as a child of
    // the scene root when this scene is entered
    viewHierarchy = (ViewGroup) someOtherLayoutElement;

    // Create a scene
    mScene = new Scene(sceneRoot, mViewHierarchy);

    

장면 작업 만들기

프레임워크를 사용하면 장면을 시작하거나 종료할 때 시스템에서 실행하는 맞춤 장면 작업을 정의할 수 있습니다. 프레임워크에서 자동으로 장면 사이의 변경사항을 애니메이션으로 보여주므로, 대부분의 경우 맞춤 장면 작업을 정의할 필요가 없습니다.

장면 작업은 다음과 같은 케이스를 처리하는 데 유용합니다.

  • 같은 계층 구조에 없는 보기를 애니메이션으로 보여줍니다. 장면 시작 및 종료 작업을 사용하여 장면을 시작하고 종료하는 보기를 애니메이션으로 보여줄 수 있습니다.
  • ListView 객체와 같이 전환 프레임워크에서 자동으로 애니메이션으로 표시할 수 없는 보기를 애니메이션으로 표시합니다. 자세한 내용은 제한사항을 참조하세요.

맞춤 장면 작업을 제공하려면 작업을 Runnable 객체로 정의하고 Scene.setExitAction() 또는 Scene.setEnterAction() 함수에 전달합니다. 프레임워크에서는 전환 애니메이션을 실행하기 전에 시작 장면에서 setExitAction() 함수를 호출하고 전환 애니메이션을 실행한 후 종료 장면에서 setEnterAction() 함수를 호출합니다.

메모: 시작 장면과 종료 장면 사이에 데이터를 전달하는 데 장면 작업을 사용하지 마세요. 자세한 내용은 전환 수명 주기 콜백 정의를 참조하세요.

전환 적용

전환 프레임워크에서는 Transition 객체를 사용하여 장면 사이의 애니메이션 스타일을 나타냅니다. AutoTransitionFade와 같은 여러 내장형 서브클래스를 사용하여 Transition을 인스턴스화하거나 고유 전환을 정의할 수 있습니다. 그런 다음 종료 SceneTransitionTransitionManager.go()에 전달하여 장면 간 애니메이션을 실행할 수 있습니다.

전환 수명 주기는 활동 수명 주기와 비슷하며, 프레임워크에서 애니메이션 시작과 완료 사이를 모니터링하는 전환 상태를 나타냅니다. 중요한 수명 주기 상태에서, 프레임워크는 여러 다른 전환 단계의 사용자 인터페이스를 조정하기 위해 구현할 수 있는 콜백 함수를 호출합니다.

전환 만들기

이전 섹션에서는 다른 보기 계층 구조의 상태를 나타내는 장면을 만드는 방법을 살펴보았습니다. 변경할 범위의 시작 장면과 종료 장면을 정의하고 나면 애니메이션을 정의하는 Transition 개체를 만들어야 합니다. 프레임워크를 사용하면 리소스 파일에서 내장형 전환을 지정하고 개발자 코드에서 확장하거나 개발자 코드에서 직접 내장형 전환의 인스턴스를 만들 수 있습니다.

표 1. 내장형 전환 유형.

클래스 태그 속성 효과
AutoTransition <autoTransition/> - 기본 전환. 보기를 페이드 아웃하고, 이동 및 크기 조정하며, 페이드 인합니다(이 순서대로).
Fade <fade/> android:fadingMode="[fade_in |
fade_out |
fade_in_out]"
fade_in 보기 페이드 인
fade_out 보기 페이드 아웃
fade_in_out(기본값)을 통해 fade_out 다음에 fade_in을 실행합니다.
ChangeBounds <changeBounds/> - 보기를 이동하고 크기를 조정합니다.

리소스 파일에서 전환 인스턴스 만들기

이 기법을 사용하면 활동의 코드를 변경하지 않아도 전환 정의를 수정할 수 있습니다. 이 기법은 여러 전환 지정에 표시된 대로 애플리케이션 코드에서 복합 전환 정의를 구분하는 데도 유용합니다.

리소스 파일에 내장형 전환을 지정하려면 다음 단계를 따르세요.

  1. 프로젝트에 res/transition/ 디렉터리를 추가합니다.
  2. 이 디렉터리에 새로운 XML 리소스 파일을 만듭니다.
  3. 내장형 전환 중 하나의 XML 노드를 추가합니다.

예를 들어 다음 리소스 파일에서는 Fade 전환을 지정합니다.

res/transition/fade_transition.xml

    <fade xmlns:android="http://schemas.android.com/apk/res/android" />
    

다음 코드 스니펫에서는 리소스 파일의 활동에서 Transition 인스턴스를 확장하는 방법을 보여줍니다.

Kotlin

    var fadeTransition: Transition =
        TransitionInflater.from(this)
                          .inflateTransition(R.transition.fade_transition)

    

자바

    Transition fadeTransition =
            TransitionInflater.from(this).
            inflateTransition(R.transition.fade_transition);

    

개발자의 코드에서 전환 인스턴스 만들기

이 기법은 개발자 코드의 사용자 인터페이스를 수정할 때 동적으로 전환 객체를 만드는 데 또는 매개변수가 적거나 없는 간단한 내장형 전환 인스턴스를 만드는 데 유용합니다.

내장형 전환 인스턴스를 만들려면 Transition 클래스의 서브클래스에 있는 공용 생성자 중 하나를 호출합니다. 예를 들어 다음 코드 스니펫에서는 Fade 전환 인스턴스를 만듭니다.

Kotlin

    var fadeTransition: Transition = Fade()

    

자바

    Transition fadeTransition = new Fade();

    

전환 적용

일반적으로 사용자 작업과 같은 이벤트에 응답하여 여러 개의 서로 다른 보기 계층 구조 간에 변경하기 위해 전환을 적용합니다. 예를 들어 다음과 같은 검색 앱을 고려해 보겠습니다. 사용자가 검색어를 입력하고 검색 버튼을 클릭하면, 검색 버튼을 페이드 아웃하고 검색 결과를 페이드 인하는 전환을 적용하는 동안 앱이 결과 레이아웃을 나타내는 장면으로 변경됩니다.

활동의 이벤트에 응답하여 전환을 적용하는 동안 장면을 변경하려면 다음 스니펫에 표시된 대로 애니메이션에 사용할 종료 장면과 전환 인스턴스를 사용하여 TransitionManager.go() 클래스 함수를 호출합니다.

Kotlin

    TransitionManager.go(endingScene, fadeTransition)

    

자바

    TransitionManager.go(endingScene, fadeTransition);

    

전환 인스턴스에서 지정한 애니메이션을 실행하는 동안 프레임워크에서 종료 장면의 보기 계층 구조로 장면 루트에 있는 보기 계층 구조를 변경합니다. 시작 장면은 마지막 전환의 종료 장면입니다. 이전 전환이 없으면 사용자 인터페이스의 현재 상태에서 자동으로 시작 장면이 결정됩니다.

전환 인스턴스를 지정하지 않으면 전환 관리자가 대부분의 상황에 적합한 자동 전환을 적용할 수 있습니다. 자세한 내용은 TransitionManager 클래스의 API 참조를 확인하세요.

특정 타겟 보기 선택

프레임워크에서는 기본적으로 시작 장면과 종료 장면에 있는 모든 보기에 전환을 적용합니다. 경우에 따라 장면에 있는 보기의 하위 세트에만 애니메이션을 적용할 수 있습니다. 예를 들어 프레임워크에서는 ListView 객체의 변경사항을 애니메이션으로 보여주는 기능을 지원하지 않으므로, 전환 중에 변경사항을 애니메이션으로 보여주려고 시도하지 않아야 합니다. 프레임워크를 사용하면 애니메이션으로 보여줄 특정 보기를 선택할 수 있습니다.

전환 중에 애니메이션으로 보여주는 각 보기는 타겟이라고 합니다. 장면과 연결된 보기 계층 구조의 일부인 타겟만 선택할 수 있습니다.

타겟 목록에서 보기를 하나 이상 제거하려면 전환을 시작하기 전에 removeTarget() 메소드를 호출합니다. 개발자가 지정하는 보기만 타겟 목록에 추가하려면 addTarget() 함수를 호출합니다. 자세한 내용은 Transition 클래스의 API 참조를 확인하세요.

여러 전환 지정

애니메이션의 효과를 극대화하려면 장면 사이에 발생하는 변경 유형과 애니메이션을 일치시켜야 합니다. 예를 들어 일부 보기를 제거하고 다른 보기는 장면 사이에 추가하면 페이드 아웃/페이드 인 애니메이션에서 일부 보기를 더 이상 사용할 수 없다고 표시합니다. 화면의 다른 지점으로 보기를 이동하면 사용자가 새로운 보기 위치를 알 수 있도록 이동을 애니메이션으로 보여주는 것이 더 좋습니다.

전환 프레임워크를 사용하면 개별 내장형 전환 또는 맞춤 전환 그룹을 포함하는 전환 세트에 애니메이션 효과를 결합할 수 있으므로 여러 개의 애니메이션을 선택해도 됩니다.

XML로 된 전환 컬렉션에서 전환 세트를 정의하려면 res/transitions/ 디렉터리에 리소스 파일을 만들고 transitionSet 요소에 전환을 나열합니다. 예를 들어 다음 스니펫에서는 AutoTransition 클래스와 동작이 같은 전환 세트를 지정하는 방법을 보여줍니다.

    <transitionSet xmlns:android="http://schemas.android.com/apk/res/android"
        android:transitionOrdering="sequential">
        <fade android:fadingMode="fade_out" />
        <changeBounds />
        <fade android:fadingMode="fade_in" />
    </transitionSet>
    

개발자 코드에서 전환 세트를 TransitionSet 객체로 확장하려면 활동에서 TransitionInflater.from() 함수를 호출합니다. TransitionSet 클래스는 Transition 클래스에서 확장되므로, 다른 Transition 인스턴스와 똑같이 전환 관리자와 함께 사용할 수 있습니다.

장면 없이 전환 적용

사용자 인터페이스를 수정하는 데는 보기 계층 구조를 변경하는 방법 외에도 다른 방법이 있습니다. 현재 계층 구조에서 하위 보기를 추가, 수정 및 제거하여 변경할 수도 있습니다. 예를 들어 단일 레이아웃만 사용하여 검색 상호 작용을 구현할 수 있습니다. 검색 항목 필드와 검색 아이콘을 표시하는 레이아웃으로 시작합니다. 결과를 표시하도록 사용자 인터페이스를 변경하려면 사용자가 검색 버튼을 클릭할 때 ViewGroup.removeView() 함수를 호출하여 검색 버튼을 제거하고 ViewGroup.addView() 함수를 호출하여 검색결과를 추가합니다.

대안으로 거의 동일한 두 개의 계층 구조가 있으면 이 방법을 사용할 수 있습니다. 사용자 인터페이스의 사소한 차이 때문에 두 개의 개별 레이아웃 파일을 만들고 유지관리할 필요 없이, 개발자가 코드에서 수정하는 보기 계층 구조가 포함된 하나의 레이아웃 파일을 사용할 수 있습니다.

현재 보기 계층 구조에서 이 방식으로 변경하면 장면을 만들지 않아도 됩니다. 대신 지연된 전환을 사용하여 보기 계층 구조의 두 상태 간에 전환을 만들어 적용할 수 있습니다. 이 전환 프레임워크 기능은 현재 보기 계층 구조 상태부터 시작하여, 보기의 변경사항을 기록하고, 시스템이 사용자 인터페이스를 수정할 때 변경사항을 애니메이션으로 보여주는 전환을 적용합니다.

단일 보기 계층 구조에 지연된 전환을 만들려면 다음 단계를 따릅니다.

  1. 전환을 트리거하는 이벤트가 발생하면 변경할 모든 보기의 상위 보기와 사용할 전환을 제공하는 TransitionManager.beginDelayedTransition() 함수를 호출합니다. 프레임워크에서 하위 보기의 현재 상태와 속성 값을 저장합니다.
  2. 사용 사례에 맞게 필요한 대로 하위 보기를 변경합니다. 프레임워크에서는 하위 보기와 속성의 변경사항을 기록합니다.
  3. 시스템에서 변경사항에 따라 사용자 인터페이스를 수정하면 프레임워크에서 원래 상태와 새 상태 간 변경사항을 애니메이션으로 보여줍니다.

다음 예에서는 지연된 전환을 사용하여 보기 계층 구조에 텍스트 보기를 추가하는 작업을 애니메이션으로 보여주는 방법을 알 수 있습니다. 첫 번째 스니펫에서는 레이아웃 정의 파일을 보여줍니다.

res/layout/activity_main.xml

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/mainLayout"
        android:layout_width="match_parent"
        android:layout_height="match_parent" >
        <EditText
            android:id="@+id/inputText"
            android:layout_alignParentLeft="true"
            android:layout_alignParentTop="true"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />
        ...
    </RelativeLayout>
    

다음 스니펫에서는 텍스트 보기 추가를 애니메이션으로 보여주는 코드를 확인할 수 있습니다.

MainActivity

Kotlin

    setContentView(R.layout.activity_main)
    val labelText = TextView(this).apply {
        text = "Label"
        id = R.id.text
    }
    val rootView: ViewGroup = findViewById(R.id.mainLayout)
    val fade: Fade = Fade(Fade.IN)
    TransitionManager.beginDelayedTransition(rootView, mFade)
    rootView.addView(labelText)

    

자바

    private TextView labelText;
    private Fade mFade;
    private ViewGroup rootView;
    ...

    // Load the layout
    setContentView(R.layout.activity_main);
    ...

    // Create a new TextView and set some View properties
    labelText = new TextView(this);
    labelText.setText("Label");
    labelText.setId(R.id.text);

    // Get the root view and create a transition
    rootView = (ViewGroup) findViewById(R.id.mainLayout);
    mFade = new Fade(Fade.IN);

    // Start recording changes to the view hierarchy
    TransitionManager.beginDelayedTransition(rootView, mFade);

    // Add the new TextView to the view hierarchy
    rootView.addView(labelText);

    // When the system redraws the screen to show this update,
    // the framework will animate the addition as a fade in

    

전환 수명 주기 콜백 정의

전환 수명 주기는 활동 수명 주기와 비슷합니다. TransitionManager.go() 함수를 호출할 때부터 애니메이션을 완료할 때까지의 시간 동안 프레임워크에서 모니터링하는 전환 상태를 나타냅니다. 중요한 수명 주기 상태에서는 프레임워크가 TransitionListener 인터페이스를 통해 정의한 콜백을 호출합니다.

예를 들어, 전환 수명 주기 콜백은 장면을 변경하는 중에 시작 보기 계층 구조에서 종료 보기 계층 구조로 보기 속성 값을 복사하는 데 유용합니다. 종료 보기 계층 구조는 전환이 완료되어야 확장되므로, 간단히 시작 보기에서 종료 보기 계층 구조의 보기로 값을 복사할 수 없습니다. 대신, 변수에 값을 저장한 다음 프레임워크에서 전환을 완료하고 나면 종료 보기 계층 구조로 복사해야 합니다. 전환이 완료되면 알림을 받도록 활동에 TransitionListener.onTransitionEnd() 함수를 구현하세요.

자세한 내용은 TransitionListener 클래스의 API 참조를 확인하세요.

제한사항

이 섹션에는 전환 프레임워크의 몇 가지 알려진 제한사항이 나열되어 있습니다.

  • SurfaceView에 적용된 애니메이션이 제대로 표시되지 않을 수 있습니다. SurfaceView 인스턴스는 비UI 스레드에서 업데이트되므로, 다른 보기의 애니메이션과 업데이트 항목이 동기화되지 않을 수 있습니다.
  • 특정 전환 유형은 TextureView에 적용해도 원하는 애니메이션 효과를 내지 않을 수 있습니다.
  • ListView와 같이 AdapterView를 확장하는 클래스에서는 전환 프레임워크와 호환되지 않는 방식으로 하위 보기를 관리합니다. AdapterView를 기반으로 보기를 애니메이션으로 보여주려고 하면 기기 화면이 정지될 수 있습니다.
  • 애니메이션을 사용하여 TextView의 크기를 조정하려고 하면 객체의 크기를 완전히 조정하기 전에 텍스트가 새 위치에 표시됩니다. 이 문제점을 방지하려면 텍스트를 포함하는 보기의 크기 조정을 애니메이션으로 처리하지 마세요.