2016-10-25 11 views
0

textView에서 3 개의 "폭발"텍스트 애니메이션을 연결하여 "준비", "설정"& "가!"라는 세 단어를 차례로 표시하려고합니다. "폭발"은 텍스트 크기가 기본값 인 0.25f에서 기본값 인 1.00f로 이동하는 것을 의미하며 알파 = 0에서 알파 = 1까지입니다.안드로이드 어떻게 textView에서 "폭발"텍스트 애니메이션을 연결?

: 첫 단어 "준비"를 의도대로 "폭발"시킬 수 있지만 다음 단어 "설정"은 "폭발"하지 않습니다. 즉, 텍스트 크기를 전혀 변경하지 않습니다 (알파 부분 만 변경 함). 애니메이션 작품들).

내 MainActivity.java는 다음과 같습니다. 나는 세 번째 "폭발"을 넣지 않았다. 왜냐하면 내가 2 번째로 작동하게 할 수 있다면 그것은 복사의 문제이다. & 붙여 넣기.

import android.animation.Animator; 
import android.animation.AnimatorListenerAdapter; 
import android.animation.AnimatorSet; 
import android.animation.ObjectAnimator; 
import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.util.Log; 
import android.util.TypedValue; 
import android.view.View; 
import android.widget.TextView; 

public class MainActivity extends AppCompatActivity { 

    public void actionExplode(View view) { 

     // .setTextSize() defaults to sp but .getTextSize() defaults to px http://stackoverflow.com/a/3687385/1827488 

     String textReady = "Ready"; 
     final String textSet = "Set"; 
     final String textGo = "Go!"; 

     final TextView questionDisplay = (TextView) findViewById(R.id.textView); 
     final float textSizePx = questionDisplay.getTextSize(); 
     Log.i("actionExplode", "textSizePx=" + textSizePx); 

     final float scaleSmall = 0.25f; 
     float scaleFull = 1.0f; 
     final float fadeOut = 0f; 
     float fadeIn = 1f; 

     questionDisplay.setAlpha(fadeOut); 
     questionDisplay.setText(textReady); 
     questionDisplay.setTextSize(TypedValue.COMPLEX_UNIT_PX, textSizePx * scaleSmall); 
     Log.i("actionExplode", ".getTextSize()=" + questionDisplay.getTextSize()); 

     int animateDurationReadySetGo = 1000; 
     int animateDurationFudge = 100; 

     ObjectAnimator animateReadyFadeIn = ObjectAnimator.ofFloat(questionDisplay, "alpha", fadeOut, fadeIn); 
     animateReadyFadeIn.setDuration(animateDurationReadySetGo); 
     ObjectAnimator animateReadyX = ObjectAnimator.ofFloat(questionDisplay, "scaleX", scaleFull/scaleSmall); 
     animateReadyX.setDuration(animateDurationReadySetGo); 
     ObjectAnimator animateReadyY = ObjectAnimator.ofFloat(questionDisplay, "scaleY", scaleFull/scaleSmall); 
     animateReadyY.setDuration(animateDurationReadySetGo /* + animateDurationFudge */); 
     animateReadyY.addListener(new AnimatorListenerAdapter() { 
      @Override 
      public void onAnimationEnd(Animator animation) { 
       super.onAnimationEnd(animation); 
       Log.i("onAnimationEnd", "before .getTextSize()=" + questionDisplay.getTextSize()); 
       //questionDisplay.setAlpha(fadeOut); 
       questionDisplay.setText(textSet); 
       questionDisplay.setTextSize(TypedValue.COMPLEX_UNIT_PX, textSizePx * scaleSmall); 
       Log.i("onAnimationEnd", "after .getTextSize()=" + questionDisplay.getTextSize()); 
      } 
     }); 

     ObjectAnimator animateSetFadeIn = ObjectAnimator.ofFloat(questionDisplay, "alpha", fadeOut, fadeIn); 
     animateSetFadeIn.setDuration(animateDurationReadySetGo); 
     ObjectAnimator animateSetX = ObjectAnimator.ofFloat(questionDisplay, "scaleX", scaleFull/scaleSmall); 
     animateSetX.setDuration(animateDurationReadySetGo); 
     ObjectAnimator animateSetY = ObjectAnimator.ofFloat(questionDisplay, "scaleY", scaleFull/scaleSmall); 
     animateSetY.setDuration(animateDurationReadySetGo /* + animateDurationFudge */); 
     animateSetY.addListener(new AnimatorListenerAdapter() { 
      @Override 
      public void onAnimationEnd(Animator animation) { 
       super.onAnimationEnd(animation); 
       Log.i("onAnimationEnd", "before .getTextSize()=" + questionDisplay.getTextSize()); 
       //questionDisplay.setAlpha(fadeOut); 
       questionDisplay.setText(textGo); 
       questionDisplay.setTextSize(TypedValue.COMPLEX_UNIT_PX, textSizePx * scaleSmall); 
       Log.i("onAnimationEnd", "after .getTextSize()=" + questionDisplay.getTextSize()); 
      } 
     }); 

     AnimatorSet animateReadySetGo = new AnimatorSet(); 
     animateReadySetGo.playTogether(animateReadyX, animateReadyY, animateReadyFadeIn); 
     animateReadySetGo.playTogether(animateSetX, animateSetY, animateSetFadeIn); 
     animateReadySetGo.playSequentially(animateReadyY, animateSetY); 
     animateReadySetGo.start(); 
    } 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
    } 
} 

로그에 표시되는 내용입니다. 왜 이해가 안되나요? 1) "before"라인이 175.0을 보여야 할 때 43.75를 표시하는 이유는 무엇입니까? 2) 왜 "after"라인이 43.75를 보여 주지만 텍스트 크기가 줄어들지 않는지?

I/actionExplode: textSizePx=175.0 
I/actionExplode: .getTextSize()=43.75 
I/onAnimationEnd: before .getTextSize()=43.75 
I/onAnimationEnd: after .getTextSize()=43.75 
I/onAnimationEnd: before .getTextSize()=43.75 
I/onAnimationEnd: after .getTextSize()=43.75 

내 activity_main.xml :

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:id="@+id/activity_main" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:paddingBottom="@dimen/activity_vertical_margin" 
    android:paddingLeft="@dimen/activity_horizontal_margin" 
    android:paddingRight="@dimen/activity_horizontal_margin" 
    android:paddingTop="@dimen/activity_vertical_margin" 
    tools:context="com.plaudev.explodingtext.MainActivity"> 

    <TextView 
     android:layout_width="match_parent" 
     android:layout_height="100dp" 
     android:text="@string/textView" 
     android:id="@+id/textView" 
     android:fontFamily="casual" 
     android:textSize="50sp" 
     android:textStyle="normal|bold" 
     android:textAlignment="center" 
     android:gravity="center" /> 

    <Button 
     android:text="@string/button" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_below="@+id/textView" 
     android:layout_centerHorizontal="true" 
     android:layout_marginTop="50dp" 
     android:id="@+id/button" 
     android:background="@color/colourTransparent" 
     android:textAllCaps="false" 
     android:textSize="25sp" 
     android:textStyle="normal|bold" 
     android:fontFamily="casual" 
     android:onClick="actionExplode" 
     android:textColor="@android:color/holo_green_dark" /> 
</RelativeLayout> 

업데이트 1 : 아직도 못 찾았 솔루션 그러나이 동작을 주목하고 싶다. actionExplode()을 재귀 적으로 다시 작성하고 onClick으로 다른 것을 사용하여 MainActivity 클래스를 다음과 같이 시작하면 3 개의 "폭발"체인을 얻을 수 있지만 그림과 같이 연속적으로 작은 텍스트 크기로 시작합니다 아래의 추가 로그. 어쨌든 콘센트를 questionDisplayfinal으로 만들면 청취자 나 타이머가 연쇄 애니메이션을 사용하여 콘센트에서 텍스트 크기를 유지할 수 있지만 그래도 텍스트를 변경할 수는 있습니다 (즉, 선택적으로 final). 따라서 나는 또한 몇 가지 변화를 시도 (코드 주석에서 언급 한 바와 같이)하지만 그들 중 누구도 변화 A.보다 가까이 의도 된 행동을 나에게 얻을

업데이트 된 위의 코드는이 로그 생성
public class MainActivity extends AppCompatActivity { 

    String[] explosionChain = {"Ready", "Set", "Go!"}; 
    int explosionIndex = 0; 
    int animateDurationExplosion = 1000; 
    int animateDurationFudge = 100; 

    public void actionExplode(final float textSizeFullPx, final int explosionIndex) { 

     final TextView questionDisplay = (TextView) findViewById(R.id.textView); 
     float textSizePx = questionDisplay.getTextSize(); 
     Log.i("actionExplode", "textSizeFullPx=" + textSizeFullPx + ", explosionIndex=" + explosionIndex + ", textSizePx=" + textSizePx); 

     float scaleSmall = 0.25f; 
     float scaleFull = 1.0f; 
     float fadeOut = 0f; 
     float fadeIn = 1f; 

     questionDisplay.setAlpha(fadeOut); 
     questionDisplay.setText(explosionChain[explosionIndex]); 
     // variation A 
     //questionDisplay.setTextSize(TypedValue.COMPLEX_UNIT_PX, textSizeFullPx * scaleSmall); 
     // variation B 
     questionDisplay.setTextSize(TypedValue.COMPLEX_UNIT_PX, textSizePx * scaleSmall); 
     Log.i("actionExplode", ".getTextSize()=" + questionDisplay.getTextSize()); 

     ObjectAnimator animateFadeIn = ObjectAnimator.ofFloat(questionDisplay, "alpha", fadeOut, fadeIn); 
     animateFadeIn.setDuration(animateDurationExplosion); 
     ObjectAnimator animateScaleX = ObjectAnimator.ofFloat(questionDisplay, "scaleX", scaleFull/scaleSmall); 
     animateScaleX.setDuration(animateDurationExplosion); 
     ObjectAnimator animateScaleY = ObjectAnimator.ofFloat(questionDisplay, "scaleY", scaleFull/scaleSmall); 
     animateScaleY.setDuration(animateDurationExplosion /* + animateDurationFudge */); 

     AnimatorSet animateExplosion = new AnimatorSet(); 
     animateExplosion.playTogether(animateScaleX, animateScaleY, animateFadeIn); 
     animateExplosion.start(); 

     CountDownTimer explodeNext = new CountDownTimer(animateDurationExplosion, animateDurationExplosion) { 
      @Override 
      public void onTick(long millisUntilFinished) { 
      } 
      @Override 
      public void onFinish() { 
       // variation C 
       Log.i("onFinish", ".getTextSize()=" + questionDisplay.getTextSize()); 
       // variation D 
       //Log.i("onFinish", "before .getTextSize()=" + questionDisplay.getTextSize()); 
       //questionDisplay.setTextSize(TypedValue.COMPLEX_UNIT_PX, textSizeFullPx); 
       //Log.i("onFinish", "after .getTextSize()=" + questionDisplay.getTextSize()); 
       if ((explosionIndex + 1) < explosionChain.length) { 
        actionExplode(textSizeFullPx, explosionIndex + 1); 
       } 
      } 
     }; 
     explodeNext.start(); 
    } 

