2012-04-23 13 views
43

Ho uno ImageView nella mia richiesta, che può essere situato in un punto qualsiasi dello schermocome animare una vista con Tradurre Animation in Android

sul touch voglio spostare questo punto di vista al centro dello schermo. Ho provato questa funzionalità con Tradurre animazione e la sua funzionalità RELATIVE_TO_PARENT come segue

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

ma ImageView muove 50% (dello schermo) giù dalla sua posizione corrente.

C'è un modo per spostare questa vista al centro dello schermo indipendentemente dalla sua posizione corrente?

risposta

71

Per spostare una vista in qualsiasi punto dello schermo, consiglio di posizionarla a schermo intero. In questo modo, non dovrai preoccuparti di ritagli o coordinate relative.

Si può provare questo codice di esempio:

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> 

La vostra attività

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

Il metodo moveViewToScreenCenter ottiene coordinate assolute della vista e calcola quanta la distanza deve spostarsi dalla sua posizione attuale per raggiungere il centro dello schermo. La variabile statusBarOffset misura l'altezza della barra di stato.

Spero che tu possa continuare con questo esempio. Ricorda che dopo l'animazione la posizione della tua vista è ancora quella iniziale. Se tocchi ripetutamente il tasto MOVE, lo stesso movimento si ripeterà. Se vuoi cambiare la posizione della tua vista, fallo dopo che l'animazione è terminata.

+0

Ho usato questo moveViewToScreenCenter ma lo ho cambiato per spostare la vista in alto a destra dello schermo. Funziona quando viene lanciato da un pulsante come nel tuo esempio, ma quando si lancia moveViewToScreenCenter da onCreate, la vista passa in un altro modo. Sembra che il originalPos sia sempre [0,0] per una vista in onCreate. Cosa dà? – Jonny

+5

Nelle dimensioni di visualizzazione 'onCreate' sono 0 perché l'attività non è ancora visibile all'utente. Prova a effettuare la chiamata nel metodo 'onWindowFocusChanged'. –

+0

Non mi ha svegliato, la mia vista si sposta verso il basso! –

Problemi correlati