DevBytes: Animating ListView Deletion: Now on Gingerbread!

CHET HAASE : 안녕하세요, 저는 Chet Haase입니다 Google의 Android 팀 이전 에피소드에서 ListView에 대해 이야기했습니다

보기를 제거한 다음 애니메이션을 적용 할 애니메이션 ListView에서 항목을 스 와이프하고 아이템이 있던 곳을 무너 뜨리고 모든 다른 견해가 자리를 잡습니다 그게 다 좋았어 그 종류의 애니메이션을 모두가는 부동산 애니메이션 시스템 돌아 오는 길 30 오늘 당신에게 보여줄 데모는 현저하게 비슷합니다

그것에, 그러나 그것에는 중요한 비틀기가있다 먼저 데모를 보겠습니다 돌아가서 이전 쇼를 보려한다면 그것과 어떤 맥락이 있습니다, 괜찮습니다 OK, 너 돌아 왔어 여기에 우리가 간다

현재 데모를 실행 해 보겠습니다 우리가 이전에 보았던 것과 현저하게 비슷합니다 그래서 우리는 항목을 밖으로 스 와이프합니다 우리가 조금이라도 문지르면 다시 움직입니다 추가로 스 와이프하면 애니메이션이 적용됩니다

갭을 애니메이션화하여 닫힙니다 그래서 여기에 꼬임이 있습니다 내 넥서스 S에있는 진저 브레드에서 이걸 실행하면, 이 동일한 애니메이션을 볼 수 있습니다 그래서 이것은 내 애니메이션 데모에서 많은 질문입니다 이 모든 부동산 애니메이션입니다

물건 정말 멋지다 이전 버전에서는 어떻게합니까? 바라기를, 그 문제는 시간이 지남에 없어지고 있습니다 하지만 진저 브레드에 대한 귀하의 응용 프로그램, 그럼 우리는 당신이 얻을 수있는 방법을 볼 수 있습니다 이전 버전에서도 이런 종류의 기술이 사용되었습니다 이제 코드를 살펴 보겠습니다 코드의 모든 요소를 ​​다루지는 않겠습니다

배경 그리기, 그리고 그림자, 그리고 그 모든 이전의 이야기에있었습니다 그냥 가서 다른 DevBytes를 체크 아웃하십시오 Google I / O 애니메이션에서 데모가 나왔다고 말합니다 대신, 저는 우리가 할 수있는 부분에 집중하고 싶습니다 새 속성 스타일 애니메이션과 오래된 애니메이션

따라서 우리의 터치 리스너는 이러한 것을 듣고 있습니다 스 와이프 이벤트 그리고 우리는 본질적으로 같은 것을하고 있습니다 우리는 다운 이벤트를 듣고 있습니다 그 다운 이벤트가 발생합니다

그리고 이동 이벤트에서 우리는 새로운 x 위치는이 물건을 얼마나 멀리 움직일지를 알아내는 것입니다 그리고이 시점에서 당신은 예, 그렇습니다, 그렇다고 생각할 수도 있습니다 우리는 실제로 TranslationX를 사용하고 있습니다 실제로 존재하지 않는 속성을 사용하고 있습니다 생강 빵

어떻게 작동합니까? 그게 핵심이야 따라서 TranslationX 값을 얻기 전에 우리는 TranslationX 값을 설정할 수 있습니다 30에 제공된 속성 진저 브레드에서 그 속성은 보기 때문에 조금 어렵습니다

거기서 그들과 함께 일하십시오 그래서 우리가하는 일은이 setSwipePosition을 호출하는 것입니다 그래서 코드를 리팩터링하여 올바른 작업을 수행 할 수있게했습니다 출시, 진저 브레드 또는 비 진저 브레드, PostGinger 빵 그래서 그 메소드 setSwipePosition에서 볼 수 있습니다

