2011-12-13 2 views
8

ViewGroup을 기반으로 위젯을 개발하고 있는데, 문제는 애니메이션이 끝난 후에 항목의 위치를 ​​저장해야한다는 것입니다. 애니메이션 오브젝트에서 setFillAfter(true)을 호출했습니다. 다음에 AnimationListener을 만들고 onAnimationEnd 메소드 호출 View.layout(l,t,r,b)을 호출하여 애니메이션 이후에 위치를 설정합니다. 다음에 새 항목의 위치에서 애니메이션을 시작하고 싶기 때문입니다. 하지만이 경우 항목이 두 번 배치 된 것처럼 보입니다. 애니메이션 끝에서 View.layout(l,t,r,b)을 사용하지 않으면 다음 애니메이션이 이전 위치에서부터 시작됩니다. 여기 내 코드는 다음과 같습니다.애니메이션 끝 뒤의 위치 변경

private void scrollUp() { 
    for(int i = 0; i < getChildCount(); i++) { 
     final View child = getChildAt(i); 
     final int index = i; 
     final int newleft = child.getLeft() + mOffsetBetweenItems; 
     final int newTop = child.getTop() - mOffsetBetweenItems; 
     TranslateAnimation scrollUp = new TranslateAnimation(0, mOffsetBetweenItems, 0, -mOffsetBetweenItems);   
     scrollUp.setDuration(1500); 
     scrollUp.setFillAfter(true);   
     scrollUp.setAnimationListener(
      new AnimationListener() { 

       @Override 
       public void onAnimationStart(Animation animation) {} 

       @Override 
       public void onAnimationRepeat(Animation animation) {} 

       @Override 
       public void onAnimationEnd(Animation animation) { 
        child.layout(newleft, newTop, newleft + child.getMeasuredWidth(), newTop + child.getMeasuredHeight()); 
       } 
      } 
     ); 

     child.startAnimation(scrollUp); 
    } 
} 

애니메이션의 끝 위치에 따라 뷰의 위치를 ​​어떻게 재설정해야합니까?

+0

가 변경하는 대신, Project -> properties -> Android에서 API 레벨을 변경 position은 레이아웃에서 BOTTOM 또는 TOP에 설정하기를 원한다는 의미입니다. –

+0

은 BOTTOM 또는 TOP가 아니고, 뷰의 view.lay로 정의 된 구체적인 X, Y 좌표입니다. out()'메쏘드 – teoREtik

답변

12

내가 해냈어.

private void scrollUp() { 
    for(int i = 0; i < getChildCount(); i++) { 
     final View child = getChildAt(i); 
     final int index = i; 
     final int newleft = child.getLeft() + mOffsetBetweenItems; 
     final int newTop = child.getTop() - mOffsetBetweenItems; 
     TranslateAnimation scrollUp = new TranslateAnimation(0, mOffsetBetweenItems, 0, -mOffsetBetweenItems);   
     scrollUp.setDuration(1500); 
     scrollUp.setFillEnabled(true);   
     scrollUp.setAnimationListener(
      new AnimationListener() { 

       @Override 
       public void onAnimationStart(Animation animation) {} 

       @Override 
       public void onAnimationRepeat(Animation animation) {} 

       @Override 
       public void onAnimationEnd(Animation animation) { 
        child.layout(newleft, newTop, newleft + child.getMeasuredWidth(), newTop + child.getMeasuredHeight()); 
       } 
      } 
     ); 

     child.startAnimation(scrollUp); 
    } 
} 

그냥 setFillAfter(true)을 제거하고 대신 setFillEnabled(true) 쓰기 : 여기에 코드입니다. 그러나이 경우에는 setFillEnabled()의 논리를 이해하지 못합니다. 문서에서 설명하는 것과 같지 않은 동작을 제공하기 때문입니다.

+0

onAnimationEnd에서 새 왼쪽을 설정하면 문제가 해결됩니다. 감사. 귀하의 코드에서 어떤 시점에서 mOffsetBetweenItems를 설정/업데이트합니까? – speedynomads

+0

참고 : Lollipop에서는 Lollipop에서 작동하지 않습니다 (일부 API 수준에서는 위의 설명과 같이 구현되었지만 적어도 Lollipop에서는 작동하지 않음) – MDragon00

0

애니메이션을 되돌립니다. 먼저보기를 새 위치로 가져온 다음 이전 위치에서 새 위치로 애니메이션을 적용하십시오.

+0

처음에 새로운 위치를 주면 내 뷰가 새로운 위치에 즉시 재 드로잉됩니다. – teoREtik

+0

위치를 변경하자마자 startAnimation()을 호출하면 안됩니다. – Jave

+0

'view.layout()'을 호출하기 전에'view.layout()'을 호출하면 뷰가 다시 그려지고 새로운 위치에서 애니메이션이 시작됩니다. – teoREtik

19

ObjectAnimator을 사용해야하며 API 11 수준에서 작동합니다. 그것은 여기

는 대한

ObjectAnimator objectAnimator= ObjectAnimator.ofFloat(mContent_container, "translationX", startX, endX); 
objectAnimator.setDuration(1000); 
objectAnimator.start(); 

감사 7월의 예이며, 자동보기 위치를 변경 그의 answer

앱이 object animator을 찾을 수없는 경우, import android.animation.ObjectAnimator;

+0

보기를 애니메이션으로 표시합니다. 객체 애니메이터를 사용하여 뷰 좌표가 변경되지 않습니다. – mertsimsek

관련 문제