2012-04-17 2 views
1

프로젝트 API 11에 필요합니다.Android 애니메이션보기가 현재 전체 화면보기를 푸시하는 화면으로 들어갑니다.

오른쪽에서보기를 추가하는 방법을 찾고 있는데, 현재 전체 화면보기가 왼쪽에서 왼쪽으로 이동하여 화면에서 새보기를 볼 수있게합니다.

새로운보기는 화면 너비의 약 1/3이므로 현재 fusll 화면보기가 화면 밖으로 이동해야하는 거리입니다.

TranslateAnimation()을 사용하여 다양한 솔루션에 지쳤습니다. 애니메이션에 만족하지만 원본보기의 모든 클릭 가능 영역에 문제가 있습니다.

그래서 나는 음의 여백으로 정확하게 배치하기 위해 레이아웃을 가지고 놀기 시작했다. 그러나 새로운 레이아웃 요청이 올 때 몇 초가 지나면보기가 다시 팝업된다. 또한이 솔루션은 애니메이션 끝 리스너에서보기를 이동할 때 고르지 못한 영향을줍니다.

새로운보기가 시작되거나 종료 될 때 좋은 애니메이션이있는 가장 간단한 솔루션은 레이아웃 관점에서 올바른 위치에보기를 배치합니다.

답변

0

아마도 fillAfter와 fillEnabled를 사용하는 대신 원하는 최종 위치에 맞게 AnimationListener의 onAnimationEnd에서 레이아웃을 프로그래밍 방식으로 변경해야합니다.

깜박임을 제거하려면 애니메이션하려는 뷰에서 onAnimationEnd에서도 clearAnimation()을 호출하십시오.

+0

그래, 그게 내가 한 일이야. view.layout (새 좌표) 호출 후보기가 올바른 위치로 이동하더라도 (x에도 음수 여백이 필요함) 잠시 후 시스템에서 레이아웃을 다시 호출하고보기가 다시 제자리에 스냅됩니다. 나는 이것이 레이아웃을 확장하고 올바른 위치를 반영하기 위해 레이아웃 (r, t, l, b)의 값을 변경했는지 확인하는 다양한 방법을 시도했지만이 경우 전혀 효과가 없습니다. – totem

+0

코드를 게시 할 수 있습니까? 나는 네가 정확히 말하는 것을 분명히 알지 못한다. –

10

API11을 사용하고 있으므로 Animator API을 사용하십시오. 모든 뷰에는 현재 해당 setter 및 getter가있는 속성이 있습니다.

View viewToShiftOut = getOutView(); 
ObjectAnimator outAnim = ObjectAnimator.ofFloat(viewToShiftOut, "x", 0, -widthOfScreen); 
outAnim.setDuration(1000); 
outAnim.start(); 

이보기를 이동하고 그것이 1 초 (1000 밀리 초)의 기간 동안 화면에서 전체 내용이다 : 범위에서 왼쪽으로 볼을 이동하려면, 화면의 폭을 얻을 다음 할 . 애니메이션 완료 할 때 수행 할 수 있습니다, 그래서보기를 따를 것이다

View viewToShiftIn = getInView(); 
ObjectAnimator inAnim = ObjectAnimator.ofFloat(viewToShiftIn, "x", widthOfScreen, 0); 
inAnim.setDuration(1000); 
inAnim.start(); 

모든 속성, 클릭 가능한 영역 등 : 그것의 장소를 이동하기 위해이 작업을 수행. 당신과 같이 함께 애니메이션을 적용 할 수 있습니다 :

View viewToShiftOut = getOutView(); 
View viewToShiftIn = getInView(); 
ObjectAnimator outAnim = ObjectAnimator.ofFloat(viewToShiftOut, "x", 0, -widthOfScreen); 
ObjectAnimator inAnim = ObjectAnimator.ofFloat(viewToShiftOut, "x", widthOfScreen, 0); 
outAnim.setDuration(1000); 
inAnim.setDuration(1000); 
outAnim.start(); 
inAnim.start(); 

Blog post

편집 : 난 당신이 단지 1/3로 뷰를 이동하고 싶었 발견, 당신은 widthOfScreen/3으로 각각 이동하는 픽셀의 양을 얻을 수 있도록 .

EDIT 2 : 또 다른 장점은 대부분의 3.0+ 태블릿에 문제가없는 하드웨어 가속 기능과 함께 사용할 수 있다는 것입니다.

+0

내 실수는 분명히 pre API 11, setX setY 또는 object animators가 아닙니다. – totem

+0

확인. 나는 그것에 대해 많은 경험이 없다. 사람들이하는 일반적인 방법은 그에 따라 마진을 설정하는 것입니다.이 경우 이동하려는 뷰의 왼쪽 및 오른쪽 여백을 프로그래밍 방식으로 설정해야합니다. 음수 여백은 화면 밖으로 화면을 이동합니다. 당신이 들어갈 뷰는'screensize - viewWidth'의 왼쪽 여백과'0'의 오른쪽 마진을 가질 것입니다. 'requestLayout()'을 호출하면 모든 것을 설정해야합니다. 나는 그것을 해본 적이 없어서 대답으로하지는 않겠지 만 그것이 저에게 효과가있는 것처럼 보입니다. – DeeV

관련 문제