动画框架(4)-共享元素动画和场景切换

图片 11

主目录见:Android高级进阶知识
我们都知道,在5.0之后引入了很多新的转场动画,使过渡更加的合理化了,适当地加入动画能使你的app看起来眼前一亮,第一印象取胜,所以我们有理由来学习它,为了有兴趣看下去,我们先亮出效果,录屏有点卡顿,实际比较流畅:

图片 1

本文主要译自 lgvalle 的
Material-Animations
的 README.MD,文中的源码见
Material-Animations。

图片 2效果图


Android 4.4.2 中引入了 Transition 过渡动画,不过那时的 API
的功能比较简单,只能对整个 Activity 或 Fragment 做动画,Google 在
Android 5.0 的 Material Design 中引入更完整的 Transition 框架。Android
的过渡动画可以分为四个部分:

想要代码的可以直接[点击下载],然后适当地在自己app里面放飞吧。

前言

学习完大神Carson_Ho关于动画的一系列文章后,这篇文章是我自己结合一些文章总结的关于Android
5.0的转场动画。

参考文章:

  • Android高级动画(1)
  • Android转场动画深度解析(1)
  1. Activity/Fragment 切换时的内容过渡动画(content transition)

  2. Activity/Fragment 切换时的共享元素过渡动画

  3. 同一个页面中的场景过渡动画

  4. 共享元素过渡动画 + 揭露效果(circular reveal)

今天的目标比较单纯,就是为了给我们的应用程序增加点吸引力,使别人有兴趣玩你的app,所以目标有以下:1.练习使用共享元素动画和TransitionManager;2.能在适当的时候使用这些动画。

1.传统转场动画

该部分在文章Android补间动画的学习中也有阐述。
效果图:

图片 3

效果图

  • 动画xml文件的准备

slide_right_in.xml

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

    <translate
        android:fromXDelta="100%"
        android:toXDelta="0%"
        android:duration = "500"
        />

</set>

slide_left_out.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate
    android:fromXDelta="0%"
    android:toXDelta="-40%"
    android:duration = "500"
    />
</set>

slide_left_in.xml

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

    <translate
        android:fromXDelta="-100%"
        android:toXDelta="0%"
        android:duration="500"
        />
</set>

slide_right_out.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate
        android:fromXDelta="0%"
        android:toXDelta="100%"
        android:duration = "500"
        />
</set>
  • 在activity中使用

ActivityA的代码

startActivity(new Intent(TransitionsActivity.this,TraditionalActivity.class));
overridePendingTransition(R.anim.slide_right_in,R.anim.slide_left_out);

ActivityB的代码

finish();
overridePendingTransition(R.anim.slide_left_in, R.anim.slide_right_out);

在介绍过渡动画之前,先要明白 Transition 是什么?

Material Design
为场景切换提供了非常优雅的视觉效果,在进入和退出页面,元素共享页面的时候都可以添加想要的效果,而且能让你感觉运动就应该是这样的,这样其实就已经成功了。

2. Android 5.0新的转场动画

Android 5.0新的转场动画有四种,Explode、Slide、Fade、Share。
效果图:

图片 4

效果图

(1)Explode
Explode的效果是下一个页面的元素从四面八方进入,最终形成完整的页面。代码如下:

// 跳转
Intent intent = new Intent(this, CActivity.class);
startActivity(intent, ActivityOptions.makeSceneTransitionAnimation(this).toBundle());

// 跳转的Activity
public class CActivity extends AppCompatActivity {

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        getWindow().setEnterTransition(new Explode());
        setContentView(R.layout.activity_c);
    }
}

在跳转时需要注意的点是:intent后面还要再传一个参数bundle,固定写法ActivityOptions.makeSceneTransitionAnimation(this).toBundle(),下一个Activity根据这个就能识别出使用5.0新转场动画。

跳转的Activity在onCreate方法中,调用getWindow().setEnterTransition(new
Explode())即可,必须在setContentView之前调用。

