Fade effect between layouts

前端 未结 3 1242
离开以前
离开以前 2021-02-04 13:21

As by object, I would reproduce fade effect between two layout. Now I\'ve this situation:

LinearLayout l;
LinearLayout l2;

To switch between th

3条回答
  •  清酒与你
    2021-02-04 13:53

    Here is a working solution to cross fade between 2 layouts:

    public class CrossFadeActivity extends Activity {
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.crossfade);
    
        final View l1 = findViewById(R.id.l1);
        final View l2 = findViewById(R.id.l2);
    
        final Animation fadeOut = AnimationUtils.loadAnimation(CrossFadeActivity.this, R.anim.fade_out);
        final Animation fadeIn = AnimationUtils.loadAnimation(CrossFadeActivity.this, R.anim.fade_in);
    
        findViewById(R.id.button1).setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                fadeOut.setAnimationListener(new AnimationListener() {
                    @Override
                    public void onAnimationStart(Animation animation) {
                    }
    
                    @Override
                    public void onAnimationRepeat(Animation animation) {
                    }
    
                    @Override
                    public void onAnimationEnd(Animation animation) {
                        l1.setVisibility(View.GONE);
                    }
                });
                l1.startAnimation(fadeOut);
                l2.setVisibility(View.VISIBLE);
                l2.startAnimation(fadeIn);
            }
        });
        findViewById(R.id.button2).setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                fadeOut.setAnimationListener(new AnimationListener() {
                    @Override
                    public void onAnimationStart(Animation animation) {
                    }
    
                    @Override
                    public void onAnimationRepeat(Animation animation) {
                    }
    
                    @Override
                    public void onAnimationEnd(Animation animation) {
                        l2.setVisibility(View.GONE);
                    }
                });
                l2.startAnimation(fadeOut);
                l1.setVisibility(View.VISIBLE);
                l1.startAnimation(fadeIn);
            }
        });
    }
    }
    

    crossfade.xml:

    
    
    
    
    
        

    Where l1 and l2 are 2 random example layouts. The trick is to put them in XML such that they overlap each other (e.g. in a RelativeLayout) with visible / gone, add listeners to the animations to toggle the visibility on finish, and set the view which has to fade in to visible before the animation starts, otherwise the animation will not be visible.

    I put the buttons with the listeners to toggle the animation in the layouts itself, because I need to implement it that way but the click listener can be of course somewhere else (if it's only one it should be used in combination with some flag or check to know how to toggle).

    These are the animation files. They have to be stored in folder res/anim:

    fade_in.xml

    
    
    

    fade_out.xml

    
    
    

    UPDATE:

    Instead of using R.anim.fade_in, you can use the default fade_in from Android API (android.R.fade_in):

    final Animation fadeIn = AnimationUtils.loadAnimation(CrossFadeActivity.this, android.R.anim.fade_in);
    

    Using android.R.anim.fade_in, you will not need to create the file res/anim/fade_in.xml.

    Android has a package with some useful animations on android.R.anim: http://developer.android.com/reference/android/R.anim.html

提交回复
热议问题