    public void startChainExplosion(View view) { 

     final TextView questionDisplay = (TextView) findViewById(R.id.textView); 
     final float textSizeFullPx = questionDisplay.getTextSize(); 
     Log.i("startChainExplosion", "explosionIndex=" + explosionIndex + ", textSizeFullPx=" + textSizeFullPx); 

     actionExplode(textSizeFullPx, explosionIndex); 

    } 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
    } 
} 

:

I/startChainExplosion: explosionIndex=0, textSizeFullPx=175.0 
I/actionExplode: textSizeFullPx=175.0, explosionIndex=0, textSizePx=175.0 
I/actionExplode: .getTextSize()=43.75 
I/onFinish: .getTextSize()=43.75 
I/actionExplode: textSizeFullPx=175.0, explosionIndex=1, textSizePx=43.75 
I/actionExplode: .getTextSize()=10.9375 
I/onFinish: .getTextSize()=10.9375 
I/actionExplode: textSizeFullPx=175.0, explosionIndex=2, textSizePx=10.9375 
I/actionExplode: .getTextSize()=2.734375 
I/onFinish: .getTextSize()=2.734375 

업데이트 2 : @ Xaver의 조언에 따라 onClick으로 사용해 보았습니다. 하지만 그 결과는 나의 초기 시도와 동일합니다. 즉 "Ready"는 폭발하지만 "Set"과 "Go!" 하지마. 더욱이, 텍스트 크기는 모든 애니메이션이 완료된 후 실제로 크기가 커집니다 (175px * 4로 추측). 업데이트 된 코드 & 로그는 다음과 같습니다. 이 텍스트 크기 유지 문제가 발생하지 않도록 textView를 사용하려면 각 단어가 필요하다는 느낌이 들었습니다.

