3

I'm trying to set up 2 layouts - I want one layout to slide up, and when it's finished another layout should fade in.

I've managed to get it working, but at the end of the two animation and first layout blinks once. How can I solve it?

Here's the code(first layout is named titleLay and the second one is called registerLayout)-

final TranslateAnimation slide = new TranslateAnimation(0, 0, 0,-100 ); 
slide.setDuration(500); 
slide.setFillAfter(true); 
slide.setAnimationListener(new AnimationListener() {

@Override
public void onAnimationStart(Animation animation) {


}

@Override
public void onAnimationRepeat(Animation animation) {

}

@Override
public void onAnimationEnd(Animation animation) {
    RelativeLayout registerLayout  = (RelativeLayout) findViewById(R.id.registerLay);
    Animation fadeInAnimation = AnimationUtils.loadAnimation(con, R.anim.fade_in_anim);
    registerLayout.startAnimation(fadeInAnimation);
    registerLayout.setVisibility(View.VISIBLE);
}
});

titleLay.startAnimation(slide);

And that's the XML code of the R.anim.fade_in_anim-

<?xml version="1.0" encoding="UTF-8"?>
 <set xmlns:android="http://schemas.android.com/apk/res/android">
    <alpha android:fromAlpha="0.0" android:toAlpha="1.0" 
     android:interpolator="@android:anim/accelerate_interpolator" 
    android:duration="500"/>
</set>

Edit: If I use other types of animations(fade out, slide etc...) it works fine, without flicking.

Thanks!

Tofira
  • 1,634
  • 4
  • 27
  • 39
  • tofira, did you ever solve this issue? I am having the same problem and would like to know how you overcame this issue? – Byron Jul 01 '12 at 01:02

3 Answers3

2

If you are using animateLayoutChanges in your layout file in combination with the animation onAnimationEnd toggling the View visibility it will result in two animations running and the view flashing or blinking. Setting view visibility causes the layouts animateLayoutChanges to run and to fade the view in once and then the animation you created causes a second animation to run as well.

CodeSmith
  • 1,621
  • 1
  • 13
  • 31
1

Instead of setting the view's visibility, try to use the setAlpha function.

registerLayout.setAlpha(0f); //invisible

registerLayout.setAlpha(1f); //visible
Al Kafri Firas
  • 323
  • 3
  • 15
0

Remove the declerations and initilizations from your onAnimationEnd, the initilization may take a long time since the XML needs to be parsed from resources,

put thouse two lines in your onCreate:

 RelativeLayout registerLayout  = (RelativeLayout) findViewById(R.id.registerLay);
 Animation fadeInAnimation = AnimationUtils.loadAnimation(con, R.anim.fade_in_anim);

and set visibility to slide:

    final TranslateAnimation slide = new TranslateAnimation(0, 0, 0,-100 ); 
         slide.setDuration(500); 
         slide.setFillAfter(true);
         slide.setAnimationListener(new

 AnimationListener() {

            @Override
            public void onAnimationStart(Animation animation) {


            }

            @Override
            public void onAnimationRepeat(Animation animation) {

            }

            @Override
            public void onAnimationEnd(Animation animation) {

                registerLayout.startAnimation(fadeInAnimation);
                registerLayout.setVisibility(View.VISIBLE);
            }
            });

            titleLay.startAnimation(slide);
            titleLay.setVisibilty(View.VISIBLE);
Rotemmiz
  • 7,933
  • 3
  • 36
  • 36
  • I've actually did remove the declarations(added them just be make the code clearer when posting here), and it didn't help. When I remove the 'slide.setFillAfter(true);' line the titleLay returns to it's original location(before the slide animation), so it isn't working either. – Tofira Feb 14 '12 at 22:53
  • How can I set visibility to an animation? – Tofira Feb 14 '12 at 23:04
  • oops :)... I meant the other layout, the one you apply the animation to. – Rotemmiz Feb 14 '12 at 23:12
  • I appreciate all the help, but it didn't help either. – Tofira Feb 14 '12 at 23:20