ActivityOptionsCompat

前因:

//在旧版本里面,我们切换Activity大多都是使用的api
overridePendingTransition(enterAnim, exitAnim);
但是,这个效果显得太过生硬

引出:

google在V4 support包内提供了一个向下兼容的类,供我们使用,ActivityOptionsCompat,我们可以使用这个类开发出很绚丽的跳转效果。

API:

//类似于overridePendingTransition的功能,为两个activity设置了过渡动画;
ActivityOptionsCompat.makeCustomAnimation (Context context, int enterResId, int exitResId)
//新的activity产生一个缩放的动画,后两个参数是被打开的act的初始宽度和高度
ActivityOptionsCompat.makeScaleUpAnimation(View source, int startX,int startY, int width,int height)
//利用传入了view开启一个缩放动画
ActivityOptionsCompat.makeThumbnailScaleUpAnimation(View source,
Bitmap thumbnail, int startX, int startY)
//共享元素动画,api>=21可以使用

Demo:

public class MainActivity extends AppCompatActivity {@BindView(R.id.old)Button mOld;@BindView(R.id.btn_custom)Button mBtnCustom;@BindView(R.id.btn_scaleup)Button mBtnScaleup;@BindView(R.id.btn_ThumbnailScaleUp)Button mBtnThumbnailScaleUp;@BindView(R.id.btn_Scene)Button mBtnScene;@BindView(R.id.btn_Scenes)Button mBtnScenes;@BindView(R.id.imageView_right)ImageView mImageViewRight;@BindView(R.id.imageView_left)ImageView mImageViewLeft;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);if (Build.VERSION.SDK_INT >= 21) {//共享元素动画只支持5.0以后的版本getWindow().requestFeature(Window.FEATURE_CONTENT_TRANSITIONS);}setContentView(R.layout.activity_main);ButterKnife.bind(this);}@OnClick({R.id.old, R.id.btn_custom, R.id.btn_scaleup, R.id.btn_ThumbnailScaleUp, R.id.btn_Scene, R.id.btn_Scenes})public void onClick(View view) {switch (view.getId()) {case R.id.old: {Intent intent = new Intent(this, TargetActivity.class);startActivity(intent);overridePendingTransition(R.anim.in, R.anim.out);}break;case R.id.btn_custom: {ActivityOptionsCompat activityOptionsCompat = ActivityOptionsCompat.makeCustomAnimation(this, R.anim.in, R.anim.out);Intent intent = new Intent(this, TargetActivity.class);ActivityCompat.startActivity(this, intent, activityOptionsCompat.toBundle());}break;case R.id.btn_scaleup: {ActivityOptionsCompat activityOptionsCompat = ActivityOptionsCompat.makeScaleUpAnimation(mBtnScaleup, 0, 0, 200, 200);Intent intent = new Intent(this, TargetActivity.class);ActivityCompat.startActivity(this, intent, activityOptionsCompat.toBundle());}break;case R.id.btn_ThumbnailScaleUp: {Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher_round);ActivityOptionsCompat activityOptionsCompat = ActivityOptionsCompat.makeThumbnailScaleUpAnimation(mBtnThumbnailScaleUp, bitmap, 0, 0);Intent intent = new Intent(this, TargetActivity.class);ActivityCompat.startActivity(this, intent, activityOptionsCompat.toBundle());}break;case R.id.btn_Scene: {//ActivityOptionsCompat activityOptionsCompat = ActivityOptionsCompat.makeSceneTransitionAnimation(this, mImageViewLeft, "element");Intent intent = new Intent(this, TargetActivity.class);ActivityCompat.startActivity(this, intent, activityOptionsCompat.toBundle());}break;case R.id.btn_Scenes: {Pair<View, String> element = Pair.create((View)mImageViewLeft, "element");Pair<View, String> element2 = Pair.create((View)mImageViewRight, "element2");ActivityOptionsCompat activityOptionsCompat = ActivityOptionsCompat.makeSceneTransitionAnimation(this, element, element2);Intent intent = new Intent(this, TargetActivity.class);ActivityCompat.startActivity(this, intent, activityOptionsCompat.toBundle());}break;}}
}