public void explodeSequentially(View view) { 

     String textReady = "Ready"; 
     final String textSet = "Set"; 
     final String textGo = "Go!"; 

     final TextView questionDisplay = (TextView) findViewById(R.id.textView); 
     float textSizePx = questionDisplay.getTextSize(); 
     Log.i("explodeSequentially", "textSizePx=" + textSizePx); 

     float scaleSmall = 0.25f; 
     float scaleFull = 1.0f; 
     float fadeOut = 0f; 
     float fadeIn = 1f; 

     questionDisplay.setAlpha(fadeOut); 
     questionDisplay.setText(textReady); 
     questionDisplay.setTextSize(TypedValue.COMPLEX_UNIT_PX, textSizePx * scaleSmall); 
     Log.i("explodeSequentially", ".getTextSize()=" + questionDisplay.getTextSize()); 

     ObjectAnimator animateReadyFadeIn = ObjectAnimator.ofFloat(questionDisplay, "alpha", fadeOut, fadeIn); 
     animateReadyFadeIn.setDuration(animateDurationExplosion); 
     ObjectAnimator animateReadyX = ObjectAnimator.ofFloat(questionDisplay, "scaleX", scaleFull/scaleSmall); 
     animateReadyX.setDuration(animateDurationExplosion); 
     ObjectAnimator animateReadyY = ObjectAnimator.ofFloat(questionDisplay, "scaleY", scaleFull/scaleSmall); 
     animateReadyY.setDuration(animateDurationExplosion /* + animateDurationFudge */); 
     animateReadyY.addListener(new AnimatorListenerAdapter() { 
      @Override 
      public void onAnimationEnd(Animator animation) { 
       super.onAnimationEnd(animation); 
       Log.i("onAnimationEnd", "before .getTextSize()=" + questionDisplay.getTextSize()); 
       //questionDisplay.setAlpha(fadeOut); 
       questionDisplay.setText(textSet); 
       //questionDisplay.setTextSize(TypedValue.COMPLEX_UNIT_PX, textSizePx * scaleSmall); 
       //Log.i("onAnimationEnd", "after .getTextSize()=" + questionDisplay.getTextSize()); 
      } 
     }); 
     AnimatorSet animateReady = new AnimatorSet(); 
     animateReady.playTogether(animateReadyX, animateReadyY, animateReadyFadeIn); 

     ObjectAnimator animateSetFadeIn = ObjectAnimator.ofFloat(questionDisplay, "alpha", fadeOut, fadeIn); 
     animateSetFadeIn.setDuration(animateDurationExplosion); 
     ObjectAnimator animateSetX = ObjectAnimator.ofFloat(questionDisplay, "scaleX", scaleFull/scaleSmall); 
     animateSetX.setDuration(animateDurationExplosion); 
     ObjectAnimator animateSetY = ObjectAnimator.ofFloat(questionDisplay, "scaleY", scaleFull/scaleSmall); 
     animateSetY.setDuration(animateDurationExplosion /* + animateDurationFudge */); 
     animateSetY.addListener(new AnimatorListenerAdapter() { 
      @Override 
      public void onAnimationEnd(Animator animation) { 
       super.onAnimationEnd(animation); 
       Log.i("onAnimationEnd", "before .getTextSize()=" + questionDisplay.getTextSize()); 
       //questionDisplay.setAlpha(fadeOut); 
       questionDisplay.setText(textGo); 
       //questionDisplay.setTextSize(TypedValue.COMPLEX_UNIT_PX, textSizePx * scaleSmall); 
       //Log.i("onAnimationEnd", "after .getTextSize()=" + questionDisplay.getTextSize()); 
      } 
     }); 
     AnimatorSet animateSet = new AnimatorSet(); 
     animateSet.playTogether(animateSetX, animateSetY, animateSetFadeIn); 

     ObjectAnimator animateGoFadeIn = ObjectAnimator.ofFloat(questionDisplay, "alpha", fadeOut, fadeIn); 
     animateGoFadeIn.setDuration(animateDurationExplosion); 
     ObjectAnimator animateGoX = ObjectAnimator.ofFloat(questionDisplay, "scaleX", scaleFull/scaleSmall); 
     animateGoX.setDuration(animateDurationExplosion); 
     ObjectAnimator animateGoY = ObjectAnimator.ofFloat(questionDisplay, "scaleY", scaleFull/scaleSmall); 
     animateGoY.setDuration(animateDurationExplosion /* + animateDurationFudge */); 
     animateGoY.addListener(new AnimatorListenerAdapter() { 
      @Override 
      public void onAnimationEnd(Animator animation) { 
       super.onAnimationEnd(animation); 
       Log.i("onAnimationEnd", "before .getTextSize()=" + questionDisplay.getTextSize()); 
       //questionDisplay.setAlpha(fadeOut); 
       questionDisplay.setText("Here is the question!"); 
       //questionDisplay.setTextSize(TypedValue.COMPLEX_UNIT_PX, textSizePx * scaleSmall); 
       //Log.i("onAnimationEnd", "after .getTextSize()=" + questionDisplay.getTextSize()); 
      } 
     }); 
     AnimatorSet animateGo = new AnimatorSet(); 
     animateGo.playTogether(animateGoX, animateGoY, animateGoFadeIn); 

     AnimatorSet animateReadySetGo = new AnimatorSet(); 
     animateReadySetGo.playSequentially(animateReady, animateSet, animateGo); 
     animateReadySetGo.start(); 
    } 

그리고

I/explodeSequentially: textSizePx=175.0 
I/explodeSequentially: .getTextSize()=43.75 
I/onAnimationEnd: before .getTextSize()=43.75 
I/onAnimationEnd: before .getTextSize()=43.75 
I/onAnimationEnd: before .getTextSize()=43.75 
+0

문제는 당신'AnimatorSet'입니다. 애니메이션을 주문할 때 'AnimatorSet'이 얼마나 똑똑한지를 너무 많이 과소 평가하고 있습니다. 좀 더 뻔뻔스럽게 말하면 : AnimatorSet은 당신에게 아무런 도움이되지 않습니다. 만약 당신이 그것을 병렬로 실행하기 위해 두 번 말하면, 순차적으로 실행하도록 지시하면 모든 애니메이션이 동시에 실행되고 그 다음에는 순차적 호출에서 참조되는 두 번째 애니메이션이 다시 실행됩니다. –

+0

당신이해야 할 일은 애니메이션의 각 단계에 대해 세 개의 'AnimatorSet' 인스턴스를 생성 한 다음이 AnimatorSet을 다른 AnimatorSet에서 순차적으로 실행하는 것입니다. –

+0

@ Xaver, thx하지만 여전히 의도 된 동작을 얻지 못했습니다. – rockhammer

답변

0

내 의심 로그는 정확했다. textView의 문자 크기는 콘센트에 final을 사용하는 경우 언제나 생기고 애니메이션을 연결하려면 피할 수없는 것처럼 보입니다. 그러나 내가 "폭발"하고 싶은 단어를 각각 textView으로 나눠서 적어도 의도 한대로 순차적으로 작동하도록 "폭발"효과를 얻을 수 있습니다.