(2)Slide
Slide就是下一个页面元素从底部一次向上运动,最终形成完整的页面。代码如下:

// 跳转
Intent intent = new Intent(this, CActivity.class);
startActivity(intent, ActivityOptions.makeSceneTransitionAnimation(this).toBundle());

// 跳转的Activity
public class CActivity extends AppCompatActivity {

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        getWindow().setEnterTransition(new Slide());
        setContentView(R.layout.activity_c);
    }
}

与Explode唯一的区别就是在跳转的Activiy的onCreate方法中设置transition为Slide即可。

(3)Fade
Fade就是下一个页面元素渐变出现,最终形成完整的页面。代码如下:

// 跳转
Intent intent = new Intent(this, CActivity.class);
startActivity(intent, ActivityOptions.makeSceneTransitionAnimation(this).toBundle());

// 跳转的Activity
public class CActivity extends AppCompatActivity {

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        getWindow().setEnterTransition(new Fade());
        getWindow().setExitTransition(new Fade());
        setContentView(R.layout.activity_c);
    }
}

同样,就是跳转的Activity在onCreate方法中设置transition为Fade即可,只不过这里最好同时设置Enter和Exit。

(4)Share
Share是最复杂的一种转场方式,在跳转的两个Activity之间,如果有相同的View元素,那么,两个元素就可以设置成共享状态,在跳转时,这个View就会从第一个Activity的显示状态过渡到第二个Activity的显示状态,给用户的感觉仿佛是两个Activity共享一个View。

下面是share的单独效果图:

图片 5

效果图

前后两个Activity都有两个共同的元素,一个机器人Logo,一个Android文字,但是他们在两个Activity中的位置、大小都不一样,于是,在两个Activity跳转过程中,位置、大小会自动有一个渐变的过程,从第一个Activity的状态渐变到第二个Activity的状态,从而给人一种两个Activity共享元素的感觉。

代码如下:

<!-- 首先,两个Activity共享的元素需要设置相同的transitionName: android:transitionName="fab" -->
<Button
     android:id="@+id/fab_button"
     android:layout_width="56dp"
     android:layout_height="56dp"
     android:background="@mipmap/ic_launcher"
     android:elevation="5dp"
     android:onClick="explode"
     android:transitionName="fab" />

<Button
     android:id="@+id/fab_button"
     android:layout_width="160dp"
     android:layout_height="160dp"
     android:layout_alignParentEnd="true"
     android:layout_below="@id/holder_view"
     android:layout_marginTop="-80dp"
     android:background="@mipmap/ic_launcher"
     android:elevation="5dp"
     android:transitionName="fab" />

// 跳转时,要为每一个共享的view设置对应的transitionName
View fab = findViewById(R.id.fab_button);
View txName = findViewById(R.id.tx_user_name);
intent = new Intent(this, CActivity.class);
startActivity(intent, ActivityOptions.makeSceneTransitionAnimation(this,
        Pair.create(view, "share"),
        Pair.create(fab, "fab"),
        Pair.create(txName, "user_name"))
        .toBundle());

// 跳转的Activity在onCreate方法中开启Transition模式
public class CActivity extends AppCompatActivity {

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        getWindow().requestFeature(Window.FEATURE_CONTENT_TRANSITIONS);
        setContentView(R.layout.activity_c);
    }
}

(5)Share转场的经典例子
效果图:

图片 6

效果图

  • 用到的布局文件

activity_typical.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:padding="20dp"
    tools:context="com.gjj.androidstudydemo.activity.TypicalActivity">

    <android.support.v7.widget.RecyclerView
        android:id="@+id/rv"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>
</LinearLayout>