被打开的activity的布局

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
    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"tools:context="com.junx.activitytransitionanimation.TargetActivity"><Button
        //类型不重要,只要android:transitionName相同就会被关联到一起android:transitionName="element2"android:layout_width="wrap_content"android:layout_height="wrap_content" android:layout_marginBottom="8dp"android:layout_marginLeft="8dp"android:layout_marginRight="8dp"android:layout_marginTop="8dp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintLeft_toLeftOf="parent"app:layout_constraintRight_toRightOf="parent"app:layout_constraintTop_toTopOf="parent" app:layout_constraintVertical_bias="0.13"app:srcCompat="@mipmap/ic_launcher_round"/><Button
        android:layout_width="200dp" android:layout_height="200dp"android:layout_marginBottom="8dp"android:layout_marginLeft="8dp"android:layout_marginRight="8dp" android:layout_marginTop="8dp"android:transitionName="element" app:layout_constraintBottom_toBottomOf="parent"app:layout_constraintHorizontal_bias="0.5" app:layout_constraintLeft_toLeftOf="parent"app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toTopOf="parent"app:srcCompat="@mipmap/ic_launcher_round"/>
</android.support.constraint.ConstraintLayout>

Scene动画

什么叫做场景(Scene)?场景就是一个布局或部分布局,我们可以使用场景来创建动画。google 在旧版本的系统中提供了View Animation与Propery Animator,两套动画系统能够使开发者方便的完成动画的显示,但是为了实现一些效果,开发者仍需要编写大量的代码进行完成。因为我们常常使用的位移、隐藏等动画,在5.0版本以后,开发人员只要写好布局,动画系统会自动的把相应的动画显示出来,大大的减少重复的代码开发的工作量。
场景需要api19(android4.4)以上版本才能使用

demo

布局一

<android.support.constraint.ConstraintLayout
    android:id="@+id/layout"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"tools:context="com.junx.activitytransitionanimation.Transition.Scene.SceneActivity"><ImageView
        android:id="@+id/imageView4"android:layout_width="50dp"android:layout_height="50dp"android:layout_marginBottom="0dp"android:src="@mipmap/ic_launcher_round"app:layout_constraintBottom_toTopOf="@+id/imageView3"app:layout_constraintTop_toTopOf="parent"app:layout_constraintVertical_bias="1.0"android:layout_marginLeft="8dp" app:layout_constraintLeft_toLeftOf="parent"app:layout_constraintRight_toLeftOf="@+id/imageView3" android:layout_marginRight="0dp"app:layout_constraintHorizontal_bias="1.0"/><ImageView
        android:src="@mipmap/ic_launcher_round"android:id="@+id/button"android:layout_width="50dp"android:layout_height="50dp"app:layout_constraintRight_toRightOf="parent"app:layout_constraintTop_toTopOf="parent"android:layout_marginBottom="0dp" app:layout_constraintBottom_toTopOf="@+id/imageView3"app:layout_constraintVertical_bias="1.0"app:layout_constraintLeft_toRightOf="@+id/imageView3" android:layout_marginLeft="0dp"app:layout_constraintHorizontal_bias="0.0"/><ImageView
        android:id="@+id/imageView3"android:layout_width="50dp"android:layout_height="50dp"android:layout_marginBottom="0dp"android:src="@mipmap/ic_launcher_round" app:layout_constraintBottom_toTopOf="@+id/imageView2"app:layout_constraintLeft_toLeftOf="parent"app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toTopOf="parent"app:layout_constraintVertical_bias="1.0"/><ImageView
        android:id="@+id/imageView2"android:layout_width="50dp"android:layout_height="50dp"android:layout_marginBottom="0dp"android:src="@mipmap/ic_launcher_round" app:layout_constraintBottom_toTopOf="@+id/imageView"app:layout_constraintLeft_toLeftOf="parent"app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toTopOf="parent"app:layout_constraintVertical_bias="1.0"/><ImageView
        android:id="@+id/imageView"android:layout_width="50dp"android:layout_height="50dp"android:src="@mipmap/ic_launcher_round"app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintLeft_toLeftOf="parent"app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toTopOf="parent"app:layout_constraintVertical_bias="1.0"/><Button
        android:id="@+id/btn"android:onClick="go"android:layout_width="wrap_content"android:layout_height="wrap_content" android:text="Button"app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintLeft_toLeftOf="parent"app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toTopOf="parent"/>
</android.support.constraint.ConstraintLayout>

布局二,跟布局一的区别只有控件的位置和大小

