Android5.0新特性之Activity切换动画

在讲解5.0的activity的切换动画之前,先简单介绍一下5.0版本之前activity的切换动画。

1、5.0版本之前的Activity切换动画

在5.0之前activity的切换动画通过如下方式:
overridePendingTransition(int enterAnim, int exitAnim);
两个参数分别表示打开新Activity的动画,和当前Activity退出时的动画。如果是0表示当前没有动画。
正如官方文档中说的:此方法需要在startActivity(Intent intent)或者finish()之后立即被调用。
举例说明:
activity_first.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#ff0000"
    >
    <TextView
        android:layout_width="100dp"
        android:layout_height="50dp"
        android:text="first activity"
        android:gravity="center"/>

    <Button
        android:layout_width="220dp"
        android:layout_height="50dp"
        android:text="translate"
        android:onClick="translate"/>

    <Button
        android:layout_width="220dp"
        android:layout_height="50dp"
        android:text="scale"
        android:onClick="scale"/>
    <Button
        android:layout_width="220dp"
        android:layout_height="50dp"
        android:text="rotate"
        android:onClick="rotate"/>

    <Button
        android:layout_width="220dp"
        android:layout_height="50dp"
        android:text="alpha"
        android:onClick="alpha"/>
</LinearLayout>

ActivityFrist.java

public class ActivityFirst extends AppCompatActivity {

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_first);
    }
    /**
    *启动ActivitySecond及ActivitySecond打开的动画效果-平移
    */
    public void translate(View view){
        Intent intent = new Intent(this,ActivitySecond.class);
        startActivity(intent);
        overridePendingTransition(R.anim.activity_enter_translate,0);
    }

    public void scale(View view){
        Intent intent = new Intent(this,ActivitySecond.class);
        startActivity(intent);
        overridePendingTransition(R.anim.activity_enter_scale,0);
    }

    public void rotate(View view){
        Intent intent = new Intent(this,ActivitySecond.class);
        startActivity(intent);
        overridePendingTransition(R.anim.activity_enter_rotate,0);
    }

    public void alpha(View view){
        Intent intent = new Intent(this,ActivitySecond.class);
        startActivity(intent);
        overridePendingTransition(R.anim.activity_enter_alpha,0);
    }
}

activity_enter_translate.xml

<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="2000">
<translate
    android:fromXDelta="0"
    android:toXDelta="0"
    android:fromYDelta="100%"
    android:toYDelta="0"></translate>
</set>

只贴出一个平移动画的代码,其他的类似,毕竟本文不是讲动画的。以上就是新Activity进入的动画

再举例Activity退出动画,布局文件及动画文件不贴了,主要贴Activity的。
ActivitySecond.java

public class ActivitySecond extends AppCompatActivity {

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

    public void translate(View view){
        finish();
        overridePendingTransition(0,R.anim.activity_exit_translate);
    }

    public void scale(View view){
        finish();
        overridePendingTransition(0,R.anim.activity_exit_scale);
    }

    public void rotate(View view){
        finish();
        overridePendingTransition(0,R.anim.activity_exit_rotate);
    }

    public void alpha(View view){
        finish();   
        overridePendingTransition(0,R.anim.activity_exit_alpha);
    }
}

以上就是5.0之前的activity间切换动画

2、5.0版本之后的Activity切换动画

5.0内置了三种切换动画,分别是explode(分解)、slide(滑出)、fade(淡出)。

getWindow().setEnterTransition(new Explode());
getWindow().setEnterTransition(new Slide());
getWindow().setEnterTransition(new Fade());

效果如下
这里写图片描述

explode的(分解)————从屏幕中间进入或退出

关键代码:

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        getWindow().requestFeature(Window.FEATURE_CONTENT_TRANSITIONS);
        //打开下一级activity时,此activity的退出动画
        getWindow().setExitTransition(new Slide());
        setContentView(R.layout.activity_main);
    }

代码getWindow().setExitTransition(new Slide());是设置当前activity的开启新activity时,当前activity的退出动画;而新开activity的进入动画的设置需将方法startActivity(Intent intent)换成startActivity(Intent intent,Bundle options),如下:

Intent intent = new Intent(this, SecondActivity.class);
startActivity(intent, ActivityOptions.makeSceneTransitionAnimation(this).toBundle());

然后再在即将开启的activity中设置动画效果,如下:

@Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        getWindow().requestFeature(Window.FEATURE_CONTENT_TRANSITIONS);
        //设置此activity进入的动画---分解
        getWindow().setEnterTransition(new Explode());
        //设置此动画显示的时机
        // false:需要等上一个activity的退出动画显示完成后,才开启此activity的进入动画;
        // true:不必等上一个activity的退出动画执行完,就开始此activity的进入动画;
        getWindow().setAllowEnterTransitionOverlap(false);
        setContentView(R.layout.activity_second);
    }

还可以设置activity响应物理返回键的时候的动画

getWindow().setReturnTransition(new Fade());

如果不设置物理键返回动画的话,默认会和进入动画是同一个。
其他的两个(slide和fade)用法和explode相似。接下来讲解一下共享元素

共享元素

还有一种动画效果就是上图中的第四种,将两个Activity中的某个view设置为共享元素。共享元素之间就会有一个过度动画。使用起来很简单:
1、将ActivityA中某个view设置为共享元素,只需要给共享元素增加如下属性:

android:transitionName="share"

2、在ActivityA中启动ActivityB的时候,设置共享元素:

//单个共享元素
//startActivity(intent, ActivityOptions.makeSceneTransitionAnimation(this, view,"share").toBundle());
//多个共享元素
startActivity(intent, ActivityOptions.makeSceneTransitionAnimation(this, Pair.create(view,"share"),Pair.create(btn,"share_two")).toBundle());

其中view和btn均为要共享的View对象,而“share”和“share_two”均为控件中设置的android:transitionName="share"name,
3、在ActivityB中,将要设置为共享元素的控件同样添加android:transitionName="share"此属性。

ps:共享元素要配合之前的三种动画使用
以上:如果讲错的地方欢迎指正

项目地址

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值