2012-12-14 15 views
43

Zmieniam lewy margines widoku obrazu w następujący sposób:Android - Zmiana lewy margines za pomocą animacji

ViewGroup.MarginLayoutParams layoutParams = (MarginLayoutParams) image.getLayoutParams(); 
layoutParams.leftMargin = VALUE; 
image.setLayoutParams (layoutParams); 

chciałbym zmianę marginesu do stosowania z animacją. Jakieś wskazówki?

Co próbowałem:

ObjectAnimator objectAnimator = ObjectAnimator.ofFloat (image , "x" , VALUE); 
objectAnimator.start(); 

Działa to doskonale, a obraz zostanie przeniesiony do określonej wartości X z animacją, JEDNAK wartość layoutParams.leftMargin pozostaje niezmieniona !! Tak więc nie mogę użyć tej metody, ponieważ jeśli spróbuję zmienić wartość layoutParams.leftMargin na 100 po użyciu obiektu objectAnimator z wartością 100, zastosowana wartość jest niepoprawna (zastosowano 200 zamiast 100, efekt jeśli objectAnimator pozostaje mimo iż jestem ustawiając lewy margines w następujący sposób:.

klasy
layoutParams.leftMargin = 100; 

Odpowiedz

117

Zastosowanie animacji, nie objectAnimator

final int newLeftMargin = <some value>; 
Animation a = new Animation() { 

    @Override 
    protected void applyTransformation(float interpolatedTime, Transformation t) { 
     LayoutParams params = yourView.getLayoutParams(); 
     params.leftMargin = (int)(newLeftMargin * interpolatedTime); 
     yourView.setLayoutParams(params); 
    } 
}; 
a.setDuration(500); // in ms 
yourView.startAnimation(a); 

Należy pamiętać, że sho użyjemy poprawnej klasy LayoutParams, tzn. jeśli twój widok jest dzieckiem LinearLayout, wtedy parametrami powinny być LinearLayout.LayoutParams

+0

Dziękuję za wskazanie mnie we właściwym kierunku! :) – Leeeeeeelo

+12

Nie zapomnij ustawić czas trwania, miałem pewne problemy z nim, dopóki nie ustawić czas trwania: 'a.setDuration (czas trwania);' –

+0

Otrzymuję błąd, gdy próbuję użyć params.leftMargin. Najwyraźniej nie jest to pole – Soroush

68

Przyszedłem przez to pytanie, ale nie mogłem go użyć, ponieważ chcę animować margines z wartości ujemnej do 0, więc użyłem bazę valueAnimater na user1991679 odpowiedź:

final View animatedView = view.findViewById(R.id.animatedView); 
final LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) animatedView.getLayoutParams(); 
ValueAnimator animator = ValueAnimator.ofInt(params.bottomMargin, 0); 
animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { 
    @Override 
    public void onAnimationUpdate(ValueAnimator valueAnimator) 
    { 
     params.bottomMargin = (Integer) valueAnimator.getAnimatedValue(); 
     animatedView.requestLayout(); 
    } 
}); 
animator.setDuration(300); 
animator.start(); 

musisz zmienić LinearLayout.LayoutParams według pojemnika animatedView. Możesz także użyć dziewięciu czcionek dla starszej wersji, które nie mają ValueAnimatora.

+0

Możesz animować margines z wartości ujemnej do 0, używając klasy Animacja. Nie ma żadnych ograniczeń. – user1991679

+0

@ user1991679 i jak animować od powiedzmy 400 do 200 używając klasy 'Animation'? – StuStirling

+3

Załóżmy, że 200 to newMargin (margines, do którego powinniśmy się animować), a 400 to currentMargin (marge, z którego animete pochodzą). W takim przypadku kod będzie wyglądał następująco: @Override chronione void applyTransformation (float interpolatedTime, Transformation t) { Parametry LayoutParams = yourView.getLayoutParams(); params.leftMargin = currentMargin - (int) ((currentMargin - newMargin) * interpolatedTime); yourView.setLayoutParams (params); } – user1991679

-2

można użyć następujących

image.animate().setDuration(durationIn).translationXBy(offsetFloat).start(); 

Można również dodać .setInterpolator(new BounceInterpolator()) zmienić wygląd animacji.

0

Odpowiedź z user1991679 jest super, ale jeśli trzeba interpolować margines z każdej innej wartości, ale 0, trzeba go używać w obliczeniach:

ViewGroup.MarginLayoutParams params = (MarginLayoutParams) mBottomLayout.getLayoutParams(); 
final int bottomMarginStart = params.bottomMargin; // your start value 
final int bottomMarginEnd = <your value>; // where to animate to 
Animation a = new Animation() { 
    @Override 
    protected void applyTransformation(float interpolatedTime, Transformation t) { 
     ViewGroup.MarginLayoutParams params = (MarginLayoutParams) mBottomLayout.getLayoutParams(); 
     // interpolate the proper value 
     params.bottomMargin = bottomMarginStart + (int) ((bottomMarginEnd - bottomMarginStart) * interpolatedTime); 
     mBottomLayout.setLayoutParams(params); 
    } 
}; 
a.setDuration(300); 
mBottomLayout.startAnimation(a); 

W moim przypadku potrzebne do animowania Animacja "wejdź do ekranu", pochodząca z "-48dp" do 0. Bez wartości początkowej animacja ma zawsze wartość 0, więc przeskakuje, nie animuje widoku. Rozwiązaniem było interpolowanie przesunięcia i dodanie go do pierwotnej wartości.

Powiązane problemy