다음 코드는 의도 한 애니메이션 시퀀스를 한 번만 수행합니다. 즉, 다음 번에 버튼을 클릭하면 애니메이션 시퀀스는 처음 175.0px 대신 43.75px에서 시작하여 0.25f 인수로 계속 감소합니다 클릭하는 시간.&을 동적으로 생성하는 코드를 수정하여 그 주위에서 나중에으로 업데이트되는 을 해결하려고 textView을 파괴하십시오.

새로운 MainActivity.java :

public class MainActivity extends AppCompatActivity { 

    public void explodeThreeTextViews (View view) { 

     int animateDurationExplosion = 1000; 
     float scaleSmall = 0.25f; 
     float scaleFull = 1.0f; 
     float fadeOut = 0f; 
     final float fadeIn = 1f; 

     final TextView tvQuestion = (TextView) findViewById(R.id.question); 
     final TextView tvReady = (TextView) findViewById(R.id.ready); 
     final TextView tvSet = (TextView) findViewById(R.id.set); 
     final TextView tvGo = (TextView) findViewById(R.id.go); 

     float tvReadySizePx = tvReady.getTextSize(); 
     float tvSetSizePx = tvSet.getTextSize(); 
     float tvGoSizePx = tvGo.getTextSize(); 
     Log.i("explodeThreeTextViews", "tvReadySizePx=" + tvReadySizePx + ", tvSetSizePx=" + tvSetSizePx + ", tvGoSizePx=" + tvGoSizePx); 

     tvQuestion.setAlpha(fadeOut); 
     tvReady.setAlpha(fadeOut); 
     tvSet.setAlpha(fadeOut); 
     tvGo.setAlpha(fadeOut); 

     tvQuestion.setText("The question!"); 
     tvReady.setText("Ready"); 
     tvSet.setText("Set"); 
     tvGo.setText("Go!"); 

     tvQuestion.setVisibility(View.GONE); 
     tvReady.setVisibility(View.VISIBLE); 

     tvReady.setTextSize(TypedValue.COMPLEX_UNIT_PX, tvReadySizePx * scaleSmall); 
     tvSet.setTextSize(TypedValue.COMPLEX_UNIT_PX, tvSetSizePx * scaleSmall); 
     tvGo.setTextSize(TypedValue.COMPLEX_UNIT_PX, tvGoSizePx * scaleSmall); 
     Log.i("explodeThreeTextViews", "tvReady.getTextSize=" + tvReady.getTextSize() + ", tvSet.getTextSize=" + tvSet.getTextSize() + ", tvGo.getTextSize=" + tvGo.getTextSize()); 

     ObjectAnimator animateReadyFadeIn = ObjectAnimator.ofFloat(tvReady, "alpha", fadeOut, fadeIn); 
     animateReadyFadeIn.setDuration(animateDurationExplosion); 
     ObjectAnimator animateReadyX = ObjectAnimator.ofFloat(tvReady, "scaleX", scaleFull/scaleSmall); 
     animateReadyX.setDuration(animateDurationExplosion); 
     ObjectAnimator animateReadyY = ObjectAnimator.ofFloat(tvReady, "scaleY", scaleFull/scaleSmall); 
     animateReadyY.setDuration(animateDurationExplosion /* + animateDurationFudge */); 
     animateReadyY.addListener(new AnimatorListenerAdapter() { 
      @Override 
      public void onAnimationEnd(Animator animation) { 
       super.onAnimationEnd(animation); 
       Log.i("onAnimationEnd", "tvReady.getTextSize()=" + tvReady.getTextSize()); 
       //questionDisplay.setAlpha(fadeOut); 
       tvReady.setVisibility(View.GONE); 
       tvSet.setVisibility(View.VISIBLE); 
       //questionDisplay.setTextSize(TypedValue.COMPLEX_UNIT_PX, textSizePx * scaleSmall); 
       //Log.i("onAnimationEnd", "after .getTextSize()=" + questionDisplay.getTextSize()); 
      } 
     }); 
     AnimatorSet animateReady = new AnimatorSet(); 
     animateReady.playTogether(animateReadyX, animateReadyY, animateReadyFadeIn); 

     ObjectAnimator animateSetFadeIn = ObjectAnimator.ofFloat(tvSet, "alpha", fadeOut, fadeIn); 
     animateSetFadeIn.setDuration(animateDurationExplosion); 
     ObjectAnimator animateSetX = ObjectAnimator.ofFloat(tvSet, "scaleX", scaleFull/scaleSmall); 
     animateSetX.setDuration(animateDurationExplosion); 
     ObjectAnimator animateSetY = ObjectAnimator.ofFloat(tvSet, "scaleY", scaleFull/scaleSmall); 
     animateSetY.setDuration(animateDurationExplosion /* + animateDurationFudge */); 
     animateSetY.addListener(new AnimatorListenerAdapter() { 
      @Override 
      public void onAnimationEnd(Animator animation) { 
       super.onAnimationEnd(animation); 
       Log.i("onAnimationEnd", "tvSet.getTextSize()=" + tvSet.getTextSize()); 
       //questionDisplay.setAlpha(fadeOut); 
       tvSet.setVisibility(View.GONE); 
       tvGo.setVisibility(View.VISIBLE); 
       //questionDisplay.setTextSize(TypedValue.COMPLEX_UNIT_PX, textSizePx * scaleSmall); 
       //Log.i("onAnimationEnd", "after .getTextSize()=" + questionDisplay.getTextSize()); 
      } 
     }); 
     AnimatorSet animateSet = new AnimatorSet(); 
     animateSet.playTogether(animateSetX, animateSetY, animateSetFadeIn); 

     ObjectAnimator animateGoFadeIn = ObjectAnimator.ofFloat(tvGo, "alpha", fadeOut, fadeIn); 
     animateGoFadeIn.setDuration(animateDurationExplosion); 
     ObjectAnimator animateGoX = ObjectAnimator.ofFloat(tvGo, "scaleX", scaleFull/scaleSmall); 
     animateGoX.setDuration(animateDurationExplosion); 
     ObjectAnimator animateGoY = ObjectAnimator.ofFloat(tvGo, "scaleY", scaleFull/scaleSmall); 
     animateGoY.setDuration(animateDurationExplosion /* + animateDurationFudge */); 
     animateGoY.addListener(new AnimatorListenerAdapter() { 
      @Override 
      public void onAnimationEnd(Animator animation) { 
       super.onAnimationEnd(animation); 
       Log.i("onAnimationEnd", "tvGo.getTextSize()=" + tvGo.getTextSize()); 
       //questionDisplay.setAlpha(fadeOut); 
       tvGo.setVisibility(View.GONE); 
       tvQuestion.setVisibility(View.VISIBLE); 
       tvQuestion.setAlpha(fadeIn); 
       //questionDisplay.setTextSize(TypedValue.COMPLEX_UNIT_PX, textSizePx * scaleSmall); 
       //Log.i("onAnimationEnd", "after .getTextSize()=" + questionDisplay.getTextSize()); 
      } 
     }); 
     AnimatorSet animateGo = new AnimatorSet(); 
     animateGo.playTogether(animateGoX, animateGoY, animateGoFadeIn); 

     AnimatorSet animateReadySetGo = new AnimatorSet(); 
     animateReadySetGo.playSequentially(animateReady, animateSet, animateGo); 
     animateReadySetGo.start(); 
    } 

@Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
    } 
} 

