DevBytes: Android 4.4 Transitions

안녕하세요 저는 Chet Haase입니다

Android UI Toolkit 팀의 엔지니어입니다 오늘은 새로운 애니메이션에 대해 이야기하겠습니다 기능을 제공합니다 전환이라고합니다 전환을 사용한 아이디어는 실제로 많은 것들 뒤에있는 아이디어 우리가하는 일은 당신을 위해 일을 쉽게하려는 것입니다

안드로이드 응용 프로그램 개발자, 사용자에게보다 풍부한 경험을 제공하려면, 잘하면 적은 노력으로 전환, 그것은 단순한 생각입니다 기본적으로 다른 장면을 설명하는 방법입니다 애플리케이션에서 미리 레이아웃 리소스로 파일 또는 동적으로 변경 될 수 있습니다 변경 사항을 적용하여 변경 사항을 애니메이션으로 적용 할 수 있습니다

그러한 변화가 무엇인지 그리고 당신은 방해가되지 않고 방금 도망 갈 수 있습니다 화면 전환이 자동으로 실행되게하십시오 더 많이 관여 할 필요없이 이러한 수동 애니메이션을 실행하십시오 UI에서 애니메이션을 만드는 전형적인 모델입니다

바라건대, 하루가 끝날 때, 보다 풍부한 응용 프로그램 경험을 얻을 수 있습니다 직관적 인 방식으로 화면에서 더 많은 것들을 움직여서 사용자가 더 풍부한 경험을 얻을 수 있습니다 그리고 그들은 더 나은 이해를 얻습니다 응용 프로그램이 실제로 어떻게 작동하는지 너는 자연적으로 변화 할 수 있기 때문에 응용 프로그램의 서로 다른 장면 사이에서 그리고 세계에는 더 많은 애니메이션이 있습니다

나는 항상 그것을 좋아한다 승인 이제 슬라이드를 살펴 보겠습니다 그리고 API가 어떻게 작동하는지에 대한 간략한 개요를 살펴 보겠습니다 다른 부분은 뭐지? 제가 여기서 건너 뛰는 세부 사항이 많이 있습니다

그러나 당신은 무료이며 체크 아웃하는 것이 좋습니다 참조 문서의 상세 developerandroidcom에 대한 기사, 또한 나중에 조금씩 볼 수있는 API 데모를 제공합니다 우리는 그것의 일부 코드를 살펴볼 것입니다 승인

먼저 장면의 개념부터 시작합니다 당신은 이것을 레이아웃으로 생각할 수 있습니다 기본적으로 뷰 계층 구조입니다 이 특정 장면이 어떻게 생겼는지 설명합니다 이것은 전체 응용 프로그램의 장면 일 수 있습니다

특정 화면에서 또는 하위 계층 구조 일 수 있습니다 이 특별한 경우, 장면 우리가 텍스트보기, 편집 텍스트 및 단추가 있습니다 아주 간단합니다 그리고 우리는 또 다른 장면을 가지고 있습니다 다른 레이아웃 파일을 통해 설명 할 수 있습니다

거기에 다른 텍스트보기가 있습니다 조금 더 풍부 해졌습니다 텍스트, 거기에 더 자세한 내용 하지만 편집 텍스트 필드와 버튼이 있습니다 그리고 아마도 이것들은 공유 된 구성 요소입니다

어쩌면 그들은 위치를 옮겼을 수도 있고 크기를 바꿀 수도 있습니다 하지만 실제로는 두 장면에서 공유됩니다 사용자가 이해하도록 도울 수 있다면 좋지 않을까요? 애플리케이션에서 장면 1에서 장면 2로 이동하면, 사라지는 일들이 사라지면서 일어난 변화들, 그 안에있는 퇴색하는 것들이 존재하게되었고, 이 장면들 사이에서 공유 요소의 크기를 조정할 수 있습니까? 그것은 전환이 무엇에 관한 것입니다 이러한 서로 다른 장면을 지정합니다 그리고 나서 당신이 한 장면에 갈 때, 자동으로 애니메이션을 시작하고 필요한 애니메이션을 실행합니다

