Présentation de l'animation ne fonctionne pas lors de la première exécution
J'ai une Activité avec une liste d'éléments et lorsque vous cliquez sur un élément, je veux les commandes de lecture pour que le point de glisser vers le haut à partir du bas de l'écran et de devenir visible. J'ai défini une animation défini pour la diapositive et le glisser et de travail. J'ai configuré mon animationListener dans mon activité et j'ai commencé mon diapositive dans l'animation onClick d'un élément. Mon problème, c'est la première fois que je lance l'application, lorsque je clique sur un élément, le rappel onClick est exécuté, mais l'animation ne se produise pas. Deuxième fois que j'cliquez sur la diapositive dans l'animation se passe, mais pas le glisser. Troisième fois, il fonctionne comme prévu. Voici mon animation jeux.
vm_slide_in.xml
<?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>
Voici mon activité de mise en page
<?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>
Ici est la mise en page pour le contrôle inclus
<?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 ma méthode 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);
}
});
Et mon animation rappels...
@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
}
Vous devez vous connecter pour publier un commentaire.
Comme vous l'avez découvert, la question est la visibilité. Lorsqu'une vue est d'abord défini comme disparu dans le fichier xml, Android ne sera pas rendu la mise en page jusqu'à ce que la visibilité est changé visible ou invisible. Si vous essayez d'animer sur un point de vue qui n'a pas été rendue encore, l'animation aura lieu sur la vue sans une mise en page. Une fois l'animation terminée, il va rendre, et tout à coup la vue apparaîtra sans animation. Il fonctionne moment ultérieur, parce que la vue a une mise en page même lorsqu'ils sont partis.
La clé est de définir la visibilité de l'invisible, au lieu d'aller dans le fichier xml de sorte qu'il est rendu encore cachés. Lorsque l'animation se produit la première fois, la vue s'affichent et se déplacer comme prévu.
Pas, bien sûr, à 20 minutes après l'affichage de cette question, j'ai compris mon problème. Depuis que j'ai été la définition de la visibilité de ma page "DISPARU", quand j'ai essayé de démarrer l'animation sur elle, ce n'était pas le déclenchement de la première fois. Je ne sais pas pourquoi il va le 2ème et les fois suivantes, mais si j'ai mis la visibilité à "VISIBLE" à droite avant de me lancer dans l'animation, il a résolu le problème. Voici le code où je l'ai changé...
Je ne sais pas si c'est toujours d'actualité mais ouais, c'est un problème avec la visibilité. J'ai donc mis de la visibilité dans le fichier xml de l'invisible et de l'appelé à l'endroit où votre point de vue est initialisé:
Maintenant, l'appel
fonctionne également pour la première fois.
Eu exactement le même problème, même si j'étais paramétrage de l'affichage visible dans l'animation de démarrage. J'ai suivi brockoli des conseils et de définir visible avant de commencer l'animation et cela a fonctionné comme un charme.
AVANT:
APRÈS:
J'ai eu le même problème dans Android 4.4.3. J'ai essayé la plupart de la solution proposée, mais une seule solution a bien fonctionné pour moi.
Vous avez pour exécuter votre animation une fois la fenêtre complète de rendu et la meilleure façon de l'exécuter à l'intérieur de onWindowFocusChanged. N'utilisez pas de retard par praticable car il aura une incidence sur les performances de vos applications à haute vitesse combinés.
plus d'informations peuvent être trouvées dans ce post:
https://damianflannery.wordpress.com/2011/06/08/start-animation-in-oncreate-or-onresume-on-android/
J'ai eu exactement le même problème, mais en utilisant le
ViewPropertyAnimator
. Par exemple, vous déclarez uneGridView
appelémGridView
. Tout ce que vous avez à faire maintenant est d'appelermGridView.animate()
avec vous les changements souhaités.L'animation de mon
GridView
a été déclenchée, mais en raison des circonstances inconnues il n'y avait aucune animation visible. J'ai aussi changé tous lesView.GONE
àView.VISIBLE
, mais il n'a pas changer quoi que ce soit. Dans mon cas, j'ai compris, que j'ai juste eu à enleverandroid:requiresFadingEdge="vertical"
dans mon XML de ceGridView
. Il peut ne pas être possible d'utiliser une Décoloration de Pointe en combinaison avecViewPropertyAnimator
.Je sais que cette question est vieux, mais ma réponse peut aider les autres.
Quand nous en avons besoin pour animer la vue, mais par défaut, la visibilité est parti
alors s'il vous plaît définir l'ensemble des propriétés cacher du code xml
Pour mon cas, j'ai utilisé translationY et alpha dans le fichier java.
J'ai fait des choses simples à résoudre le problème dans la première manche.
Ensuite ajoutés tous les attribut XML qui est utilisé dans le code.