Material-Animations(一)--Transitions between Activities

原文:https://github.com/lgvalle/Material-Animations

Transitions between Activities

过渡动画作用于正在退出Activity的内容
这里写图片描述
当从Activity A跳转到Activity B,内容布局将根据定义好的过渡做动画变换,在android过渡动画预先定义了三种过渡动画,分别是Explode,SlideFade,这些过渡动画会跟踪当前设置的View,并执行相应的动画。

[Explode][Slide][Fade]
这里写图片描述这里写图片描述这里写图片描述

我们可以通过xml方式和代码的方式定义过渡动画,例如FADE过渡动画

xml方式

过渡动画定义在res/transition

res/transition/activity_fade.xml

<?xml version="1.0" encoding="utf-8"?>
<fade xmlns:android="http://schemas.android.com/apk/res/"
    android:duration="1000"/>

res/transition/activity_slide.xml

<?xml version="1.0" encoding="utf-8"?>
<slide xmlns:android="http://schemas.android.com/apk/res/"
    android:duration="1000"/>

为了使用上面定义的过渡动画,我们需要用到TransitionInflater

MainActivity.java

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_transition);
        setupWindowAnimations();
    }

    private void setupWindowAnimations() {
        Slide slide = TransitionInflater.from(this).inflateTransition(R.transition.activity_slide);
        getWindow().setExitTransition(slide);
    }

TransitionActivity.java

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_transition);
        setupWindowAnimations();
    }

    private void setupWindowAnimations() {
        Fade fade = TransitionInflater.from(this).inflateTransition(R.transition.activity_fade);
        getWindow().setEnterTransition(fade);
    }

代码方式

MainActivity.java

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_transition);
        setupWindowAnimations();
    }

    private void setupWindowAnimations() {
        Slide slide = new Slide();
        slide.setDuration(1000);
        getWindow().setExitTransition(slide);
    }

TransitionActivity.java

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_transition);
        setupWindowAnimations();
    }

    private void setupWindowAnimations() {
        Fade fade = new Fade();
        fade.setDuration(1000);
        getWindow().setEnterTransition(fade);
    }

上面的两种方式都会变成这样的效果:
这里写图片描述
这过程中做了下面几件事

  1. Activity A 启动 Activity B
  2. 过渡动画找到了A的Exit Transition (slide)并应用到它的所有可见的View
  3. 过渡动画找到了B的Enter Transition (fade)并应用到他的所有可见的View
  4. 退出当前页面,执行On Back Pressed方法,过渡动画会分别执行EnterExit的相反动画(如果已经定义了returnTransitionreenterTransition,那么就会执行returnTransitionreenterTransition作为代替)

ReturnTransition & ReenterTransition

returnTransitionreenterTransition分别是ExitTransitionEnterTransition相反的动画

  • EnterTransition <–> ReturnTransition
  • ExitTransition <–> ReenterTransition

如果没有定义returnTransitionreenterTransitionAndroid会执行ExitTransitionEnterTransition的相反动画,但是如果你定义了他们,你将拥有进入和退出activity是不同的过渡动画。
这里写图片描述

现在,我们修改之前的Fade例子,并且给TransitionActivity定义ReturnTransition,那么当从BA,我们将看到一个滑出(slide out)动画(之前是渐变(Fade out),它是 EnterTransition的相反动画)

TransitionActivity.java

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_transition);
        setupWindowAnimations();
    }

    private void setupWindowAnimations() {
        Fade fade = new Fade();
        fade.setDuration(1000);
        getWindow().setEnterTransition(fade);

        Slide slide = new Slide();
        slide.setDuration(1000);
        getWindow().setReturnTransition(slide);        
    }

观察,如果没有定义ReturnTransition那么EnterTransition的相反动画将会执行,如果定义了Return Transition,那么EnterTransition的相反动画将会被代替。

没有定义 Return Transition定义了 Return Transition
Enter: Fade InEnter: Fade In
Exit: Fade OutExit: Slide out
这里写图片描述这里写图片描述
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值