2012-04-23 13 views
43

ich einen Imageview in meiner Anwendung, das überall auf dem Bildschirm angeordnet werden kannWie eine Ansicht mit animieren Übersetzen Animation in Android

On Touch ich diese Ansicht in der Mitte des Bildschirms verschieben möge. Ich habe versucht, diese Funktionalität mit Übersetzen Animation und seine RELATIVE_TO_PARENT Funktionalität wie

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

aber Image bewegt sich 50% (des Bildschirms) nach unten von seiner aktuellen Position.

Gibt es eine Möglichkeit, diese Ansicht unabhängig von der aktuellen Position in die Mitte des Bildschirms zu verschieben?

Antwort

71

Um eine Ansicht beliebig auf dem Bildschirm zu verschieben, würde ich empfehlen, sie in einem Vollbild-Layout zu platzieren. Auf diese Weise müssen Sie sich nicht um Ausschnitte oder relative Koordinaten kümmern.

können Sie versuchen, diesen Beispielcode:

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> 

Ihre Aktivität

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

Verfahren moveViewToScreenCenter der Anzeige für den absoluten Koordinaten erhält und berechnet, wie viel Abstand muss sich von seiner aktuellen Position bewegen, um die Mitte des Bildschirms. Die Variable statusBarOffset misst die Höhe der Statusleiste.

Ich hoffe, Sie können mit diesem Beispiel weitermachen. Denken Sie daran, dass die Position Ihrer Ansicht nach der Animation immer noch die ursprüngliche ist. Wenn Sie wiederholt auf die MOVE-Taste tippen, wird die gleiche Bewegung wiederholt. Wenn Sie die Position Ihrer Ansicht ändern möchten, tun Sie dies, nachdem die Animation beendet ist.

+0

Ich habe dieses moveViewToScreenCenter verwendet, aber geändert, um die Ansicht nach oben rechts auf dem Bildschirm zu verschieben. Es funktioniert, wenn es von einer Schaltfläche wie in Ihrem Beispiel gestartet wird, aber wenn Sie moveViewToScreenCenter von onCreate starten, geht die Ansicht völlig anders. Es scheint, dass das OriginalPos immer [0,0] für eine Ansicht in onCreate ist. Was gibt? – Jonny

+5

In OnCreate-Ansichten sind Dimensionen 0, da die Aktivität für den Benutzer noch nicht sichtbar ist. Versuchen Sie, den Aufruf in die 'onWindowFocusChanged'-Methode zu platzieren. –

+0

Es weckt mich nicht, mein Blick geht nach unten! –

Verwandte Themen