Error al intentar crear revelación circular: IllegalStateException: no se puede iniciar esta animación en una vista separada

Por lo tanto, estoy experimentando tratando de crear una revelación circular en el API de nivel 21 en un TextView, pero sigo recibiendo este error. Al principio pensé que tenía algo que ver con el ciclo de vida del fragmento que estaba intentando pero luego intenté lo mismo en una actividad y todavía no funcionaría.

Aquí está el código:

public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Window w = getWindow(); w.setFlags( WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS, WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS); w.setStatusBarColor(Color.parseColor("#0277bd")); setContentView(R.layout.activity_main); TextView tv = (TextView) findViewById(R.id.text); int a = (tv.getLeft() + tv.getRight()) / 2; int b = (tv.getTop() + tv.getBottom()) / 2; int radius = tv.getWidth(); Animator anim = ViewAnimationUtils.createCircularReveal(tv, a, b, 0, radius); anim.start(); } @Override public boolean onCreateOptionsMenu(Menu menu) { return super.onCreateOptionsMenu(menu); } } 

Todavía es temprano, así que no puedo encontrar respuestas sobre esto. ¿Algunas ideas?

Usted está recibiendo el error porque la vista que pasó en no se ha medido y presentado en la pantalla todavía. ViewAnimationUtils.createCircularReveal necesita que la vista de destino se mida para calcular la animación. También encontrará que sus variables a y b son siempre 0.

Si desea experimentar, cree la animación y iníciela en un oyente de clic de botón. He aquí un ejemplo de uso de su código:

 Button button = (Button) findViewById(R.id.your_button); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { TextView tv = (TextView) findViewById(R.id.text); int a = (tv.getLeft() + tv.getRight()) / 2; int b = (tv.getTop() + tv.getBottom()) / 2; int radius = tv.getWidth(); Animator anim = ViewAnimationUtils.createCircularReveal(tv, a, b, 0, radius); anim.start(); } }); 

Puede utilizar Runnable para hacer la animación. Runnable se ejecutará después de la creación de la vista. No es necesario publicar la demora.

 view.post(new Runnable() { @Override public void run(){ //create your anim here } }); 

O usted puede hacer esto.

  tv.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { @Override public void onGlobalLayout() { if (android.os.Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN) { tv.getViewTreeObserver().removeGlobalOnLayoutListener(this); } else { tv.getViewTreeObserver().removeOnGlobalLayoutListener(this); } Animator anim = ViewAnimationUtils.createCircularReveal(tv, a, b, 0, radius); anim.start(); } }); 

La adición de GlobalLayoutListener para esperar a que la vista se inflara funcionó para mí.

Llame a su lógica Animator de onResume() . De esta manera usted estará seguro de que todas las vistas se han adjuntado en el diseño.

O usted puede hacer esto.

  tv.postDelayed(new Runnable() { @Override public void run() { //start your animation here } }, 1000); 
  • Android colorControlNormal atributos xml no funciona antes de Lollipop
  • ¿Cómo puedo excluir ActionBar cuando las transiciones entre Actividades en Android 5.0
  • ¿El icono del logotipo de la barra de herramientas se puede hacer clic?
  • Cambiar el tinte de los iconos de la barra de estado
  • Aclaración sobre Android "La elevación de atributo se utiliza sólo en el nivel API 21 y superior"
  • Obstáculos extraños al hacer que los botones parezcan Spinners en API 21
  • Material Diseño Transparente ActionBar
  • Cómo centrar el menú de acciones en la barra de herramientas
  • Android Ripple Effect + Elevación en las vistas que no son de botón
  • Las ondulaciones no se muestran con selectableItemBackground como primer plano en un CardView con un dispositivo Android 5.0
  • ¿Existe alguna manera de conectarse a un dispositivo Bluetooth Low Energy bajo Android 5 exponiendo la dirección estática pública?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.