La animación de diseño no funciona en la primera ejecución
Tengo una actividad con una lista de elementos y al hacer clic en un elemento, quiero que los controles de reproducción de ese elemento se deslicen desde la parte inferior de la pantalla y se vuelvan visibles. He definido un conjunto de animación para la diapositiva y la diapositiva hacia fuera y funcionan. He configurado mi animationListener en mi actividad y he comenzado mi diapositiva en el onClick de la animación de un artículo. Mi problema es que la primera vez que ejecuto la aplicación, cuando hago clic en un elemento, se ejecuta la devolución de llamada onClick, pero la animación no sucede. La segunda vez que hago clic, la diapositiva en la animación sucede, pero no la diapositiva hacia fuera. Tercera y posteriores, funciona como se esperaba. Aquí están mis juegos de animación.
Vm_slide_in.xml
- Animación A lo largo de una ruta con rotación automática basada en la ruta en android
- Leer más botón en android
- Icono de Animated para ActionItem
- ¿Cómo crear un diseño doblado personalizado con imageview y texto android?
- Alejar la animación de transición entre dos actividades
<?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android" android:fillAfter="true"> <translate android:fromYDelta="800" android:toYDelta="0" android:duration="600" /> </set>
Vm_slide_out.xml
<?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android" android:fillAfter="true"> <translate android:fromYDelta="0" android:toYDelta="800" android:duration="600" /> </set>
Aquí está mi esquema de actividad
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" style="@style/AppBG"> <RelativeLayout style="@style/LogoBar" android:id="@+id/logo_bar" android:layout_alignParentTop="true"> <include layout="@layout/logobar"></include> </RelativeLayout> <RelativeLayout style="@style/TitleBar" android:id="@+id/title_bar" android:layout_below="@+id/logo_bar"> <include layout="@layout/titlebar"></include>" <Button style="@style/TitleBarButton" android:id="@+id/vm_speaker_btn" android:text="@string/vm_speaker_btn_label" android:layout_alignParentLeft="true" android:layout_margin="4dp"> </Button> <Button style="@style/TitleBarButton" android:id="@+id/vm_edit_btn" android:text="@string/vm_edit_btn_label" android:layout_alignParentRight="true" android:layout_margin="4dp"> </Button> </RelativeLayout> <ListView android:id="@+id/@android:id/list" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_below="@+id/title_bar"/> <RelativeLayout android:id="@+id/vm_control_panel" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_above="@+id/footer" android:visibility="gone"> <include layout="@layout/vm_control"/> </RelativeLayout> <RelativeLayout android:id="@+id/footer" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentBottom="true"> <include layout="@layout/taskbar"/> </RelativeLayout> </RelativeLayout>
Aquí está el diseño para el control incluido
<?xml version="1.0" encoding="utf-8"?> <merge xmlns:android="http://schemas.android.com/apk/res/android"> <RelativeLayout android:id="@+id/vm_control" android:layout_width="fill_parent" android:layout_height="wrap_content" android:background="@color/dark_grey"> <TextView android:id="@+id/vm_ctl_branding" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentTop="true" android:layout_centerHorizontal="true" android:layout_marginTop="5dp" android:text="@string/branding" android:textColor="@color/white"> </TextView> <TextView style="@style/TimeMark" android:id="@+id/vm_timestamp" android:layout_toLeftOf="@+id/vm_progress" android:layout_below="@+id/vm_ctl_branding" android:layout_marginRight="3dp" android:text="0:00"> </TextView> <SeekBar android:id="@+id/vm_progress" android:layout_width="200dp" android:layout_height="wrap_content" android:layout_below="@+id/vm_ctl_branding" android:layout_centerHorizontal="true"> </SeekBar> <TextView style="@style/TimeMark" android:id="@+id/vm_timeleft" android:layout_toRightOf="@+id/vm_progress" android:layout_below="@+id/vm_ctl_branding" android:layout_marginLeft="3dp" android:text="-0:00"> </TextView> <LinearLayout android:id="@+id/vm_action_button_layout" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_alignLeft="@+id/vm_timestamp" android:layout_alignRight="@+id/vm_timeleft" android:orientation="horizontal" android:layout_below="@+id/vm_progress"> <TextView style="@style/Vm_Action_Button" android:background="@drawable/vm_action_btn_call" android:id="@+id/vm_callback_btn" android:layout_marginRight="5dp" android:text="@string/vm_action_btn_callback"> </TextView> <TextView style="@style/Vm_Action_Button" android:background="@drawable/vm_action_btn_delete" android:id="@+id/vm_delete_btn" android:layout_marginLeft="5dp" android:text="@string/vm_action_btn_delete"> </TextView> </LinearLayout> </RelativeLayout> </merge>
De mi método onCreate …
// Handle list item selections ListView lv = getListView(); lv.setOnItemClickListener(new OnItemClickListener() { public void onItemClick(AdapterView<?> parent, View view, int position, long id) { final Voicemail vmItem = (Voicemail) vmla.getItem(position); Toast.makeText(ctx, "Name: " + vmItem.getCallerName() + " Position: " + position, Toast.LENGTH_SHORT) .show(); vVm_controls.startAnimation(mSlideIn); } });
Y mis callbacks de animación …
@Override public void onAnimationStart(Animation animation) { vm_controls_in = !vm_controls_in; if (vm_controls_in) { vVm_controls.setVisibility(View.GONE); } else { vVm_controls.setVisibility(View.VISIBLE); // vVm_controls.bringToFront(); } } @Override public void onAnimationEnd(Animation animation) { if (!vm_controls_in) { try { Thread.sleep(1000); vVm_controls.startAnimation(mSlideOut); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } @Override public void onAnimationRepeat(Animation animation) { // TODO Auto-generated method stub }
- Selector de ondulación cortado en el fondo principal
- ¿Cómo preparar curva traducir animación para android?
- Control preciso sobre las animaciones de Androids VectorDrawable
- Efecto extraño con ImageView startAnimation en ListView
- Android Viewpager salta a la mitad de una página
- Cómo cambiar el valor de NumberPicker con animación?
- Android - E / Surface: queueBuffer: buffer de cola de errores en SurfaceTexture, -22 crash
- Cómo intercambiar elementos ListView con animación?
Como usted descubrió, el problema es la visibilidad. Cuando una vista se establece inicialmente como desaparecida en el archivo xml, Android no procesará el diseño hasta que la visibilidad cambie a visible o invisible. Si intenta animar en una vista que no se ha procesado todavía, la animación se producirá en la vista sin un diseño. Una vez completada la animación, la renderizará y de repente la vista aparecerá sin animación. Funciona los tiempos posteriores porque la vista tiene una disposición incluso cuando está fijada a ido.
La clave es establecer la visibilidad a invisible en lugar de desaparecer en el archivo xml para que quede oculta. Cuando se produce la animación la primera vez que aparece la vista y se moverá como se esperaba.
Por supuesto, no 20 minutos después de publicar esta pregunta me di cuenta de mi problema. Desde que estaba poniendo la visibilidad de mi diseño a "GONE", cuando traté de iniciar la animación en él, no fue el desencadenamiento de la primera vez. No estoy seguro de por qué va a la segunda y posteriores veces, pero si establezco la visibilidad a "VISIBLE" justo antes de iniciar la animación, se arregló el problema. Aquí está el código donde lo cambié …
// Handle list item selections ListView lv = getListView(); lv.setOnItemClickListener(new OnItemClickListener() { public void onItemClick(AdapterView<?> parent, View view, int position, long id) { final Voicemail vmItem = (Voicemail) vmla.getItem(position); Toast.makeText(ctx, "Name: " + vmItem.getCallerName() + " Position: " + position, Toast.LENGTH_SHORT) .show(); vVm_controls.setVisibility(View.VISIBLE); vVm_controls.startAnimation(mSlideIn); } });
No sé si todavía está al día, pero sí, es un problema con la visibilidad. Por lo tanto, establecer la visibilidad en el archivo xml a invisible y llamado en el lugar donde se inicializa su vista:
view.post(new Runnable() { @Override public void run() { view.animate().translationY(view.getHeight()); } };
Ahora la llamada
view.animate().translationY(0).setListener(new AnimatorListenerAdapter() { @Override public void onAnimationStart(Animator animation) { super.onAnimationStart(animation); view.setVisibility(View.VISIBLE); } }
Obras también en la primera vez.
Tuve el mismo problema, pero utilizando el ViewPropertyAnimator
. Por ejemplo, usted declara un GridView
llamado mGridView
. Todo lo que tienes que hacer ahora es llamar a mGridView.animate()
con los cambios deseados.
La animación de mi GridView
se activó pero debido a circunstancias desconocidas no había ninguna animación real visible. También cambié todo View.GONE
a View.VISIBLE
, pero no cambió nada. En mi caso me di cuenta, que sólo tenía que eliminar android:requiresFadingEdge="vertical"
en mi XML de este GridView
particular. Es posible que no sea posible utilizar un borde de desvanecimiento en combinación con ViewPropertyAnimator
.
Tuve problemas similares en Android 4.4.3. He probado la mayor parte de la solución propuesta, pero sólo una solución funcionó bien para mí. Usted tiene que ejecutar su animación después de que la ventana termine de representación y la mejor manera es ejecutarlo dentro deWindowFocusChanged . No utilice el retardo a través de runnable ya que afectará el rendimiento de su aplicación en teléfonos de alta velocidad.
@Override public void onWindowFocusChanged (boolean hasFocus) { super.onWindowFocusChanged(hasFocus); if (hasFocus) yourView.startAnimation(anim); }
Más información se puede encontrar en este post: https://damianflannery.wordpress.com/2011/06/08/start-animation-in-oncreate-or-onresume-on-android/
Tenía el mismo problema, aunque estaba configurando la vista a visible en el inicio de la animación. Seguí el consejo de brockoli y lo puse visible antes de comenzar la animación y funcionó como un encanto.
ANTES DE:
Animation animation = AnimationUtils.loadAnimation(getContext(), R.anim.slide_left); animation.setAnimationListener(new Animation.AnimationListener() { @Override public void onAnimationStart(Animation animation) { view.setVisibility(View.VISIBLE); } @Override public void onAnimationEnd(Animation animation) { } @Override public void onAnimationRepeat(Animation animation) { } ); view.startAnimation(animation);
DESPUÉS:
Animation animation = AnimationUtils.loadAnimation(getContext(), R.anim.slide_left); view.setVisibility(View.VISIBLE); view.startAnimation(animation);
- El método onDraw () de SurfaceView extendido nunca se llama
- ActionBarSherlock – fondo personalizado de la barra de acción con divisor