새로운 activity_main.xml :

I/explodeThreeTextViews: tvReadySizePx=175.0, tvSetSizePx=175.0, tvGoSizePx=175.0 
I/explodeThreeTextViews: tvReady.getTextSize=43.75, tvSet.getTextSize=43.75, tvGo.getTextSize=43.75 
I/onAnimationEnd: tvReady.getTextSize()=43.75 
I/onAnimationEnd: tvSet.getTextSize()=43.75 
I/onAnimationEnd: tvGo.getTextSize()=43.75 

업데이트 : 동적으로

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:id="@+id/activity_main" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:paddingBottom="@dimen/activity_vertical_margin" 
    android:paddingLeft="@dimen/activity_horizontal_margin" 
    android:paddingRight="@dimen/activity_horizontal_margin" 
    android:paddingTop="@dimen/activity_vertical_margin" 
    tools:context="com.plaudev.explodingtext.MainActivity"> 

    <LinearLayout 
     android:orientation="vertical" 
     android:layout_width="match_parent" 
     android:layout_height="200dp" 
     android:id="@+id/questionDisplay"> 

     <TextView 
      android:layout_width="match_parent" 
      android:layout_height="100dp" 
      android:text="@string/textView" 
      android:id="@+id/question" 
      android:fontFamily="casual" 
      android:textSize="50sp" 
      android:textStyle="normal|bold" 
      android:textAlignment="center" 
      android:gravity="center" 
      android:layout_weight="1"/> 

     <TextView 
      android:layout_width="match_parent" 
      android:layout_height="100dp" 
      android:text="@string/textView" 
      android:id="@+id/ready" 
      android:fontFamily="casual" 
      android:textSize="50sp" 
      android:textStyle="normal|bold" 
      android:textAlignment="center" 
      android:gravity="center" 
      android:layout_weight="1" 
      android:visibility="gone"/> 

     <TextView 
      android:layout_width="match_parent" 
      android:layout_height="100dp" 
      android:text="@string/textView" 
      android:id="@+id/set" 
      android:fontFamily="casual" 
      android:textSize="50sp" 
      android:textStyle="normal|bold" 
      android:textAlignment="center" 
      android:gravity="center" 
      android:layout_weight="1" 
      android:visibility="gone"/> 

     <TextView 
      android:layout_width="match_parent" 
      android:layout_height="100dp" 
      android:text="@string/textView" 
      android:id="@+id/go" 
      android:fontFamily="casual" 
      android:textSize="50sp" 
      android:textStyle="normal|bold" 
      android:textAlignment="center" 
      android:gravity="center" 
      android:layout_weight="1" 
      android:visibility="gone"/> 

     <Button 
      android:text="@string/button" 
      android:layout_width="match_parent" 
      android:layout_height="50dp" 
      android:id="@+id/button" 
      android:background="@color/colourTransparent" 
      android:textAllCaps="false" 
      android:textSize="25sp" 
      android:textStyle="normal|bold" 
      android:fontFamily="casual" 
      android:onClick="explodeThreeTextViews" 
      android:textColor="@android:color/holo_green_dark" 
      android:layout_weight="1" /> 

    </LinearLayout> 