어떻게 작동하는지 그래서 런타임이 PostGingerbread라면, 이것은 무엇입니까? 우리는 전에했다 TranslationX 값을 설정하기 만하면됩니다 적절한 장소로 스 와이프 한 항목 및 알파 값을 다소 반투명하게 설정합니다 원본 위치에서 얼마나 떨어져 있었는지에 따라 스크린 가장자리에 얼마나 가깝습니까? 당신이 진저 브레드에 있다면, 그 속성은 존재하지 않습니다, 우리는 알파가 없으며 TranslationX를 가지고 있지 않습니다

그래서 우리가 뭘 할 수 있지? 우리는 예전 스타일의 애니메이션으로 작업 할 수 있습니다 이것은 30 이전에 존재했던 애니메이션 시스템입니다 글쎄요, 우리가 이것을 실제로 설정한다면 이것을 사용할 수 있습니다 속성 및보기를 보는 방식을 위장하여 근본적으로 똑같아 보인다

그것은 완전히 동일하지 않기 때문에 알파 속성이 없습니다 그러나 더 반투명하므로 시각적으로 효과적입니다 같은 것 그래서 우리는 항목에 대해 TranslateAnimation을 실행합니다 항목에 AlphaAnimation을 설정할 수 있습니다

그리고 우리는 번들로 AnimationSet을 생성 할 수 있습니다 둘 다 우리는이 두 애니메이션을 모두 AnimationSet 우리는 setFillAfter 및 FillEnabled를 true로 설정합니다 그들이 자신의 가치를 지키려한다는 것을 의미합니다

애니메이션이 끝난 후 우리는 애니메이션을 시작합니다 그래서 기본적으로 우리는 이러한 것들에 애니메이션을 설정했습니다 그리고 우리는 알파와 알파를 효과적으로 설정하려고합니다 이 항목을 실행하여 번역 속성 애니메이션을 특정 값으로 변환합니다 그리고 우리가 실제로 번역을 실행하고 있음을 주목하십시오

기본적으로 현재 값에서 현재 값까지의 애니메이션 가치, 그것은 우리가 거기에서 그것을 슬램 할 것을 의미합니다 그것은 같은 값으로 시작하고 끝날 것입니다 애니메이션이 끝났음에도 불구하고 FillEnabled를 true로, FillAfter를 true로 설정합니다 그 가치에 머무를 것입니다 그래서 그것은 실제적으로 속임수입니다

스 와이프하지만 실제로 스 와이프를 오른쪽으로 설정하면 사용자 손가락 아래의 위치 좋아요 그렇게하면 스 와이프가 설정되지만, 그렇다면 실제로 움직이는 다른 동작 물건이 제거 된 후에 그래서 우리는 여기에 와서 말합니다 좋아, 사용자가 들어 올리면, 그들이이 항목을 스 와이프하고 있다면, 우리는 어떻게 멀리 이동 한 다음 스 와이프에 애니메이션을 적용하려고합니다

그래서 우리는이 다른 방법을 여기서 호출합니다 다시, 우리는 이것을 우리가 별도의 방법으로 리팩토링했다 진저 브레드 나 포스트 진저 브레드 PostGingerbread는 이전과 비슷한 모양입니다 그 다른 비디오를 보았다면 우리는 움직입니다

View Property Animator, 우리는 알파에 애니메이션을 적용하고 있습니다 animating TranslationX 여기서 리스너를 사용하므로 실제로이 애니메이션은 다시 31로 돌아 가세요 엔드 액션이있는 Jelly Bean API에 대한 의존성은 없습니다

더 이상 속성 애니메이터보기에서 대신에 청취자를 설정하고 애니메이션이 끝나면 적절한 조치를 취합니다 값, 우리는 그 모든 것들을 격차를 좁히기 위해 움직입니다 진저 브레드에서 달리면 스 와이프, 이것은 이전에 본 것과 매우 흡사합니다 어디에서 우리가 스 와이프 위치를 설정했는지