<android.support.constraint.ConstraintLayout
    android:id="@+id/layout"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"tools:context="com.junx.activitytransitionanimation.Transition.Scene.SceneActivity"><ImageView
        android:id="@+id/imageView4"android:layout_width="50dp"android:layout_height="50dp"android:layout_marginBottom="0dp"android:src="@mipmap/ic_launcher_round"app:layout_constraintBottom_toTopOf="@+id/imageView3"app:layout_constraintTop_toTopOf="parent"app:layout_constraintVertical_bias="1.0"android:layout_marginLeft="8dp" app:layout_constraintLeft_toLeftOf="parent"app:layout_constraintRight_toLeftOf="@+id/imageView3" android:layout_marginRight="0dp"app:layout_constraintHorizontal_bias="0.0"/><ImageView
        android:src="@mipmap/ic_launcher_round"android:id="@+id/button"android:layout_width="50dp"android:layout_height="50dp"app:layout_constraintRight_toRightOf="parent"app:layout_constraintTop_toTopOf="parent"android:layout_marginBottom="0dp" app:layout_constraintBottom_toTopOf="@+id/imageView3"app:layout_constraintVertical_bias="1.0"app:layout_constraintLeft_toRightOf="@+id/imageView3" android:layout_marginLeft="0dp"app:layout_constraintHorizontal_bias="1.0"/><ImageView
        android:id="@+id/imageView3"android:layout_width="50dp"android:layout_height="50dp"android:src="@mipmap/ic_launcher_round"app:layout_constraintLeft_toLeftOf="parent"app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toTopOf="parent"android:layout_marginBottom="8dp" app:layout_constraintBottom_toTopOf="@+id/button2"/><ImageView
        android:id="@+id/imageView2"android:layout_width="50dp"android:layout_height="50dp"android:src="@mipmap/ic_launcher_round"app:layout_constraintLeft_toLeftOf="parent"app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toTopOf="parent"app:layout_constraintHorizontal_bias="0.0" app:layout_constraintBottom_toBottomOf="parent"android:layout_marginBottom="0dp" app:layout_constraintVertical_bias="1.0"/><ImageView
        android:id="@+id/imageView"android:layout_width="50dp"android:layout_height="50dp"android:src="@mipmap/ic_launcher_round"app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintLeft_toLeftOf="parent"app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toTopOf="parent"app:layout_constraintVertical_bias="1.0" app:layout_constraintHorizontal_bias="1.0"/><Button
        android:onClick="go"android:id="@+id/btn"android:layout_width="wrap_content"android:layout_height="wrap_content" android:text="Button"app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintLeft_toLeftOf="parent"app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toTopOf="parent"/>
</android.support.constraint.ConstraintLayout>

代码

public class SceneActivity extends AppCompatActivity {@BindView(R.id.btn)Button mButton;@BindView(R.id.layout)ConstraintLayout mLayout;Scene mScene1;Scene mScene2;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);getWindow().requestFeature(Window.FEATURE_CONTENT_TRANSITIONS);setContentView(R.layout.activity_scene);ButterKnife.bind(this);//通过该方法获取布局中的scene,第一个参数是根布局mScene1 = Scene.getSceneForLayout(mLayout, R.layout.activity_scene2, this);mScene2 = Scene.getSceneForLayout(mLayout, R.layout.activity_scene, this);}int x = 0;public void go(View view) {if (x % 2 == 0) {//第二个参数是动画类型,默认是淡入淡出效果TransitionManager.go(mScene1,new Slide());} else {TransitionManager.go(mScene2, new ChangeBounds());}x++;}
}