</RelativeLayout> 

로그이 프로그램을 실행할 때 반복을 가능하게하기 위해 & 개의보기가 생성되었습니다. 이전에 시도한 재귀 적 방법에 기반한 ated 사용. - 일부 중복 textViews 전에 코드를 사용하여 이전 버전과의 호환성을 위해 유지

public class MainActivity extends AppCompatActivity { 

    // constants 
    String[] explosionChain = {"Ready", "Set", "Go!"}; 
    float scaleSmall = 0.25f; 
    float scaleFull = 1.0f; 
    float fadeOut = 0f; 
    float fadeIn = 1f; 
    int animateDurationExplosion = 1000; 
    int animateDurationFudge = 100; 

    // variables 
    float textSizeFullPx; 
    TextView[] explosionViews; 
    int explosionIndex; 

    public void prepareChainExplosions(View view) { 

     //String typeface = "casual"; 

     LinearLayout questionDisplay = (LinearLayout) findViewById(R.id.questionDisplay); 
     TextView questionView = (TextView) findViewById(R.id.questionView); 
     textSizeFullPx = questionView.getTextSize(); 
     Log.i("prepareChainExplosions", "textSizeFullPx=" + textSizeFullPx); 

     explosionViews = new TextView[explosionChain.length]; 
     for (int i = 0; i < explosionViews.length; i++) { 
      explosionViews[i] = new TextView(questionDisplay.getContext()); 
      explosionViews[i].setVisibility(View.GONE); 
      explosionViews[i].setAlpha(fadeOut); 
      //explosionViews[i].setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT, 1f)); 
      explosionViews[i].setLayoutParams(questionView.getLayoutParams()); 
      //explosionViews[i].setGravity(Gravity.CENTER); 
      explosionViews[i].setGravity(questionView.getGravity()); 
      //explosionViews[i].setTypeface(Typeface.create(typeface, Typeface.BOLD)); 
      explosionViews[i].setTypeface(questionView.getTypeface()); 
      explosionViews[i].setTextSize(TypedValue.COMPLEX_UNIT_PX, textSizeFullPx); 
      explosionViews[i].setText(explosionChain[i]); 
      questionDisplay.addView(explosionViews[i]); 
     } 
     Log.i("prepareChainExplosions", "questionDisplay.getChildCount()=" + questionDisplay.getChildCount()); 
    } 

public void actionExplode(final int explosionIndex) { 

     final TextView questionView = (TextView) findViewById(R.id.questionView); 
     final TextView explodingView = explosionViews[explosionIndex]; 
     float textSizePx = explodingView.getTextSize(); 
     Log.i("actionExplode", "explosionIndex=" + explosionIndex + ", textSizePx=" + textSizePx); 

     explodingView.setTextSize(TypedValue.COMPLEX_UNIT_PX, textSizePx * scaleSmall); 
     Log.i("actionExplode", ".getTextSize()=" + explodingView.getTextSize()); 

     if (explosionIndex == 0) questionView.setVisibility(View.GONE); 
     explodingView.setVisibility(View.VISIBLE); 

     ObjectAnimator animateFadeIn = ObjectAnimator.ofFloat(explodingView, "alpha", fadeOut, fadeIn); 
     animateFadeIn.setDuration(animateDurationExplosion); 
     ObjectAnimator animateScaleX = ObjectAnimator.ofFloat(explodingView, "scaleX", scaleFull/scaleSmall); 
     animateScaleX.setDuration(animateDurationExplosion); 
     ObjectAnimator animateScaleY = ObjectAnimator.ofFloat(explodingView, "scaleY", scaleFull/scaleSmall); 
     animateScaleY.setDuration(animateDurationExplosion /* + animateDurationFudge */); 
     animateScaleY.addListener(new AnimatorListenerAdapter() { 
      @Override 
      public void onAnimationEnd(Animator animation) { 
       super.onAnimationEnd(animation); 
       Log.i("onAnimationEnd", ".getTextSize()=" + explodingView.getTextSize()); 
       explodingView.setVisibility(View.GONE); 
       if ((explosionIndex + 1) < explosionChain.length) { 
        actionExplode(explosionIndex + 1); 
       } else { 
        questionView.setVisibility(View.VISIBLE); 
       } 
      } 
     }); 

     AnimatorSet animateExplosion = new AnimatorSet(); 
     animateExplosion.playTogether(animateScaleX, animateScaleY, animateFadeIn); 
     animateExplosion.start(); 

     /* 
     CountDownTimer explodeNext = new CountDownTimer(animateDurationExplosion, animateDurationExplosion) { 
      @Override 
      public void onTick(long millisUntilFinished) { 
      } 
      @Override 
      public void onFinish() { 
       Log.i("onFinish", ".getTextSize()=" + explodingView.getTextSize()); 
       explodingView.setVisibility(View.GONE); 
       if ((explosionIndex + 1) < explosionChain.length) { 
        actionExplode(explosionIndex + 1); 
       } else { 
        questionView.setVisibility(View.VISIBLE); 
       } 
      } 
     }; 
     explodeNext.start(); 
     */ 
    } 

