Activity跳转的过渡动画全解析
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跳转的过渡动画全解析相关推荐
- Android动画全解析(三)
昨天晚上下班,公交车上没事,又翻开了老罗的博客:那两年炼就的Android内功修养,回看了下,真是又一翻心潮澎湃啊!!大概两年前,老罗的博客就成了我的必备书,没事了就翻翻,再次向罗大神致敬!!罗大神的 ...
- Vue3中实现路由跳转的过渡动画(一)
由于VueRouter官方文档写的太过抽象,真的特别不好理解,所以我来总结一下如何去更简单地理解路由跳转时的动画. 首先看一下官方对于这个概念的解释. 在刚开始学习的时候,看到黄色框框里内容直接傻眼, ...
- Flutter 动画全解析(动画四要素、动画组件、隐式动画组件原理等)
本文通过拆解 Flutter 中动画的实现方式以及原理来介绍动画实现的整个过程. 1. 动画四要素 动画在各个平台的实现原理都基本相同,是在一段时间内一系列连续变化画面的帧构成的.在 Flutter ...
- Vue中的基础过渡动画原理解析
前言 在日常开发中 动画是必不可少的一部分 不仅能让元素直接的切换显得更加自然 同时也能极大的增强用户体验 因此 在Vue之中也提供了非常强大的关于动画这方面的支持 Vue不仅支持用CSS来写一些过渡 ...
- android中的动画全解析
Android为我们提供了2中动画 一: Tween Animation 渐变动画 通过对特定对象做图像的变换,例如: 平移, 缩放,旋转, 淡入淡出 等. 二: Frame Animation 帧动 ...
- Github项目解析(九)--实现Activity跳转动画的五种方式
2019独角兽企业重金招聘Python工程师标准>>> 版权声明:本文为博主原创文章,未经博主允许不得转载. 转载请标明出处:一片枫叶的专栏 上一篇文章中我们讲解了在Activity ...
- android 页面过渡动画,Activity过渡动画的实现方法
1.使用overridePendingTransition方法实现Activity跳转动画 overridePendingTransition方法是Activity中提供的Activity跳转动画方法 ...
- Android -- 基础篇 -- Activity跳转动画的五种方式(下)
上一篇文章中我们讲解了在Activity启动过程中获取组件宽高的五种方式.在Activity的启动过程中如果我们直接在生命周期方法中通过view.getWidth()或者是view.getHeight ...
- 安卓 activity过渡动画
Activity过渡的五中实现 1.使用overridePendingTransition方法实现Activity跳转动画 overridePendingTransition方法是Activity中 ...
最新文章
- c语言程序设计分段定时器,单片机C语言编程定时器的几种表达方式
- 使用Python部署机器学习模型的10个实践经验
- 10个快速提升技术水平的方法
- Visible Lattice Points SPOJ - VLATTICE
- P3370-[模板]字符串哈希【hash】
- Pandas时间差(Timedelta)
- Oracle中的sequence对象
- colordialog通过哪属性取其颜色_IT兄弟连 HTML5教程 CSS3揭秘 CSS常见的样式属性和值1...
- 如何使用初始化列表消除冗余C++代码
- 2016年度中国会计师事务所排名前十
- 华为服务器设置raid0为系统盘,服务器设置raid0
- javascript 的 错误 异常 处理
- 3G模块驱动运用开发总结
- Ansys-瞬态热分析-水箱学习收获
- FI凭证冲销(蓝冲、红冲)和反记账后台配置
- 水晶苍蝇拍-微薄投资感悟
- 写代码后你胖了几斤?(程序员健身的独特方式)
- Rosalind Java|Consensus and Profile
- TNMT新交通排行榜
- 7-29 删除字符串中的子串