그 변화를 만들기 위해서뿐만 아니라 시간이 지남에 따라 변화를 애니메이션으로 나타낼 수 있습니다 그럼 장면을 살펴 봅시다 이들은 당신이 만든 모듈들입니다 귀하의 응용 프로그램에 대해 정의 된, 다른 화면, 만약 당신이 귀하의 신청서가 시간이 지남에 이러한 장면을 다른 방법으로 만들 수 있습니다

우선, 장면에는 항상 루트 또는 ViewGroup이 있습니다 기본적으로 그들과 관련되어있다 장면이 살아있는 계층 구조 전환이 일어날 것입니다 그래서 그 루트로 직접 씬을 만들 수 있습니다 EnterAction을 설정할 수 있습니다

그리고 그 장면이 입력 될 때마다, Runnable에 콜백이 생깁니다 그리고 어떤 코드라도 실행할 수 있습니다 어떤 조작을하고 싶다 당신은 뷰 계층 구조로 가고 싶다 매우 간단합니다

다른 방법보다 조금 수동입니다 장면을 만들 수 있습니다 예를 들어 ViewGroup에서 대신 생성 할 수 있습니다 일부 레이아웃 ID에서 계층 구조를 확장했다고 가정 해 보겠습니다 이 ViewGroup을 거기 앉아 있습니다

해당 ViewGroup을 사용하여 씬을 생성 할 수 있습니다 기본적으로 두 개의 ViewGroup을 제공합니다 장면 계층 구조의 루트로 생성 할 수 있습니다 장면 그 자체의 뿌리뿐만 아니라 그래서 당신은 그것을 전달합니다 당신은 씬을 만들었습니다

넌 잘하는거야 이제 장면이 입력되면, 해당 ViewGroup을 보도록 장면을 간단히 변경합니다 대신에 무엇을 해야할지 말할 필요가 없습니다 계층 구조를 조작합니다

ViewGroup에서 해당 정보를 가져옵니다 당신은 생성자에서 그것을 전달했습니다 마지막으로, 우리는 마지막 것과 매우 비슷한 것을 가지고 있습니다 그러나 ViewGroup에 전달하는 대신, 레이아웃 리소스 ID를 넘겨줍니다 그리고 그 장면이 입력되면, 그것은 자원을 부 풀릴 것입니다

그리고 그것은 앞으로 나아가고 그것을 장면 루트에 추가 할 것입니다 똑바로 레이아웃 리소스도 시작됩니다 리소스에 암시 적으로 장면을 만드는 경우 우리는 조금 나중에 보게 될 것입니다 자동으로 전환 관리자를 사용할 수 있습니다

주어진 레이아웃 리소스 ID를 암시 적으로 장면을 팽창시킵니다 그리고 그것은 두포에서 같은 메커니즘을 사용합니다 다음으로 전환을 살펴볼 수 있습니다 이들은 선언 책임이있는 엔진입니다 사물이 바뀌면 너는 무엇을하고 싶은가? 애플리케이션에서 장면에서 장면으로 그래서 이것들은 기본적으로 변경 전후에 듣습니다

그 값들을 비교하라 그리고 어떤 관점에서도 일어난 변화를 기반으로 장면 계층에서 애니메이터를 만듭니다 그런 다음 변경 사항을 애니메이션으로 실행합니다 전환을 만드는 데는 몇 가지 방법이 있습니다 이러한 것들을 직접 만들 수 있습니다

우리는 프레임 워크에 이미 정의 된 것을 가지고 있습니다 이동하고 크기를 조정하는 ChangeBounds가 있습니다 장면간에 변경되는 오브젝트 상황에 따라 퇴색하는 퇴색이 있습니다 그들이 장면 변경 사이에 오르거나 갈 것인지 여부