현재 스 와이프 위치에 애니메이션을 적용하는 것뿐입니다 그래서 우리는 현재 x와 현재로부터 시작하고 있습니다 그 항목이 끝난 곳의 알파 값, 우리는 화면에서 또는 다시 제자리로 움직이는 애니메이션 다시 말하지만, 애니메이션 세트를 사용하고 있습니다 우리는 더 이상 FillEnabled를 설정하지 않습니다

전체를 원해? 평가 절하?] 우리가 끝났을 때 대신에 우리는 단지 애니메이션이나 애니메이션으로 돌아갈 것입니다 애니메이션이 끝나면 값을 복원하거나 다시 애니메이션을 적용하는 경우 그 위치로 이동하거나 애니메이션을 적용합니다 다른보기 및이보기의 경우 애니메이션을 틈새가 닫혔다 그래서 이전에 사용했던 것과 같은 기술을 사용합니다

DevBytes 비디오, 우리는 모든 견해가 어디에 있는지 파악하고 있습니다 해당 뷰 위치를 itemId와 연관시킵니다 이제 안정적인 ID 배열 어댑터를 다시 사용하고 있습니다 이것을 해시 맵에 저장합니다 그런 다음 어댑터에서 항목을 제거합니다

이를 통해 알림 데이터 세트가 레이아웃을 강요합니다 그러나 레이아웃이 화면에 표시되기 전에 ViewTreeObserver의 onPreDrawListener가 실행됩니다 이제 모든 조회수의 위치를 ​​추적 할 수 있습니다 ListView의 현재 버전과 무엇을 파악 itemIds가 연결되어 있으면 해당 항목을 다른 itemIds를 만들고 변경 사항을 애니메이션으로 만듭니다 다시 말하지만,이 모든 것은 이전과 동일합니다

여기있는 유일한 트릭은 실제로 어떻게 작동 시키는가입니다 생강 빵 PreDrawListener를 제거하면 알아낼 수 있습니다 어디로 가야하고, 그런 다음 애니메이션을 실행합니다 바로 여기 있습니다

moveView는 실제로 애니메이션을 실행하여 화면 다시 말하지만 진저 브레드에는 진저 브레드가 아닌 버전이 있습니다 이거 비 진저 브레드는 이 경우를 제외하고는 이전에 무엇을했는지를 실제로 사용하고 있습니다 ObjectAnimators, 일종의 View와 상호 교환 가능 속성 애니메이터

속성 애니메이터보기는 조금 더 간소화 된 API 이 경우 객체 애니메이터를 사용합니다 진저 브레드 버전에서는 다시 TranslateAnimation, 30 이전 API, 우리는 다음과 같이 말합니다 이보기를 현재 시작 및 끝에서 x- 및 y 위치

그리고 그 항목에 따라 계산되었습니다 내용은 레이아웃 전후입니다 ListView를 변경하십시오 기간을 설정하고 애니메이션, 그리고 그게 전부입니다 정말 상당히 간단합니다 유일한 방법은 이전 접근 방식이 3

0 이전에는보기에 존재하지 않았던 속성들 그것을 사용할 수 없습니다 그래서 우리는 오래된 애니메이션을 사용하여 시스템을 가짜로 만듭니다 똑같이 보이게하십시오 그리고 나서 애니메이션, 똑같은, 우리는 애니메이션을 사용하고 있습니다 속성을 기반으로하는 API는 3

0 이전에는 존재하지 않았습니다 대신에 사용하지 않은 오래된 애니메이션을 사용합니다 속성들과 동일한 시각 효과를 준다 우리가하는 일 다른 모든 것은 같은 논리입니다

itemIds를 추적하십시오 전후에, 그것들과 관련된 견해가 어디에 itemIds가 있었고 간단히 변화와 그 것이다 그럼 가서 "A Google I / O에서 "Moving Experience"를 사용하여 좀 더 자세히 알아보십시오 데모가 실제로 어떻게 작동하는지 엿볼 수 있습니다 그 이유

다른 DevBytes 비디오를 확인해보십시오 코드의 전체 구조와 다른 요소들 나는 오늘 얘기하지 않았다 그리고이 데모 코드를 확인하십시오 감사