web-dev-qa-db-fra.com

Comment animer une vue avec l’option Traduire l’animation dans Android

J'ai une seule image dans mon application qui peut être située n'importe où sur l'écran

Au toucher, je souhaite déplacer cette vue au centre de l'écran. J'ai essayé cette fonctionnalité avec Translate Animation et sa fonctionnalité RELATIVE_TO_PARENT comme suit

TranslateAnimation translateAnimation1 = new TranslateAnimation(
      TranslateAnimation.RELATIVE_TO_PARENT,0.0f,
      TranslateAnimation.RELATIVE_TO_PARENT,0.5f,
      TranslateAnimation.RELATIVE_TO_PARENT,0.0f,
      TranslateAnimation.RELATIVE_TO_PARENT,0.5f);

mais ImageView se déplace de 50% (de l'écran) de sa position actuelle.

Est-il possible de déplacer cette vue au centre de l'écran, quelle que soit sa position actuelle?

44
silwar

Afin de déplacer une vue n'importe où sur l'écran, je vous recommande de la placer dans une disposition en plein écran. Ainsi, vous n'aurez plus à vous soucier des coupures de presse ou des coordonnées relatives.

Vous pouvez essayer cet exemple de code:

main.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:layout_width="fill_parent"
    Android:layout_height="fill_parent"
    Android:orientation="vertical" Android:id="@+id/rootLayout">

    <Button
        Android:id="@+id/btn1"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:text="MOVE" Android:layout_centerHorizontal="true"/>

    <ImageView
        Android:id="@+id/img1"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:src="@drawable/ic_launcher" Android:layout_marginLeft="10dip"/>
    <ImageView
        Android:id="@+id/img2"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:src="@drawable/ic_launcher" Android:layout_centerVertical="true" Android:layout_alignParentRight="true"/>
    <ImageView
        Android:id="@+id/img3"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:src="@drawable/ic_launcher" Android:layout_marginLeft="60dip" Android:layout_alignParentBottom="true" Android:layout_marginBottom="100dip"/>

    <LinearLayout
        Android:layout_width="fill_parent"
        Android:layout_height="fill_parent"
        Android:orientation="vertical" Android:clipChildren="false" Android:clipToPadding="false">

        <ImageView
            Android:id="@+id/img4"
            Android:layout_width="wrap_content"
            Android:layout_height="wrap_content"
            Android:src="@drawable/ic_launcher" Android:layout_marginLeft="60dip" Android:layout_marginTop="150dip"/>
    </LinearLayout>

</RelativeLayout>

Votre activité

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

    ((Button) findViewById( R.id.btn1 )).setOnClickListener( new OnClickListener()
    {
        @Override
        public void onClick(View v)
        {
            ImageView img = (ImageView) findViewById( R.id.img1 );              
            moveViewToScreenCenter( img );
            img = (ImageView) findViewById( R.id.img2 );
            moveViewToScreenCenter( img );
            img = (ImageView) findViewById( R.id.img3 );                
            moveViewToScreenCenter( img );
            img = (ImageView) findViewById( R.id.img4 );
            moveViewToScreenCenter( img );
        }
    });
}

private void moveViewToScreenCenter( View view )
{
    RelativeLayout root = (RelativeLayout) findViewById( R.id.rootLayout );
    DisplayMetrics dm = new DisplayMetrics();
    this.getWindowManager().getDefaultDisplay().getMetrics( dm );
    int statusBarOffset = dm.heightPixels - root.getMeasuredHeight();

    int originalPos[] = new int[2];
    view.getLocationOnScreen( originalPos );

    int xDest = dm.widthPixels/2;
    xDest -= (view.getMeasuredWidth()/2);
    int yDest = dm.heightPixels/2 - (view.getMeasuredHeight()/2) - statusBarOffset;

    TranslateAnimation anim = new TranslateAnimation( 0, xDest - originalPos[0] , 0, yDest - originalPos[1] );
    anim.setDuration(1000);
    anim.setFillAfter( true );
    view.startAnimation(anim);
}

La méthode moveViewToScreenCenter récupère les coordonnées absolues de la vue et calcule la distance à parcourir par rapport à sa position actuelle pour atteindre le centre de l'écran. La variable statusBarOffset mesure la hauteur de la barre d'état.

J'espère que vous pourrez continuer avec cet exemple. Rappelez-vous qu'après l'animation, la position de votre vue est toujours la première. Si vous appuyez à plusieurs reprises sur le bouton MOVE, le même mouvement sera répété. Si vous souhaitez modifier la position de votre vue, faites-le une fois l'animation terminée.

71
Xavi Gil