Google은 흑인 공동체를 위한 인종 간 평등을 진전시키기 위해 노력하고 있습니다. Google에서 어떤 노력을 하고 있는지 확인하세요.

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

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.xmlFrameLayout 요소로 정의된 장면 루트를 사용합니다.

코드에 장면 만들기

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 객체를 사용하여 장면 사이의 애니메이션 스타일을 나타냅니다. 내장된 여러 서브클래스(예: AutoTransition, Fade)를 사용하여 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의 크기를 조절하려고 하면 객체의 크기가 완전히 조절되기 전에 텍스트가 새 위치에 표시됩니다. 이 문제점을 방지하려면 텍스트를 포함하는 보기의 크기 조정을 애니메이션으로 처리하지 마세요.