2012-04-23 3 views
43

У меня есть один ImageView в моем приложении, которое может быть расположен в любом месте на экранеКак оживить вид с Перевести анимации в Android

На ощупь я хочу, чтобы переместить этот вид в центре экрана. Я попробовал эту функцию с Перевести анимации и ее функциональные возможности RELATIVE_TO_PARENT следующих

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

но ImageView перемещает 50% (экран) по сравнению с его текущей позиции.

Есть ли способ переместить этот вид в центр экрана независимо от его текущего положения?

ответ

71

Чтобы переместить вид в любом месте экрана, я бы рекомендовал разместить его в полноэкранном режиме. Поступая таким образом, вам не придется беспокоиться об обрезках или относительных координатах.

Вы можете попробовать этот пример кода:

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> 

Ваша деятельность

@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 получает абсолютные координаты зрения и вычисляет, сколько расстояние должно перейти от текущего положения, чтобы достичь центр экрана. Переменная statusBarOffset измеряет высоту строки состояния.

Надеюсь, вы сможете продолжить этот пример. Помните, что после анимации позиция вашего представления все еще является исходной. Если вы снова и снова нажимаете кнопку MOVE, повторное воспроизведение будет повторяться. Если вы хотите изменить позицию своего вида, сделайте это после завершения анимации.

+0

Я использовал этот moveViewToScreenCenter, но изменил его, чтобы переместить вид в верхнем правом углу экрана. Он работает при запуске с такой кнопки, как в вашем примере, но при запуске moveViewToScreenCenter из onCreate вид выглядит совершенно другим способом. Кажется, что originalPos всегда [0,0] для представления в onCreate. Что дает? – Jonny

+5

В параметрах 'onCreate' размеры равны 0, так как активность еще не виден для пользователя. Попробуйте поместить вызов в метод 'onWindowFocusChanged'. –

+0

Это не проснется для меня, мое представление движется вниз! –

Смежные вопросы