rv_item.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/root"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal"
    android:paddingBottom="12dp">

    <ImageView
        android:id="@+id/head_image"
        android:layout_width="86dp"
        android:layout_height="86dp"
        android:scaleType="centerCrop"
        android:transitionName="headImage"/>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="64dp"
        android:layout_marginLeft="16dp"
        android:orientation="vertical">

        <TextView
            android:id="@+id/name"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textSize="16sp"
            android:textStyle="bold"
            android:textColor="#383838"
            android:layout_marginTop="6dp"
            android:transitionName="name"/>

        <TextView
            android:id="@+id/desc"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textSize="14sp"
            android:textColor="#808080"
            android:layout_marginTop="12dp"
            android:transitionName="desc"/>
    </LinearLayout>
</LinearLayout>
  • Activity的代码

package com.gjj.androidstudydemo.activity;

import android.app.ActivityOptions;
import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.util.Pair;
import android.view.View;

import com.gjj.androidstudydemo.R;
import com.gjj.androidstudydemo.adapter.RVAdapter;
import com.gjj.androidstudydemo.bean.RVBean;

import java.util.ArrayList;

import butterknife.BindView;
import butterknife.ButterKnife;

public class TypicalActivity extends AppCompatActivity implements RVAdapter.RVClickListener {


    @BindView(R.id.rv)
    RecyclerView mRv;
    private ArrayList<RVBean> beans;
    private RVAdapter mRVAdapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_typical);
        ButterKnife.bind(this);
        setTitle("典型应用");
        init();
    }

    /**
     * 初始化控件和数据
     */
    private void init() {
        mRv.setLayoutManager(new LinearLayoutManager(this,LinearLayoutManager.VERTICAL,false));

        beans = new ArrayList<>();
        beans.add(new RVBean("谈笑冯生", R.mipmap.head_image_01, "低调奢华有内涵"));
        beans.add(new RVBean("高鹏展翅", R.mipmap.head_image_02, "桌游传奇小王子"));
        beans.add(new RVBean("珉而好学", R.mipmap.head_image_03, "套路王"));
        beans.add(new RVBean("汰渍洗衣粉,加亮不加价", R.mipmap.head_image_04, "What are you 说啥捏?"));
        beans.add(new RVBean("尼古拉斯.赵政", R.mipmap.head_image_05, "亚洲舞王不解释"));

        beans.add(new RVBean("谈笑冯生", R.mipmap.head_image_06, "低调奢华有内涵"));
        beans.add(new RVBean("高鹏展翅", R.mipmap.head_image_07, "桌游传奇小王子"));
        beans.add(new RVBean("珉而好学", R.mipmap.head_image_08, "套路王"));
        beans.add(new RVBean("汰渍洗衣粉,加亮不加价", R.mipmap.head_image_09, "What are you 说啥捏?"));
        beans.add(new RVBean("尼古拉斯.赵政", R.mipmap.head_image_10, "亚洲舞王不解释"));

        beans.add(new RVBean("谈笑冯生", R.mipmap.head_image_11, "低调奢华有内涵"));
        beans.add(new RVBean("高鹏展翅", R.mipmap.head_image_12, "桌游传奇小王子"));
        beans.add(new RVBean("珉而好学", R.mipmap.head_image_13, "套路王"));
        beans.add(new RVBean("汰渍洗衣粉,加亮不加价", R.mipmap.head_image_14, "What are you 说啥捏?"));
        beans.add(new RVBean("尼古拉斯.赵政", R.mipmap.head_image_15, "亚洲舞王不解释"));

        beans.add(new RVBean("谈笑冯生", R.mipmap.head_image_16, "低调奢华有内涵"));
        beans.add(new RVBean("高鹏展翅", R.mipmap.head_image_17, "桌游传奇小王子"));
        beans.add(new RVBean("珉而好学", R.mipmap.head_image_18, "套路王"));
        beans.add(new RVBean("汰渍洗衣粉,加亮不加价", R.mipmap.head_image_19, "What are you 说啥捏?"));
        beans.add(new RVBean("尼古拉斯.赵政", R.mipmap.head_image_20, "亚洲舞王不解释"));

        mRVAdapter = new RVAdapter(beans,this);
        mRv.setAdapter(mRVAdapter);
        mRVAdapter.setListener(this);
    }

    /**
     * 条目的点击事件
     * @param position
     */
    @Override
    public void onItemClick(int position) {
        RVBean bean = beans.get(position);

        Intent intent = new Intent(TypicalActivity.this, TypicalDetailActivity.class);
        intent.putExtra("resId",bean.getResId());
        intent.putExtra("name",bean.getName());
        intent.putExtra("desc",bean.getDesc());

        /**
         * 获取到点击条目的view
         */
        int firstVisiblePosition = ((LinearLayoutManager)mRv.getLayoutManager()).findFirstVisibleItemPosition();

        View itemView = mRv.getChildAt(position - firstVisiblePosition);
        View headImage = itemView.findViewById(R.id.head_image);
        View name = itemView.findViewById(R.id.name);
        View desc = itemView.findViewById(R.id.desc);
        //启动activity时,使用共享元素
        startActivity(intent, ActivityOptions.makeSceneTransitionAnimation(this,
                Pair.create(headImage,"headImage"),
                Pair.create(name,"name"),
                Pair.create(desc,"desc")).toBundle());
    }
}
  • 跳转后Activity的布局文件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <ImageView
        android:id="@+id/iv_head"
        android:layout_width="match_parent"
        android:layout_height="280dp"
        android:scaleType="centerCrop"
        android:transitionName="headImage"/>

    <TextView
        android:id="@+id/tx_name"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="28sp"
        android:textColor="#383838"
        android:layout_marginTop="8dp"
        android:layout_marginLeft="16dp"
        android:transitionName="name"/>

    <TextView
        android:id="@+id/tx_desc"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="20sp"
        android:textColor="#808080"
        android:layout_marginTop="8dp"
        android:layout_marginLeft="16dp"
        android:transitionName="desc"/>

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="16sp"
        android:textColor="#808080"
        android:layout_marginTop="8dp"
        android:layout_marginLeft="16dp"
        android:layout_marginRight="16dp"
        android:text="社会主义核心价值观是社会主义核心价值体系的内核,体现社会主义核心价值体系的根本性质和基本特征,反映社会主义核心价值体系的丰富内涵和实践要求,是社会主义核心价值体系的高度凝练和集中表达。"/>