그리고 TransitionSet도 있습니다 이것은 AnimatorSet과 같은 트랜지션에 해당합니다 그것은 기본적으로 그룹입니다 그것은 여러 가지 전환을 안무의 방법입니다 TransitionSet을 만든 다음 모든 전환기 자녀들에게, 함께 또는 순차적으로 실행합니다

또한 집합 계층 구조 일 수도 있습니다 따라서 훨씬 복잡한 메커니즘을 가질 수 있습니다 병렬 또는 여러 개의 전환이 실행됩니다 더 재미있는 애니메이션을 얻기 위해 경험 마지막으로 전환을로드 할 수 있습니다

그게 당신이가는 길이면 리소스 파일에서 자원에서 실행하려면, 이것은 당신이 그것을 할 수있는 방법입니다 이 예는 TransitionSet입니다 자동으로 추가 된 두 개의 자식이로드 된로드됩니다 가시성의 변화를 경청하는 것, 크기 및 위치뿐 아니라 리소스 파일, 그렇지 않을 수도 있습니다

이미 코드를 사용하고 있기 때문에 코드에서 수행하려는 작업 UV 코드 비행 중에 이러한 것들을 만드는 것은 쉽습니다 다른 한편으로 이것은 이것이 메커니즘이다 그것이 부 풀릴 때 Transition Manager에서 사용하는 우리가 곧 볼 수있는 정보의 그래프, 이 슬라이드에는 아직 없습니다 마지막으로 사용자 지정 전환 아이디어가 있습니다

그래서 우리는 내가 말했듯이, 몇 가지 표준적인 변환을 정의했다 자동 전환 기능이 즉시 사용됩니다 보기를 이동하고 크기를 조정하는 ChangeBounds가 있습니다 가시성을 다루는 페이드도 있습니다 정보가 사라지고 사라집니다

매우 간단합니다 아마도 대부분의 경우 원하는 동작 일 것입니다 그러나 자신 만의 전환을 정의하려는 경우 – 예를 들어, 만약에 무언가가 생기면, 당신은 화면 중간에서 페이드 인하는 것을 원하지 않았다 그것이 사는 곳에서, 그러나 당신은 실제로 원합니다 오른쪽에서 밀어 넣으려면 당신은 커스텀 트랜지션을 작성할 수 있습니다

단순히 전환 클래스 자체를 하위 클래스로 만들면됩니다 그런 다음 세 가지 방법을 재정의합니다 그것은 당신이하고 싶은 일을합니다 두 가지 캡처 방법이 있습니다 하나는 응용 프로그램이 시작될 때 값을 캡처합니다

코드는 말했다, 좋아, 전이 할 준비가되었다 그것이 당신이 원하는 시점입니다 captureStartValues ​​메소드를 호출합니다 그리고 당신은 앞으로 나아가서 뷰 객체들로부터 읽습니다 당신이 원했던 모든 것은 전환에 영향을 미쳤습니다

예를 들어 레이아웃 위치를 읽을 수 있습니다 또는 당신이 관심을 갖는 가시성 정보 그리고 captureEndValues를 호출합니다 트랜잭션이 실제로 실행되기를 원할 때, 언제 시작하길 원하니? 그리고 나서 마침내 전화를받을 수 있습니다 그 후에 createAnimator 함수에 그 값들을 비교하고, 좋아, 좋아, 이 가시성 값이 변경되었습니다

그리고 그것은 제가 염려하는 것입니다 따라서 애니메이션을 만들어서 다음과 같이한다 오른쪽에서 밀어 넣는다 또는 그것이 무엇이든간에 해당 애니메이터를 반환합니다

그런 다음 전환 시스템이 실행합니다 그래서 우리는 단지 많은 것들을 가지고 있습니다 프레임 워크와 함께 무료로 배송 할 수 있습니다 전환을 실행할 때 암시 적으로 사용하십시오 그러나 사용자 정의 전환을 공정하게 만들려면 그렇게하는 것이 간단합니다