    public void startChainExplosions(View view) { 

     prepareChainExplosions(view); 
     explosionIndex = 0; 
     Log.i("startChainExplosions", "explosionIndex=" + explosionIndex); 

     actionExplode(explosionIndex); 

     CountDownTimer cleanChainExplosions = new CountDownTimer(animateDurationExplosion * explosionChain.length, animateDurationExplosion) { 
      @Override 
      public void onTick(long millisUntilFinished) { 
      } 
      @Override 
      public void onFinish() { 
       for (int i = 0; i < explosionViews.length; i++) { 
        ((ViewManager) explosionViews[i].getParent()).removeView(explosionViews[i]); 
       } 
       LinearLayout questionDisplay = (LinearLayout) findViewById(R.id.questionDisplay); 
       Log.i("startChainExplosions", "questionDisplay.getChildCount()=" + questionDisplay.getChildCount()); 
      } 
     }; 
     cleanChainExplosions.start(); 
    } 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
    } 
} 

업데이트 activity_main.xml : - MainActivity.java 업데이트

당신은 체인에 "폭발"애니메이션 리스너 또는 CountDownTimer를 사용하여 선택할 수 있습니다.

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:id="@+id/activity_main" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:paddingBottom="@dimen/activity_vertical_margin" 
    android:paddingLeft="@dimen/activity_horizontal_margin" 
    android:paddingRight="@dimen/activity_horizontal_margin" 
    android:paddingTop="@dimen/activity_vertical_margin" 
    tools:context="com.plaudev.explodingtext.MainActivity"> 

    <LinearLayout 
     android:orientation="vertical" 
     android:layout_width="match_parent" 
     android:layout_height="200dp" 
     android:id="@+id/questionDisplay"> 

     <TextView 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      android:text="@string/textView" 
      android:id="@+id/questionView" 
      android:fontFamily="casual" 
      android:textSize="50sp" 
      android:textStyle="normal|bold" 
      android:layout_weight="1" 
      android:gravity="center" /> 

     <TextView 
      android:layout_width="match_parent" 
      android:layout_height="100dp" 
      android:text="@string/textView" 
      android:id="@+id/readyView" 
      android:fontFamily="casual" 
      android:textSize="50sp" 
      android:textStyle="normal|bold" 
      android:textAlignment="center" 
      android:gravity="center" 
      android:layout_weight="1" 
      android:visibility="gone"/> 

     <TextView 
      android:layout_width="match_parent" 
      android:layout_height="100dp" 
      android:text="@string/textView" 
      android:id="@+id/setView" 
      android:fontFamily="casual" 
      android:textSize="50sp" 
      android:textStyle="normal|bold" 
      android:textAlignment="center" 
      android:gravity="center" 
      android:layout_weight="1" 
      android:visibility="gone"/> 

     <TextView 
      android:layout_width="match_parent" 
      android:layout_height="100dp" 
      android:text="@string/textView" 
      android:id="@+id/goView" 
      android:fontFamily="casual" 
      android:textSize="50sp" 
      android:textStyle="normal|bold" 
      android:textAlignment="center" 
      android:gravity="center" 
      android:layout_weight="1" 
      android:visibility="gone"/> 

    </LinearLayout> 

    <Button 
     android:text="@string/button" 
     android:layout_width="match_parent" 
     android:layout_height="50dp" 
     android:id="@+id/button" 
     android:background="@color/colourTransparent" 
     android:textAllCaps="false" 
     android:textSize="25sp" 
     android:textStyle="normal|bold" 
     android:fontFamily="casual" 
     android:onClick="startChainExplosions" 
     android:textColor="@android:color/holo_green_dark" 
     android:layout_below="@+id/questionDisplay" 
     android:layout_alignParentLeft="true" 
     android:layout_alignParentStart="true" /> 

</RelativeLayout> 

업데이트 로그 :

I/prepareChainExplosions: textSizeFullPx=175.0 
I/prepareChainExplosions: questionDisplay.getChildCount()=7 
I/startChainExplosions: explosionIndex=0 
I/actionExplode: explosionIndex=0, textSizePx=175.0 
I/actionExplode: .getTextSize()=43.75 
I/onAnimationEnd: .getTextSize()=43.75 
I/actionExplode: explosionIndex=1, textSizePx=175.0 
I/actionExplode: .getTextSize()=43.75 
I/onAnimationEnd: .getTextSize()=43.75 
I/actionExplode: explosionIndex=2, textSizePx=175.0 
I/actionExplode: .getTextSize()=43.75 
I/startChainExplosions: questionDisplay.getChildCount()=4 
I/onAnimationEnd: .getTextSize()=43.75