</LinearLayout>
  • 跳转后activity的代码

package com.gjj.androidstudydemo.activity;

import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.widget.ImageView;
import android.widget.TextView;

import com.gjj.androidstudydemo.R;

import butterknife.BindView;
import butterknife.ButterKnife;

public class TypicalDetailActivity extends AppCompatActivity {

    @BindView(R.id.iv_head)
    ImageView mIvHead;
    @BindView(R.id.tx_name)
    TextView mTxName;
    @BindView(R.id.tx_desc)
    TextView mTxDesc;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_typical_detail);
        ButterKnife.bind(this);
        Intent intent = getIntent();
        String name = intent.getStringExtra("name");
        String desc = intent.getStringExtra("desc");
        int resId = intent.getIntExtra("resId", 0);
        mIvHead.setImageResource(resId);
        mTxName.setText(name);
        mTxDesc.setText(desc);
    }
}

Transition 是指不同 UI
状态转换时的动画。其中有两个关键概念:场景(scenes)和转换(transitions)。场景定义了一个确定的
UI 状态,而转换定义了两个场景切换时的动画。

1.过渡效果

过渡这个地方我是在例子里面顺便加入的,但是防止有的人这个都没有用过,这里就提一下,过渡的场景如下:1.首先打开A页面2.然后A页面跳转到B页面3.接着回到A页面首先针对这几个场景我们可以设置的方法有下面几个:

1.android:windowEnterTransition 首次进入显示的动画2.android:windowExitTransition 启动新 Activity ,此页面退出的动画3.android:windowReenterTransition 重新进入的动画。即第二次进入,可以和首次进入不一样。4.android:windowReturnTransition 调用 finishAfterTransition() 退出时,此页面退出的动画

