2013-03-27 3 views
5

Diese so komisch ist, ich habe diese Animation Code:Animations Methode applyTransformation nicht ausgelöst, bis ich jedes Layout klicken

public class ExpandAnimation extends Animation { 
private View mAnimatedView; 
private MarginLayoutParams mViewLayoutParams; 
private int mMarginStart, mMarginEnd; 
private boolean mWasEndedAlready = false; 

/** 
* Initialize the animation 
* @param view The layout we want to animate 
* @param duration The duration of the animation, in ms 
*/ 
    public ExpandAnimation(View view, int duration) { 
     setDuration(duration); 
     mAnimatedView = view; 
     mViewLayoutParams = (MarginLayoutParams) view.getLayoutParams(); 

     mMarginStart = mViewLayoutParams.rightMargin; 
     mMarginEnd = (mMarginStart == 0 ? (0- view.getWidth()) : 0); 
     view.setVisibility(View.VISIBLE); 
     mAnimatedView.requestLayout(); 
    } 

    @Override 
    protected void applyTransformation(float interpolatedTime, Transformation t) { 
     super.applyTransformation(interpolatedTime, t); 
     if (interpolatedTime < 1.0f) { 
      // Calculating the new bottom margin, and setting it 
      mViewLayoutParams.rightMargin = mMarginStart 
        + (int) ((mMarginEnd - mMarginStart) * interpolatedTime); 
      // Invalidating the layout, making us seeing the changes we made 
      mAnimatedView.requestLayout(); 

     // Making sure we didn't run the ending before (it happens!) 
     } else if (!mWasEndedAlready) { 
      mViewLayoutParams.rightMargin = mMarginEnd; 
      mAnimatedView.requestLayout(); 
      mWasEndedAlready = true; 
     } 
    } 
} 

Und ich diese Animation:

View parent = (View) v.getParent(); 
View containerMenu = parent.findViewById(R.id.containerMenu); 
ExpandAnimation anim=new ExpandAnimation(containerMenu, 1000); 
containerMenu.startAnimation(anim); 

Diese Animation umschalten ein Layout verstecken/zeigen.

Standardmäßig ist es ausgeblendet. Wenn ich klicke, funktioniert die Animation und es wird angezeigt. Wenn ich erneut klicke, wird es korrekt verkleinert. Aber das 3. Mal, es tut nichts. Ich habe debugged und ich fand heraus, dass der Konstruktor , aber nichtapplyTransformation heißt. Irgendwie, wenn ich irgendein Layout um den Bildschirm klicke, beginnt die Animation plötzlich.

Irgendeine Idee?

Bearbeiten Weiß jemand WANN ist applyTransformation ausgelöst?

+0

Ich benutze den gleichen Code und habe genau das gleiche Problem. applyTranformation wird nie die dritte oder die folgenden Male aufgerufen. Es ist so, als ob die Animation irgendwie auf die Ansicht zurückgesetzt werden müsste. Ich habe versucht, containerMenu.clearAnimation() aufzurufen, aber es hilft nicht. –

+0

Ich habe es seit vielen Stunden gekämpft, und immer noch ohne Ergebnis ... – Reinherd

+0

@NetWolf Ich habe es geschafft, einen Workaround zu finden. Ich werde es als Antwort posten. – Reinherd

Antwort

7

Ich kann nicht verstehen, warum, aber wenn ich auf irgendein Layout klicke oder etwas mache, startet die Animation schließlich. Also habe ich programmatisch einen Workaround hinzugefügt. Ich habe eine Scrollview in meinem Layout, so dass ich bewegen, um die Scroll-Position:

hscv.scrollTo(hscv.getScrollX()+1, hscv.getScrollY()+1); 

Die kurz nach containerMenu.startAnimation(anim);

Dies funktioniert einfach, ich kann nicht verstehen, warum.

Auch ich fand heraus, dass einige Animationen einwandfrei funktionierte auf Android> 4, aber auf 2.3 zum Beispiel hatte es das gleiche Problem, arbeitete zu erweitern und zu schrumpfen, aber nicht zum zweiten Mal zu erweitern.

parent.invalidate(); 

Hat den Trick gemacht.

+1

Mine ist in einem Fragment, das sich in einem ViewPager befindet. Ich kann es umgehen, indem ich die Viewpager-Instanz der Aktivität abrufe und um 1 Pixel scrolle und dann nach Aufruf der Animation zurückschaue. Danke für den Tipp! –

+0

@NetWolf Ich habe gerade 'parent.invalidate();' hinzugefügt. Scheint auf 2.3 Geräten zu funktionieren. – Reinherd

+0

Ich hatte gerade das gleiche gefunden, jetzt wo ich auf einem alten Telefon testen konnte. Danke für das Update. –