2012-04-23 16 views
43

tengo una ImageView en mi aplicación que puede estar situado en cualquier lugar de la pantallacómo animar una vista con Traducir animación en Android

En contacto Quiero mover este punto de vista en el centro de la pantalla. He intentado esto con funcionalidad Traducir Animación y su funcionalidad RELATIVE_TO_PARENT de la siguiente manera

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); 

pero ImageView mueve el 50% (de la pantalla) hacia abajo desde su posición actual.

¿Hay alguna manera de mover esta vista al centro de la pantalla, independientemente de su posición actual?

Respuesta

71

Para mover una Vista a cualquier parte de la pantalla, le recomendaría colocarla en una disposición de pantalla completa. Al hacerlo, no tendrá que preocuparse por los recortes o las coordenadas relativas.

Puede probar este código de ejemplo:

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> 

Su actividad

@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); 
} 

moveViewToScreenCenter El método obtiene las coordenadas absolutas de la vista y calcula cuánto la distancia tiene que moverse desde su posición actual para alcanzar el centro de la pantalla. La variable statusBarOffset mide la altura de la barra de estado.

Espero que pueda seguir con este ejemplo. Recuerde que después de la animación, la posición de su vista sigue siendo la inicial. Si toca el botón MOVE una y otra vez, se repetirá el mismo movimiento. Si desea cambiar la posición de su vista, hágalo una vez que la animación haya finalizado.

+0

Utilicé este moveViewToScreenCenter pero lo cambié para mover la vista a la parte superior derecha de la pantalla. Funciona cuando se inicia desde un botón como en su ejemplo, pero cuando se lanza moveViewToScreenCenter desde onCreate, la vista es totalmente diferente. Parece que el originalPos siempre es [0,0] para una vista en onCreate. ¿Lo que da? – Jonny

+5

En 'onCreate' las dimensiones de las vistas son 0 porque la Actividad aún no está visible para el usuario. Intenta realizar la llamada en el método 'onWindowFocusChanged'. –

+0

¡No se despertó para mí, mi vista se mueve hacia abajo! –

Cuestiones relacionadas