승인 이제 씬을 얻었습니다 당신은 전환이 있습니다 실제로 장면을 어떻게 바꾸나요? 한 장면에서 다른 장면으로 어떻게 가나 요? 당신은 단지 장면을 입력 할 수 있습니다 거기에 아무런 변화가 없습니다

기본적으로 말하기 만하면됩니다 너를로드하기를 바라는 장면 그리고 그렇게 할 것입니다 Runnable에 있던 코드가 실행됩니다 그것은 당신이 준 레이아웃 리소스 파일을 부 풀릴 것이고, 도대체 무엇이

현장에 들어갈거야 그곳에는 아무 것도 없습니다 물론 재미있는 애니메이션이 아닙니다 또는 장면 전환 관리자에게 장면으로 이동하도록 지시 할 수 있습니다 그리고 그 과정에서, 도중에 기본 전환을 사용합니다

그것은 말할 것입니다, 좋아, 나는이 장면으로 갈 것입니다 그리고 그동안 저는 StartValues를 캡쳐 할 것입니다 captureEndValues를 실행하고 기본 전환을 실행합니다 시스템 용 또는 사용자 지정 전환을 사용하여 실행할 수도 있습니다

당신은 말할 수 있습니다 좋아,이 멋진 전환을 정의했습니다 내가 갈 때 사용하고 싶다 이 특정한 장면 조합 사이에서, 그리고 지금 진행 전환 중 하나를 사용하여 전환 또는 전환 관리자에서 이동 메소드를 선택합니다 실제로 새로운 장면을로드합니다

그런 다음 사용자 정의 전환을 실행하십시오 전환, 단순화, 내가 여기에서 언급하지 않은 또 하나의 것이있다 이것은 전환 관리자의 아이디어입니다 당신은 보통 당신이 말하는 일회적 인 일을 위해서 이것을 사용할 것입니다, 전환 매니저,이 장면에 가고 싶습니다 내 사용자 지정 전환을 여기에서 사용하십시오

그것이 할 수있는 또 다른 일은 전체 정보 그래프를 지키다 모든 전환 조합에 대해 모든 장면 조합에 대해 원하는 것 당신이 당신의 신청서에 가지고있는 나중에 데모에서 조금씩 보게 될 것입니다 하지만 여기서 마지막으로 한 가지를 지적하고 싶습니다 마지막 흥미 진진한 슬라이드에 이 모든 정보를 가지고,이 모든 다른 클래스들 그것에 대해 생각하고 장면을 가지고 있어요 전환이 있었지만 실제로는 대부분의 개발 사례에서 애니메이션을 더 간단하게 만드는 것이 었습니다

그래서 일반적으로 유일한 방법은 아마도 이게 신경 쓰일거야 TransitionManagerbeginDelayedTransition을 호출합니다 그런 다음 장면 루트를 지정합니다 전환을 실행하고 싶습니다

그것이하는 일은 그 모든 과정에서의 킥입니다 현재 값을 캡처 할 것입니다 그러면 레이아웃과 렌더링이 실행됩니다 그리고 그 틀의 중간에, 최종 가치를 포착 할 것입니다 어떤 것이 있는지 파악한 다음 실행하십시오

당신을위한 자동 전환 대부분의 경우, 이것이 실제로 걱정하는 모든 것입니다 그것은 기본적으로 역동적 인 변화입니다 이것을 창조 및 애니메이션으로 생각할 수 있습니다 역동적 인 장면

따라서 이러한 미리 굽는 장면을 갖는 대신 레이아웃 리소스 ID를 사용하면 기본적으로 다음과 같이 말할 수 있습니다 좋아요 전환을 실행하여 준비하십시오 그때까지 나는 갈거야 변화를 일으킬 수 있습니다

그리고 나서 그 변화가 실제로 일어날 때까지 시작, 측정 및 레이아웃 실행, 시스템은 새로운 프레임을 그릴 준비가됩니다 그런 다음 전환이 시작되고 델타를 계산하고, 변경 사항을 파악하고 애니메이션을 만들고, 실행중인 애니메이션을 시작하십시오 매우 간단합니다 한 줄의 코드 좋은

