1.Android5.0以前转场动画

  • Activity
    overridePendingTransition(R.anim.activity_in, R.anim.activity_out);

  • Fragment
    supportFragmentManager.beginTransaction().setCustomAnimations(R.anim.fragment_enter, R.anim.fragment_exit);

2.从Android 5.0 之后,可以用 ActivityOptions 来实现

2.1 首先了解下Activity主要的进场和出场方法,后面会结合ActivityOptions用到

  • getWindow().setEnterTransition() 设置进场动画
  • getWindow().setExitTransition() 设置出场动画
  • getWindow().setReturnTransition() 设置返回activity时动画
  • getWindow().setReenterTransition() 设置重新进入时动画

2.2 ActivityOptions的主要方法

  • 最普通的,效果和过去的 overridePendingTransition 一样
    makeCustomAnimation(Context context, int enterResId, int exitResId)
  • 参照 Activity 上的某个 View,新 Activity 从指定大小放大到最大显示。
    makeScaleUpAnimation(View source, int startX, int startY, int startWidth, int startHeight)
  • 和makeScaleUpAnimation 的区别是,不再是放大页面上的一个 View,而是指定一张图,在转场时,放大这张图片。
    makeThumbnailScaleUpAnimation(View source, Bitmap thumbnail, int startX, int startY)
  • 一个点圆形渐变到全部显示,参数含义和 makeScaleUpAnimation 的一样
    makeClipRevealAnimation(View source, int startX, int startY, int width, int height)`
  • Scene 就是场景,两个 Activity 中的某个 View 协同完成过渡动画。
    makeSceneTransitionAnimation(Activity activity, View sharedElement, String sharedElementName)
  • Scene 就是场景,两个 Activity 中的某些 View 协同完成过渡动画。
    makeSceneTransitionAnimation(Activity activity, Pair<View, String>... sharedElements)

2.3 makeSceneTransitionAnimation 共享元素动画

  • Scene 就是场景,两个 Activity 中的某些 View(可以是Activity自身) 协同完成过渡动画。

  • 以整个Activity作为View协同完成过渡动画

Intent intent = new Intent(SharedElementActivity.this, SharedElementCommonActivity.class);
ActivityOptions activityOptions = ActivityOptions.makeSceneTransitionAnimation(SharedElementActivity.this);
startActivity(intent, activityOptions.toBundle());
// 分解
getWindow().setEnterTransition(new Explode().setDuration(2000));
getWindow().setExitTransition(new Explode().setDuration(2000));
// 滑动
getWindow().setEnterTransition(new Slide().setDuration(2000));
getWindow().setExitTransition(new Slide().setDuration(2000));
// 渐入渐出
getWindow().setEnterTransition(new Fade().setDuration(2000));
getWindow().setExitTransition(new Fade().setDuration(2000));
  • 以两个Activity中的某个View协同完成过渡动画
Intent intent = new Intent(activity, SharedElementDetailActivity.class);
ActivityOptionsCompat activityOptions = ActivityOptionsCompat.makeSceneTransitionAnimation(activity, new Pair<>(view, VIEW_NAME_IMAGE));
ActivityCompat.startActivity(activity, intent, activityOptions.toBundle());
// 设置共享动画的view
ViewCompat.setTransitionName(imageView, VIEW_NAME_IMAGE);
// 延迟共享动画的执行
postponeEnterTransition();
imageView.setBackgroundResource(R.drawable.cy_berpunk_2077_1);
// 图片加载完成后启动共享过渡动画
startPostponedEnterTransition();

2.4 如果在返回的时候共享的元素有发生变化,如何处理让动画更流程

页面A

  • Activity中通过ActivityOptionsCompat启动对应的目标Activity,传入对应的共享元素View以及元素名称
ActivityOptionsCompat options = ActivityOptionsCompat.makeSceneTransitionAnimation(MainActivity.this, view, "对应的元素flag");
startActivity(intent, options.toBundle());
  • Activity通过setExitSharedElementCallback设置在返回Activity时设置对应的view,让动画显得更自然
setExitSharedElementCallback(new SharedElementCallback() {@Overridepublic void onMapSharedElements(List<String> names, Map<String, View> sharedElements) {sharedElements.clear();names.clear();//放置对应的imageView则动画更自然sharedElements.put("对应的元素flag", imageView);}
});
  • 通过Activity中的onActivityReenter回调,获取需要展示的对应的View的标记
@Override
public void onActivityReenter(int resultCode, Intent data) {super.onActivityReenter(resultCode, data);bundle = new Bundle(data.getExtras());
}

页面B

  • Activity进入的时候设置对应的共享元素view以及共享元素flag
setEnterSharedElementCallback(new SharedElementCallback() {@Overridepublic void onMapSharedElements(List<String> names, Map<String, View> sharedElements) {sharedElements.clear();sharedElements.put("对应的元素flag", view);}
})
  • 延缓动画执行,可以等待资源准备好之后开启动画
supportPostponeEnterTransition();
  • 退出的时候需要通知A页面需要配合的元素信息
 @TargetApi(22)@Overridepublic void supportFinishAfterTransition() {Intent data = new Intent();data.putExtra("index", mPager.getCurrentItem());setResult(RESULT_OK, data);super.supportFinishAfterTransition();}@Overridepublic void onBackPressed() {Intent data = new Intent();data.putExtra("index", mPager.getCurrentItem());setResult(RESULT_OK, data);super.supportFinishAfterTransition();}
  • 开启动画
supportStartPostponedEnterTransition();
  • 在动画结束后关闭
supportFinishAfterTransition()

android转场动画总结相关推荐

  1. android 转场动画 监听,Android 中的转场动画及兼容处理

    Android 中的动画有很多,除了在一个界面上使用帧动画.属性动画将一个或多个 View 进行动画处理以外,还可以用于两个界面之间过渡.跳转.在 Android 5.0 之前,我们已经有了 over ...

  2. Android转场动画(View Activity ARouter)

    为什么要使用转场动画?在页面切换或者UI展示的时候,如果没有设计转场动画,那么状态场景的切换就是瞬间发生的,这样就非常突兀,没有视觉效果,所以在App开发的过程中,设计转场动画,是必不可少的. 1.揭 ...

  3. android 转场动画 共享元素,关于android:四步通过Glide实现共享元素无缝转场效果...

    读完这篇文章, 你就会晓得应用Glide等图片加载库实现共享元素转场成果,以及如何解决各种可能加载状态.通过共享转场动画,能够晋升利用交互体验,让用户应用起来更愉悦. 共享元素转场成果是Materia ...

  4. android转场动画,让你的APP瞬间绚丽起来

    友好的交互体验能够吸引眼球,android API 21(5.0)后系统内置了Activity之间的切换动画,不仅可以让用户看起来舒服,而且实现起来也特别简单. 一.通过overridePending ...

  5. 腾讯T7手记:Android转场动画的前世今生!

    前一段时间做图片查看器的升级时,在打开图片查看器的时,找不到好的过渡方式. 有位大佬给我推荐了Android最新的Material Motion动画,虽然最终没有给我们的App安排,但给我学习Mate ...

  6. Android转场动画,Avtivity转场动画;

    转场动画 - 共享元素动画 先看效果: Activity1点击小图标开启Activity2: 开启Activity2效果就像是小图标放大了填充上去的,关闭Activity2回到Activity1时又像 ...

  7. android 元素共享动画,android转场动画--共享元素(Shared Element)

    什么是共享元素呢?可以理解为当页面跳转是,看起来一个View属于界面A又属于界面B. 看一下下边这个效果: 在这个转场动画中,图片和文字都是共享元素,具体怎么实现这种效果呢? Step1 首先需要先在 ...

  8. 高逼格Android转场动画

    前言 转场动画在交互上非常有优势,本文从转场动画的使用场景和方法起,最后是实现掘金中用户头像的转场动画. 转场动画适用的版本 Activity transition APIs 只有在Android 5 ...

  9. 高逼格Android转场动画,轻松实现掘金用户头像转场动画

    前言 转场动画在交互上非常有优势,本文从转场动画的使用场景和方法起,最后是实现掘金中用户头像的转场动画. 转场动画适用的版本 Activity transition APIs 只有在Android 5 ...

最新文章

  1. Android DataBinding 入门了解 到实现一个buttton的点击事件
  2. 树和二叉树(四种遍历,建树)详解+二叉排序树(包含图像和相关习题)
  3. Ensemble Methods——python
  4. 中国古代天文星象学的入门书:《步天歌》
  5. 选项卡,下拉菜单操做时的页面数据更新,highcharts,d3 结合。
  6. python贪吃蛇源码_Python:游戏:贪吃蛇(附源码)
  7. Web Api 内部数据思考 和 利用http缓存优化 Api
  8. 隐藏了十年的 Sudo 漏洞曝出:无需密码就能获取 root 权限
  9. 系统学习深度学习(二十七)--CTC
  10. offset Dimensions 详解
  11. 强连通分量的一种类 Tarjan 算法以及Tarjan算法推导初探
  12. ios和Android的PK
  13. MySql使用if语句例子
  14. 一级网站域名与二级域名的区别,如何注册网站一级域名
  15. mac 破解安装 navicat
  16. 关于AIX上VMO调整参数的若干说明
  17. 健身环1536级小结:相当适合码农的锻炼方式
  18. TI Zigbee Light Link 参考设计
  19. 如何查Unity3D编辑器崩溃原因
  20. SQLAlchemy学习教程

热门文章

  1. 打开 McAfee VirusScan v8.5i 的“访问保护”时请慎重
  2. Spring Security(一)
  3. 易优cms首页被劫持后台进不去怎么办
  4. Linux 命令(文件和目录管理 - zip/unzip)
  5. image 微信小程序flex_微信小程序flex布局案例(1)
  6. 五年java开发面经分享,注意这些细节让你offer拿到手软
  7. 2022年中级会计实务考试复习题及答案
  8. CentOS搭建sock5和pptp服务器
  9. 直尺刻度识别_在线尺子
  10. matlab调用函数出错,[MATLAB基础] matlab 调用函数老是出错怎么回事??高手请指点一下...