2011-12-13 14 views
8

Opracowuję widżet oparty na ViewGroup i moim problemem jest to, że muszę zapisać pozycję elementów po zakończeniu animacji. Zadzwoniłem pod numer setFillAfter(true) w obiekcie animacji, który utworzyłem: AnimationListener iw jego wywołaniu View.layout(l,t,r,b), aby ustawić pozycję po animacji, ponieważ chcę, aby animacja zaczynała się od następnej pozycji nowego elementu. Ale w tym przypadku wygląda na to, że elementy są układane dwa razy. Jeśli nie użyję View.layout(l,t,r,b) na końcu animacji, następna animacja rozpocznie się od poprzedniej pozycji. Oto mój kod:Zmiana położenia widoku po zakończeniu animacji

private void scrollUp() { 
    for(int i = 0; i < getChildCount(); i++) { 
     final View child = getChildAt(i); 
     final int index = i; 
     final int newleft = child.getLeft() + mOffsetBetweenItems; 
     final int newTop = child.getTop() - mOffsetBetweenItems; 
     TranslateAnimation scrollUp = new TranslateAnimation(0, mOffsetBetweenItems, 0, -mOffsetBetweenItems);   
     scrollUp.setDuration(1500); 
     scrollUp.setFillAfter(true);   
     scrollUp.setAnimationListener(
      new AnimationListener() { 

       @Override 
       public void onAnimationStart(Animation animation) {} 

       @Override 
       public void onAnimationRepeat(Animation animation) {} 

       @Override 
       public void onAnimationEnd(Animation animation) { 
        child.layout(newleft, newTop, newleft + child.getMeasuredWidth(), newTop + child.getMeasuredHeight()); 
       } 
      } 
     ); 

     child.startAnimation(scrollUp); 
    } 
} 

Proszę dać mi poradę, jak powinienem zresetować pozycję widoku zgodnie z końcową pozycją animacji?

+0

zmianę pozycja oznacza, że ​​chcesz ustawić ją w DOLNYM lub TOP w układzie, chcesz tego .. –

+0

nie BOTTOM ani TOP, ale w konkretnych współrzędnych X, Y, które są zdefiniowane przez 'view.lay out() 'method – teoREtik

Odpowiedz

12

Zrobiłem to. Oto kod:

private void scrollUp() { 
    for(int i = 0; i < getChildCount(); i++) { 
     final View child = getChildAt(i); 
     final int index = i; 
     final int newleft = child.getLeft() + mOffsetBetweenItems; 
     final int newTop = child.getTop() - mOffsetBetweenItems; 
     TranslateAnimation scrollUp = new TranslateAnimation(0, mOffsetBetweenItems, 0, -mOffsetBetweenItems);   
     scrollUp.setDuration(1500); 
     scrollUp.setFillEnabled(true);   
     scrollUp.setAnimationListener(
      new AnimationListener() { 

       @Override 
       public void onAnimationStart(Animation animation) {} 

       @Override 
       public void onAnimationRepeat(Animation animation) {} 

       @Override 
       public void onAnimationEnd(Animation animation) { 
        child.layout(newleft, newTop, newleft + child.getMeasuredWidth(), newTop + child.getMeasuredHeight()); 
       } 
      } 
     ); 

     child.startAnimation(scrollUp); 
    } 
} 

Wystarczy usunięty setFillAfter(true) i napisać setFillEnabled(true) zamiast. Ale w tym przypadku nie rozumiem logiki działania, ponieważ zapewnia zachowanie nie podobne do opisów w dokumentacji.

+0

Ustawienie nowego po lewej stronie w sprawieAnimationEnd poprawiono moje problemy. Dzięki. W twoim kodzie, w którym punkcie ustawiać/aktualizować mOffsetBetweenItems? – speedynomads

+0

Uwaga: nie działa na Lollipop co najmniej (zgadywanie na pewnym poziomie API było przypadkowo zaimplementowane jak wyżej, ale na pewno nie działa przynajmniej na Lollipop) – MDragon00

0

Odwróć animację; Zacznij od przedstawienia swojej nowej pozycji, a następnie animuj od starej pozycji do nowej pozycji.

+0

Jeśli najpierw podam nową pozycję, to momentalnie przerysowuje mój widok w nowej pozycji – teoREtik

+0

Nie, jeśli wywołasz funkcję startAnimation(), gdy tylko zmienisz pozycję. – Jave

+0

Jeśli nazywam 'View.layout()' przed 'view.startAnimation()' to przerysowuje mój widok i animacja zaczyna się od nowej pozycji – teoREtik

19

Musisz użyć ObjectAnimator, działa on z poziomu interfejsu API 11. Zmienia Zobacz pozycję Automatyczny,

oto przykład

ObjectAnimator objectAnimator= ObjectAnimator.ofFloat(mContent_container, "translationX", startX, endX); 
objectAnimator.setDuration(1000); 
objectAnimator.start(); 

Dzięki lipca do jego answer

Jeśli nie znaleziono aplikacja object animator, zmienić poziom API z Project -> properties -> Android, niż import android.animation.ObjectAnimator;

+0

Ożywia widok. Współrzędne widoku nie są zmieniane za pomocą Animatora obiektów. – mertsimsek

Powiązane problemy