即可以调用getWindow().setReenterTransition(new
Explode等,其他方法类似。
传进去的参数是效果,页面切换的动画有以下三个:1.Explode:从中心移入或移出

图片 7Explode2.Slide:从边缘移入或移出图片 8Slide3.Fade:调整透明度产生渐变图片 9Fade这些就是页面切换会设置的动画效果,这些效果还可以设置一些属性:

// 设置动画的时间。类型:long transition.setDuration(); // 设置修饰动画,定义动画的变化率,具体设置往下翻就看到了transition.setInterpolator(); // 设置动画开始时间,延迟n毫秒播放。类型:longtransition.setStartDelay(); // 设置动画的运行路径 transition.setPathMotion(); // 改变动画 出现/消失 的模式。Visibility.MODE_IN:进入;Visibility.MODE_OUT:退出。 transition.setMode(); // 设置动画的监听事件 transition.addListener()

好了,借鉴和总结了下这个,我们就进入今天的主题吧

当两个场景切换时,Transition
主要有下面两个行为:

2.共享元素动画

首先我们为了演示这个动画,我们弄了个RecyclerView,然后在点击某个item的时候加入动画,为了使用共享元素动画。1.我们首先要在setContentView方法前加入:

getWindow().requestFeature(Window.FEATURE_CONTENT_TRANSITIONS);

或者你可以直接在style文件中设置如下,然后加入Activity中去:

<item name="android:windowContentTransitions">true</item>

2.然后在要共享运动的地方加上共享元素标识,首先在A页面如下:

图片 10RecyclerView中的item_content

然后我们看下要跳转页面B的布局下面添加相同transitionName:

图片 11跳转页面的布局添加

3.现在准备工作做完了,我们现在可以在A页面启动B页面了,代码如下:

 mAdapter.setOnItemClickListener(new MyAdapter.OnItemClickListener() { @Override public void onItemClick(View view, int position) { Intent intent = new Intent(MainActivity.this,DetailActivity.class);// startActivity(intent, ActivityOptions.makeSceneTransitionAnimation(MainActivity.this,view.findViewById(R.id.ivChallenger),"sharedChallenger").toBundle; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { startActivity(intent, ActivityOptions.makeSceneTransitionAnimation(MainActivity.this, Pair.create(view.findViewById(R.id.ivChallenger),"sharedChallenger"), Pair.create(view.findViewById(R.id.tvTitle),"sharedTitle"), Pair.create(view.findViewById(R.id.tvContent),"sharedContent")).toBundle; }else{ ActivityTransitionLauncher.with(MainActivity.this).from(view.findViewById(R.id.ivChallenger)).launch; } } });

我们看到这段代码里面判断了Android的版本,为了做兼容,我们这里引入了一个兼容库,如果版本低于21的话我们就走兼容库,兼容库地址请点击,效果没有谷歌原生好,但是可以做个替代方案。然后我们看到这里会把想要共享元素的都用Pair设置进去,然后我们调用ActivityOptions的makeSceneTransitionAnimation()方法,最后用toBundle()转化为Bundle对象传给startActivity()方法即可。4.最后我们在要跳转的页面加入如下的代码:

 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {// getWindow().setEnterTransition(new Slide;//从场景的边缘移入或移出 getWindow().setEnterTransition(new Fade;//调整透明度产生渐变效果// getWindow().setEnterTransition(new Explode;//从场景的中心移入或移出 ChangeBounds changeBounds = new ChangeBounds();//改变目标视图的布局边界// ChangeTransform changeTransform = new ChangeTransform();//改变目标视图的缩放比例和旋转角度// ChangeImageTransform changeImageTransform = new ChangeImageTransform();//改变目标图片的大小和缩放比例// ChangeClipBounds changeClipBounds = new ChangeClipBounds();//裁剪目标视图边界// changeBounds.setDuration; getWindow().setSharedElementEnterTransition(changeBounds); }else{ ActivityTransition.with(getIntent.to(findViewById(R.id.ivChallenger)) .duration.start(savedInstanceState); }

同样的我们也加入了版本的判断来做兼容,这里有这么多注释掉的代码是为了大家看到共享元素的动画可以设置的动画效果有这么多。(ChangeBounds,ChangeTransform,ChangeImageTransform,ChangeClipBounds)这些效果已经注释有说明,这里就不贴出来这些效果的演示,大家可以下载我的代码然后打开看看效果。好啦。共享元素使用不是非常难,就是有兼容性问题,不过我们相信不久的将来我们会不需要做兼容了。(这里的setEnterTransition()方法和setSharedElementEnterTransition()方法同样可以在xml中设置)

(1)确定开始场景和结束场景中每个 view 的状态。

3.场景切换(TransitionManager)

这个动画也是很酷的,我也是这次弄共享元素动画时候get到的,大家可以看看,还是蛮炫的。首先我们在xml文件布局如下:

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:andro android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <FrameLayout android: android:orientation="vertical" android:layout_width="match_parent" android:layout_height="400dp"> </FrameLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal"> <Button android: android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="切换场景" /> <Button android: android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="切换场景1" /> <Button android: android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="切换场景2" /> </LinearLayout></LinearLayout>

其中FrameLayout就是到时放我们场景的地方,每个场景对应于一个布局。在代码onCreate里面我们获取每个场景代码如下:

 @RequiresApi(api = Build.VERSION_CODES.KITKAT) private void setupLayout(){ scene0 = Scene.getSceneForLayout(flScene,R.layout.detail_activity,this); scene1 = Scene.getSceneForLayout(flScene,R.layout.detail_activity_scene,this); scene2 = Scene.getSceneForLayout(flScene,R.layout.detail_activity_scene1,this); scene3 = Scene.getSceneForLayout(flScene,R.layout.detail_activity_scene2,this); }

其中第一个参数flScene是对应于容器FrameLayout的,第二个参数是场景的布局,第三个是Context。大家只要对应上去就可以了。我这里还添加了进入的动画:

 getWindow().setEnterTransition(new Slide; getWindow().getEnterTransition().addListener(new Transition.TransitionListener() { @Override public void onTransitionStart(Transition transition) { } @Override public void onTransitionEnd(Transition transition) { TransitionManager.go; } @Override public void onTransitionCancel(Transition transition) { } @Override public void onTransitionPause(Transition transition) { } @Override public void onTransitionResume(Transition transition) { } });

然后我监听了动画的执行过程,在执行完毕的时候进入到场景scene3。然后其他场景就是点击页面中的按钮中进入,分别如下:

1. TransitionManager.go(scene0, new ChangeBounds;2.//TransitionManager.go(scene1, TransitionInflater.from(TransitionManagerActivity.this)//.inflateTransition(R.transition.slide_and_changebounds)); TransitionManager.go(scene1,TransitionInflater.from(TransitionManagerActivity.this). inflateTransition(R.transition.slide_and_changebounds_sequential_with_interpolators));3. TransitionManager.go(scene2,TransitionInflater.from(TransitionManagerActivity.this) .inflateTransition(R.transition.slide_and_changebounds_sequential));

其中inflateTransition进来的动画就是跟我们共享元素支持的动画一样,我们看其中一个transition包中slide_and_changebounds_sequential.xml:

<?xml version="1.0" encoding="utf-8"?><transitionSet xmlns:andro android:duration="@integer/anim_duration_long" android:transitionOrdering="sequential"> <slide/> <changeBounds/></transitionSet>

我们看到这个就是我们前面支持动画的xml写法而已。总结:到这里我们要讲的动画已经都讲完成了,动画还得大家下载代码下来看下效果,这样印象比较深刻,希望大家都能做出Awesome
Application!!!

(2)根据状态差异创建 Animator,用以场景切换时 view 的动画。

You can leave a response, or trackback from your own site.

Leave a Reply

网站地图xml地图