승인 이제 데모를 간략하게 살펴 보겠습니다 KitKat과 함께 제공되는 API 데모 중 하나입니다 그래서 샘플에서 다운로드하도록 권장합니다 그리고 당신은 이것을 실행할 수 있고 그것으로 놀 수 있습니다

당신의 심장 내용 완전히 복잡하고 흥미로운 데모 그래서 여기 네 장면을 정의했습니다 그리고 장면은 사용자 정의보기를 사용합니다 그래서 특별한 이유가 없습니다

버튼 일 수 있습니다 나는 대신 그들에게 색깔의 직사각형을 만들어 냈습니다 그래서 우리가 장면들 사이에서 바꿀 때, 우리가 크기를 조정하는 것을 볼 수 있습니다 이것들을 재배치 그리고 우리는 그냥 바꿀 수 있습니다

취소 중입니다 우리가 방해하고 있습니다 우리는 다른 장면 전환을 실행 중입니다 매우 간단합니다 이제 데모 코드를 살펴 보겠습니다

여기에는 몇 가지 다른 조각이 있습니다 첫째, 몇 가지 레이아웃 파일이 있습니다 그래서 우리는 전환 장면 1을 가지고 있습니다 이것은 단지 레이아웃이 있습니다 그리고 거기에는 네 가지 견해가 있습니다

적절히 배치 전환 장면 2는 매우 비슷합니다 그것은 단지 크기와 위치가 다릅니다 색깔이있는 직사각형의 경우 전환 3은 합병증을 추가합니다

중간에 그레이 스케일 사용자 정의보기가 있음 그곳에 따라서 레이아웃 리소스에서 실제로 흥미로운 것은 없습니다 파일 하지만 나중에 리소스에서 언급 한 내용을 볼 수 있습니다 우리가 전환 관리자를 위해 팽창시킨 우리는 정의한 전환 정의를 가지고 있습니다

이것은 단순히 ChangeBounds입니다 여기서는 정말 흥미로운 것이 없습니다 그것은 단지 표준 ChangeBounds입니다 우리가 달릴거야 그러나 나중에이 리소스를 참조합니다

우리가 전환 관리자를 부 풀릴 때 다음은 좀 더 재미있는 이야기입니다 이것은 TransitionSet입니다 기본 모드로 실행됩니다 모든 전환이 병렬로 실행됩니다

동시에 ChangeBounds가 실행됩니다 그것은 페이드 전환을 실행할 것입니다 그리고 페이드는 특정 관점을 목표로 삼을 것입니다 또한 ID를 사용하여보기와 연결합니다 즉, 페이드는 일반적으로 적용되지 않습니다

화면의 모든 것,하지만 우리는 말하고 있습니다 이 특별한 전환을 계층 구조의이 특정보기에 표시됩니다 페이드 아웃은 매우 유사합니다 이 경우에도 진행됩니다 순차적으로 전환을 실행합니다

그래서 그것은 ChangeBounds를 실행할 것입니다 위치와 크기를 변경하십시오 그리고 그 일이 끝나면, 그것은 페이드를 돌 것입니다 그리고 마지막으로 전환 관리자가 있습니다 우리는 아직 보지 못했습니다

이것은 무엇의 그래프를 유지하는 객체입니다 장면에서 장면으로 가면서 당신이 원한다 귀하의 신청서에 너 여기서 정의 할 수있어 내 말은, 네가 어떤 관습도 필요 없다면 전환이 발생하면 전환 관리자는 신경 쓰지 않습니다 전환을 실행하면됩니다

그러나 당신이 장면 1에서 장면 2로 갈 때 당신이 신경 쓰면, 이 특별한 커스텀 트랜지션을 원하지만, 장면 2에서 장면 3에 다른 것을 원하면 최소한 리소스 파일에서 정의하는 방법입니다 따라서 전환 관리자를 만듭니다 그런 다음 여러 개의 전환 객체가 있습니다 원하는 상호 작용을 정의하는 이러한 특정 장면 변경에서 그래서 우리는 레이아웃 파일을 참조하는 fromScene을 가지고 있습니다 그리고 그것은 암묵적으로 팽창 할 것입니다

