简体   繁体   中英

Fade animation blinks - Android

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!

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

registerLayout.setAlpha(0f); //invisible

registerLayout.setAlpha(1f); //visible

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.

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM