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?
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.