해당 레이아웃 리소스 파일을 열고 그 중에서 장면을 만듭니다 우리에게는 toScene이 있습니다 같은 것 레이아웃 파일에서 장면을 생성합니다 그리고 나서 우리는 그것이 다른 전환 자원에서 참조하려고한다

우리가 방금 보았던 것과 같은 파일 그게 전부 자원입니다 이제 transitionsjava에있는 코드를 살펴 보겠습니다 또한 API 데모에서는 Animations 디렉토리에 있습니다

그리고 그것은 단순 전환이라고합니다 그리고 여기 있습니다 여기에 많은 코드가 없습니다 전환 관리자가 부 풀리게됩니다 음, 우리는 천이 기 Inflator를 얻습니다

그리고 나서 우리는 Transition Manager를 팽창시킵니다 그리고 우리는 그 과정에서 세 장면을 만듭니다 그리고 우리는 3 개의 장면 만 생성한다는 것을 알 수 있습니다 그러나 데모에서는 실제로 4 개가있었습니다 그리고 우리는 몇 분 안에 그 이유를 보여줄 것입니다

우리가 코드에서 장면을 필요로하는 유일한 이유 여기가 우리가 지정한 곳입니다 그들은 특정 장면으로 전환하려고했습니다 우리는 이미 전환 관리자에게 말했습니다 우리가 장면을 따라 갈 때 어떤 장면 전환이 실행되는지 그리고 여기, 우리는 실제로 그 장면에 대한 참조를 얻고 있습니다

그리고 좋아, 이제 나는 움직이고 싶다 장면 1, 장면 2, 장면 3 그리고 우리가 여기서 하죠 데모에서 라디오 버튼을 클릭하면, 우리는이 품목 중 하나에 전화를 겁니다 그리고 우리는 말합니다, 좋습니다, Transition Manager, 저는 다음 장면으로 넘어 가기를 바랍니다

그리고 그것은 갈 것입니다 장면이로드됩니다 변경 사항을 파악하고 전환을 실행합니다 전환 관리자 리소스에서 지정한 우리가 본 파일 마지막으로 거기에 네 번째 장면이 있습니다

이 장면 객체와 아무 관련이없는 우리가 팽창시킨 그러나 대신, 이것은 제가 언급 한 것입니다 우리는 기본적으로 동적 인 장면으로 이전에 즉석에서 뷰 계층 구조 변경 전환 관리자가 있어야합니다 또는 전이 시스템, 일반적으로, 기본적으로 모든 변경 사항이 자동으로 애니메이션으로 표시됩니다 마법 메서드를 호출하고 beginDelayedTransition을 호출합니다

우리는 우리가 작업 할 장면 루트를 제공합니다 Set newSize라는 헬퍼 메서드를 호출합니다 기본적으로 우리는 임의적으로 변경합니다 뷰 계층 구조 내부 여기에 온다

뷰에 몇 가지 새로운 레이아웃 매개 변수를 설정합니다 그러면 내부적으로 요청 레이아웃이 생성됩니다 장면 루트 안의 것들이 중계 될 것입니다 다시 렌더링되었습니다 그리고 그런 일이 생길 때, Transition System 상황이 바뀌 었다는 것을 알아 차렸다

자동으로 전환을 실행합니다 당신이 데모에서 본 바와 같이, 이 단일 코드 줄로 내용의 크기가 조정됩니다 그래서 그것은 전환입니다 KitKat의 새로운 기능입니다 나는 시간이 지남에 따라 더 많이 일할 것으로 예상한다

지금은 상당히 간단하고 간단합니다 그리고 더 중요하게는 단순 해지기를 바랍니다 더 풍부한 안드로이드 응용 프로그램을 만드는 데 사용할 수 있습니다 감사