web-dev-qa-db-fra.com

Android développer LinearLayout en utilisant une animation

J'essaie d'utiliser l'animation pour faire apparaître une mise en page à l'écran. L'idée est que la mise en page commencera par une hauteur de 0 et atteindra 100%.

J'ai de réels problèmes avec cela et j'ai besoin d'aide. Pour une raison quelconque, aucune animation n'est effectuée.

Voici mon fichier XML d'animation

<?xml version="1.0" encoding="utf-8"?>

<set xmlns:Android="http://schemas.Android.com/apk/res/Android">
    <scale
        Android:interpolator="@Android:anim/accelerate_decelerate_interpolator"
        Android:fromXScale="0.0"
        Android:toXScale="1"
        Android:fromYScale="1.0"
        Android:toYScale="1.0"
        Android:fillAfter="false"
         />

</set>

Le fichier de mise en page est très basique et est conçu comme suit

<?xml version="1.0" encoding="utf-8"?>

<RelativeLayout
    Android:layout_width="fill_parent"
    Android:layout_height="fill_parent" xmlns:Android="http://schemas.Android.com/apk/res/Android">

<LinearLayout
        Android:id="@+id/dialog"
        Android:layout_width="wrap_content"
        Android:layout_height="200dp"
        Android:layout_centerHorizontal="true"
        Android:orientation="vertical"
        Android:layout_centerVertical="true"
        Android:background="@drawable/border">
    <TextView
            Android:layout_width="wrap_content"
            Android:layout_height="wrap_content"
            Android:layout_gravity="center_horizontal"
            Android:text="Phone"
            Android:id="@+id/textView"/>
    <TextView
            Android:layout_width="wrap_content"
            Android:layout_height="wrap_content"
            Android:layout_gravity="center_horizontal"
            Android:text="Address"
            Android:id="@+id/textView1"/>
    <Button Android:id="@+id/btn1"
            Android:layout_width="200dp"
            Android:layout_height="wrap_content"
            Android:text="Action 1"
            />
    <Button Android:id="@+id/btn2"
            Android:layout_width="200dp"
            Android:layout_height="wrap_content"
            Android:text="Action 2"
            />
</LinearLayout>
<Button
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:text="Animate"
        Android:id="@+id/btnAnimate" Android:layout_alignParentLeft="true" Android:layout_alignParentTop="true"
        Android:onClick="animate"/>
</RelativeLayout>

Mon code d'activité est également très basique

public class MyActivity extends Activity implements Animation.AnimationListener{

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

public void animate(View view){
    LinearLayout dialog   = (LinearLayout)findViewById(R.id.dialog);
    dialog.setVisibility(LinearLayout.VISIBLE);
    Animation animation   =    AnimationUtils.loadAnimation(this, R.anim.anim);
    Log.i("animate","Begin Animation");
    animation.reset();
  //  animation.setFillAfter(true);
    animation.setAnimationListener(this);
    dialog.setAnimation(null);
    Log.i("animate","End Animation");
}

@Override
public void onAnimationStart(Animation animation) {
    //To change body of implemented methods use File | Settings | File Templates.
}

@Override
public void onAnimationEnd(Animation animation) {
    //To change body of implemented methods use File | Settings | File Templates.
}

@Override
public void onAnimationRepeat(Animation animation) {
    //To change body of implemented methods use File | Settings | File Templates.
}
}

Je vous remercie

15
svager

Ok, je l'ai compris.

Disposition XML d'animation

<?xml version="1.0" encoding="utf-8"?>

<set xmlns:Android="http://schemas.Android.com/apk/res/Android"
 Android:fillEnabled="true"
 Android:fillAfter="true">
 <scale

        Android:interpolator="@Android:anim/accelerate_decelerate_interpolator"
        Android:fromXScale="1.0"
        Android:toXScale="1.0"
        Android:fromYScale="0.0"
        Android:toYScale="1.0"
        Android:fillAfter="false"
         />

</set>

Fichier XML de mise en page

<?xml version="1.0" encoding="utf-8"?>

<RelativeLayout
    Android:layout_width="fill_parent"
    Android:layout_height="fill_parent" xmlns:Android="http://schemas.Android.com/apk/res/Android">

  <LinearLayout
        Android:id="@+id/dialog"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:layout_centerHorizontal="true"
        Android:orientation="vertical"
        Android:layout_centerVertical="true"
        Android:visibility="invisible"
        Android:background="@drawable/border">
    <TextView
            Android:layout_width="wrap_content"
            Android:layout_height="wrap_content"
            Android:layout_gravity="center_horizontal"
            Android:text="Phone"
            Android:id="@+id/textView"/>
    <TextView
            Android:layout_width="wrap_content"
            Android:layout_height="wrap_content"
            Android:layout_gravity="center_horizontal"
            Android:text="Address"
            Android:id="@+id/textView1"/>
    <Button Android:id="@+id/btn1"
            Android:layout_width="200dp"
            Android:layout_height="wrap_content"
            Android:text="Action 1"
            />
    <Button Android:id="@+id/btn2"
            Android:layout_width="200dp"
            Android:layout_height="wrap_content"
            Android:text="Action 2"
            />
   </LinearLayout>
   <Button
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:text="Animate"
        Android:id="@+id/btnAnimate" Android:layout_alignParentLeft="true" Android:layout_alignParentTop="true"
        Android:onClick="animate"/>
</RelativeLayout>

et ma classe d'activité

public class MyActivity extends Activity{

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

public void animate(View view){
    LinearLayout dialog   = (LinearLayout)findViewById(R.id.dialog);
    dialog.setVisibility(LinearLayout.VISIBLE);
    Animation animation   =    AnimationUtils.loadAnimation(this, R.anim.anim);
    animation.setDuration(500);
    dialog.setAnimation(animation);
    dialog.animate();
    animation.start();
 }

}
24
svager

Le moyen le plus simple pour Android 3.0 et supérieur est de définir cette propriété pour la vue à laquelle vous souhaitez ajouter des enfants:

Android:animateLayoutChanges="true"

Vous pouvez également créer vos propres animations:

Si vous souhaitez fournir des animations de disposition personnalisées, créez un objet LayoutTransition et fournissez-le à la disposition avec la méthode setLayoutTransition ().

Pour plus d'informations, voir: http://developer.Android.com/training/animation/layout.html#activity

6
teh.fonsi

Concevoir une disposition linéaire croissante dans Android:

Pour ceux qui utilisent Mono Android de Xamarin:

créer un dossier anim sous les ressources.

puis ajouter animation.xml dans le dossier anim (grow_anim1)

dans la classe d'activité, utilisez cette méthode:

(dans mon cas, j'utilise Fragment)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using Android.App;
using Android.Content;
using Android.OS;
using Android.Runtime;
using Android.Util;
using Android.Views;
using Android.Widget;
using Android.Views.Animations;
namespace BehnoudAndroidApp {
    public class StartPageFragment : Fragment{
        public override View OnCreateView(LayoutInflater p0, ViewGroup p1, Bundle p2){
            var rootView = p0.Inflate(Resource.Layout.StartPageLayout, p1, false);

            LinearLayout menu1 = rootView.FindViewById<LinearLayout>(Resource.Id.linearlayout1);

            Animation animation1 = AnimationUtils.LoadAnimation(this.Activity, Resource.Animation.grow_anim1);

            animation1.Duration = 5000;

            menu1.Click += delegate { menu1.StartAnimation(animation1); };

            return rootView;
        }
    }
}
2
Behnoud Sherafati

Il semble que l'animation ne démarre jamais. essayez d'ajouter:

animation.start()
1
manutudescends