2012-04-23 14 views
43

Mam jedno ImageView w mojej aplikacji, które mogą znajdować się w dowolnym miejscu na ekranieJak animować widok z Przekłada animację w Androidzie

W kontakcie Chcę przenieść ten pogląd na środku ekranu. Próbowałem tę funkcjonalność z Przekłada animacji i jego funkcjonalność RELATIVE_TO_PARENT następująco

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

ale ImageView porusza się 50% (na ekranie) w dół od bieżącej pozycji.

Czy istnieje sposób przeniesienia tego widoku na środek ekranu, niezależnie od jego aktualnej pozycji?

Odpowiedz

71

Aby przenieść widok w dowolne miejsce na ekranie, zaleca się umieszczenie go w układzie pełnoekranowym. W ten sposób nie będziesz musiał martwić się wycinkami lub względnymi współrzędnymi.

Można spróbować tego przykładowego kodu:

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> 

Twoja aktywność

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

Sposób moveViewToScreenCenter dostaje współrzędne bezwzględne widoku i oblicza, ile odległość musi się przesunąć z aktualnej pozycji, aby dotrzeć do środek ekranu. Zmienna statusBarOffset mierzy wysokość paska stanu.

Mam nadzieję, że możesz kontynuować ten przykład. Pamiętaj, że po animacji pozycja twojego widoku jest wciąż aktualna. Jeśli dotkniesz przycisku PRZESUŃ ponownie, ten sam ruch zostanie powtórzony. Jeśli chcesz zmienić pozycję widoku, zrób to po zakończeniu animacji.

+0

Użyłem tego moveViewToScreenCenter, ale zmieniono je, aby przenieść widok w prawym górnym rogu ekranu. Działa po uruchomieniu z przycisku podobnego do tego w przykładzie, ale po uruchomieniu moveViewToScreenCenter z onCreate, widok idzie zupełnie inaczej. Wygląda na to, że oryginałPos jest zawsze [0,0] dla widoku w onCreate. Co daje? – Jonny

+5

W widokach 'onCreate' wymiary wynoszą 0, ponieważ działanie nie jest jeszcze widoczne dla użytkownika. Spróbuj umieścić wywołanie w metodzie 'onWindowFocusChanged'. –

+0

Nie budzi się dla mnie, mój widok przesuwa się w dół! –

Powiązane problemy