修改参数的动画效果

    public void go(View view) {//开始动画TransitionManager.beginDelayedTransition(mLayout);//参数改变后会自动生成动画mButton.setHeight(300);mButton.setWidth(300);}
//recyclerview也可以TransitionManager.beginDelayedTransition(recyclerView, explode);recyclerView.setAdapter(null);

Scene动画也是支持页面跳转der~~~

public class TransitionAndActivity extends AppCompatActivity {@Overrideprotected void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);if (Build.VERSION.SDK_INT >= 21) {//1 跳转使用的transitionExplode explode = new Explode();//            Slide slide = new Slide(Gravity.RIGHT);//            slide.setDuration(2000);//让我们的页面支持transitionTransitionInflater inflater = TransitionInflater.from(this);Transition transition = inflater.inflateTransition(R.transition.over);getWindow().requestFeature(Window.FEATURE_CONTENT_TRANSITIONS);//页面退出的tristiongetWindow().setExitTransition(explode);}setContentView(R.layout.activity_and_transition);}public void explose(View view) {Intent intent = new Intent();intent.setClass(this, TestExploseActivity.class);
//        startActivity(intent);startActivity(intent, ActivityOptions.makeSceneTransitionAnimation(this).toBundle());}
}

api:

Transition 与 Activity的跳转动画有以下几个
setEnterTransition 进入的动画
setExitTransition 退出的动画
setReturnTransition 返回的动画
setReenterTransition 重入的动画

Activity跳转的过渡动画全解析相关推荐

  1. Android动画全解析(三)

    昨天晚上下班,公交车上没事,又翻开了老罗的博客:那两年炼就的Android内功修养,回看了下,真是又一翻心潮澎湃啊!!大概两年前,老罗的博客就成了我的必备书,没事了就翻翻,再次向罗大神致敬!!罗大神的 ...

  2. Vue3中实现路由跳转的过渡动画(一)

    由于VueRouter官方文档写的太过抽象,真的特别不好理解,所以我来总结一下如何去更简单地理解路由跳转时的动画. 首先看一下官方对于这个概念的解释. 在刚开始学习的时候,看到黄色框框里内容直接傻眼, ...

  3. Flutter 动画全解析(动画四要素、动画组件、隐式动画组件原理等)

    本文通过拆解 Flutter 中动画的实现方式以及原理来介绍动画实现的整个过程. 1. 动画四要素 动画在各个平台的实现原理都基本相同,是在一段时间内一系列连续变化画面的帧构成的.在 Flutter ...

  4. Vue中的基础过渡动画原理解析

    前言 在日常开发中 动画是必不可少的一部分 不仅能让元素直接的切换显得更加自然 同时也能极大的增强用户体验 因此 在Vue之中也提供了非常强大的关于动画这方面的支持 Vue不仅支持用CSS来写一些过渡 ...

  5. android中的动画全解析

    Android为我们提供了2中动画 一: Tween Animation 渐变动画 通过对特定对象做图像的变换,例如: 平移, 缩放,旋转, 淡入淡出 等. 二: Frame Animation 帧动 ...

  6. Github项目解析(九)--实现Activity跳转动画的五种方式

    2019独角兽企业重金招聘Python工程师标准>>> 版权声明:本文为博主原创文章,未经博主允许不得转载. 转载请标明出处:一片枫叶的专栏 上一篇文章中我们讲解了在Activity ...

  7. android 页面过渡动画,Activity过渡动画的实现方法

    1.使用overridePendingTransition方法实现Activity跳转动画 overridePendingTransition方法是Activity中提供的Activity跳转动画方法 ...

  8. Android -- 基础篇 -- Activity跳转动画的五种方式(下)

    上一篇文章中我们讲解了在Activity启动过程中获取组件宽高的五种方式.在Activity的启动过程中如果我们直接在生命周期方法中通过view.getWidth()或者是view.getHeight ...

  9. 安卓 activity过渡动画

    Activity过渡的五中实现 1.使用overridePendingTransition方法实现Activity跳转动画  overridePendingTransition方法是Activity中 ...

最新文章

  1. c语言程序设计分段定时器,单片机C语言编程定时器的几种表达方式
  2. 使用Python部署机器学习模型的10个实践经验
  3. 10个快速提升技术水平的方法
  4. Visible Lattice Points SPOJ - VLATTICE
  5. P3370-[模板]字符串哈希【hash】
  6. Pandas时间差(Timedelta)
  7. Oracle中的sequence对象
  8. colordialog通过哪属性取其颜色_IT兄弟连 HTML5教程 CSS3揭秘 CSS常见的样式属性和值1...
  9. 如何使用初始化列表消除冗余C++代码
  10. 2016年度中国会计师事务所排名前十
  11. 华为服务器设置raid0为系统盘,服务器设置raid0
  12. javascript 的 错误 异常 处理
  13. 3G模块驱动运用开发总结
  14. Ansys-瞬态热分析-水箱学习收获
  15. FI凭证冲销(蓝冲、红冲)和反记账后台配置
  16. 水晶苍蝇拍-微薄投资感悟
  17. 写代码后你胖了几斤?(程序员健身的独特方式)
  18. Rosalind Java|Consensus and Profile
  19. TNMT新交通排行榜
  20. 7-29 删除字符串中的子串

热门文章

  1. 智能小车之PWM脉冲控制小车调速
  2. 使用飞凌嵌入式IMX6UL-C1板子——qt+opencv环境搭建
  3. 期货开户供求平衡周而复始
  4. Linux桌面两大阵营 GNOME与KDE的战争
  5. Android 手机克隆/一键换机原理初探
  6. lora 与 485 双线备份式通讯
  7. 数据治理之数据标准管理
  8. shell 脚本示例
  9. 莫拉蒂致天堂里法切蒂公开信
  10. 六大数据统计图——Python的数据可视化