2017-05-07 1 views
2

나는 다른 방식으로 저글링을하는 4 개의 서클이있는 애니메이션을 만들려고합니다.ValueAnimator가 하나의 요소를 사라지게합니까?

나는이 일을 ValueAnimator을 사용하고 있습니다,하지만 난 AnimatorSet를 두 번 반복 할 때, 하나 개의 요소는 무슨 일

... 사라지고 다시 나타납니다? 누가 알 겠어? 여기

objAnimator = ValueAnimator.ofFloat(0, 1); 
    objAnimator.setDuration(DURATION); 
    objAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { 
     @Override 
     public void onAnimationUpdate(ValueAnimator animation) { 
      float value = (Float) animation.getAnimatedValue(); 

      elements[2].setTranslationX(lateralDistance * value); 
     } 
    }); 

    objAnimatorTwo = ValueAnimator.ofFloat(0, 1); 
    objAnimatorTwo.setDuration(DURATION); 
    objAnimatorTwo.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { 
     @Override 
     public void onAnimationUpdate(ValueAnimator animation) { 
      float value = (Float) animation.getAnimatedValue(); 

      elements[1].setTranslationX(lateralDistance * value); 
     } 
    }); 

    objAnimatorThree = ValueAnimator.ofFloat(0, 1); 
    objAnimatorThree.setDuration(DURATION * 2); 
    objAnimatorThree.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { 
     @Override 
     public void onAnimationUpdate(ValueAnimator animation) { 
      float value = (Float) animation.getAnimatedValue(); 

      elements[3].setTranslationX((-lateralDistance * 2) * value); 
      elements[3].setTranslationY((float)(-100 * Math.sin(value*Math.PI))); 
     } 
    }); 

    animatorSet = new AnimatorSet(); 
    animatorSet.play(objAnimator).with(objAnimatorThree) 
       .before(objAnimatorTwo); 
    animatorSet.addListener(new Animator.AnimatorListener() { 
     @Override 
     public void onAnimationStart(Animator animation) { 
     } 
     @Override 
     public void onAnimationEnd(Animator animation) { 
      elements[1].layout(elements[1].getLeft() + (int) lateralDistance, 
        elements[1].getTop(), 
        elements[1].getRight() + (int) lateralDistance, 
        elements[1].getBottom()); 

      elements[2].layout(elements[2].getLeft() + (int) lateralDistance, 
        elements[2].getTop(), 
        elements[2].getRight() + (int) lateralDistance, 
        elements[2].getBottom()); 

      elements[3].layout(elements[3].getLeft() + (int)(-lateralDistance * 2), 
        elements[3].getTop(), 
        elements[3].getRight() + (int)(-lateralDistance * 2), 
        elements[3].getBottom()); 

      presetElementArray(); 
      animatorSet.start(); 
     } 
     @Override 
     public void onAnimationCancel(Animator animation) { 
     } 
     @Override 
     public void onAnimationRepeat(Animator animation) { 
     } 
    }); 

이 방법 presetElementArray()

private void presetElementArray() { 
    IndicatorElement temp1 = elements[1]; 
    IndicatorElement temp2 = elements[2]; 
    IndicatorElement temp3 = elements[3]; 

    elements[1] = temp3; 
    elements[2] = temp1; 
    elements[3] = temp2; 
} 

한 사이클이 완료된 후 내가 설정 내가 원을 관리하는 배열 요소를 사용하고 있습니다 : 여기

코드입니다 AnimatorSet의 AnimatorListener에있는 각 요소의 위치입니다. 배열의 요소를 바꿔서 두 번째 사이클에서 다른 anymations를 반복하고 반복합니다. animation slowed and colored

답변

0

시도뿐만 아니라 레이아웃 변경,하지만 요소도 리셋 번역에 :

이것은 결과입니다. 나는 (작은)

몇 가지 팁

은 코드를 더 만들기 위해 ...

onAnimationEnd() 

당신이 요구하지 않은,하지만 난 그게 도움이 될 수 있다고 생각에

elements[i].setTranslationX(0) 

을 의미한다 :

  1. 빈 방법이있는 경우 대신 AnimatorListenerAdapter을 사용하십시오.
  2. ObjectAnimator은 보통 ValueAnimator보다 코드가 빠릅니다.

Android API Guide에서 더 많은 도움말을 찾을 수 있습니다.

나는 예를 들어 코드의 리팩토링을했다 : https://pastebin.com/Fik5F7vQ

+0

좋아, 이건 ... 문제를 해결하고 나는, 감사를 제안 몇 가지를 사용 보인다. –

관련 문제