终于到了material design转场动画中最好玩,最有特色的一部分了。我们沿用上一篇的图,不过将跳转Activity的代码作如下更改:

 Intent intent = new Intent(this,BBBActivity.class);
ActivityOptionsCompat activityOptionsCompat =ActivityOptionsCompat.makeSceneTransitionAnimation(this, new Pair<View, String>(shared_image, "shared_image_"), new Pair<View, String>(shared_text, "shared_text_"));
startActivity(intent, activityOptionsCompat.toBundle());复制代码

然后在BBBActivity的布局文件想要设置共享元素的部分设置android:transitionName,值和上个页面中设置的值要一一对应,比如:

 <TextViewandroid:id="@+id/tv_show"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="我是一行文字"android:transitionName="shared_text_"/>复制代码

当然也可以在代码中设置(注意要在调用时机,不能晚于OnResume):
shared_image.setTransitionName("shared_image_");

这样简单两步,咱们的带共享元素的转场动画就改造完成了:

自定义共享元素动画

自带的共享元素动画很简单,可以通过如下代码定义进入和返回动画:

 getWindow().setSharedElementEnterTransition(Transition transition) getWindow().setSharedElementReturnTransition(Transition transition)复制代码

仔细一看这两个方法都只需要一个transition作为动画,所以意味着自定义共享元素动画就是自定义Transition了。套用第一篇自定义的那个直角移动ChangeRect,效果如下:

其他方法

上面我们只用两个方法就完成了一次完整的共享元素进入到返回动画。但其实和普通的转场动画一样,设置共享元素的转场动画有四个,除了上面介绍的还有两个就是

setSharedElementExitTransition
setSharedElementReenterTransition复制代码

看命名方式和普通的转场动画非常相似,也就是共享元素离开和重现动画的方法。但是共享元素转场是为了表现两个页面相似内容连贯性而设计的,一组动画就足以完成了。但如果我们都加上后会怎么样呢?为了动画更明显,我们把普通动画设为串行:

可以看到新增的两个并没有生效,通过日志打印也可以卡出这一点:

SharedElementExitTransition和SharedElementReenterTransition开始后立即就结束了。关于这一点,参看stackoverflow上的回答,简单来说这两个动画的设计只是为了作一些初始化而存在的。当我们点击跳转按钮的时候,马上就已经跳到了B(参看上一篇生命周期的分析),而共享元素动画没有所谓的串行机制,会马上执行SharedElementEnterTransition,所以转场动画内部会立即结束掉ExitTransition。而ReenterTransition我们也可以从gif图看到,SharedElementReturnTransition已经完成了动画,将目标View变为目标状态,所以不再进行SharedElementReturnTransition(也因为没必要),所以只进行了普通转场动画的ReenterTransition。

共享元素执行空间

Window中有个关于共享元素的设置setSharedElementsUseOverlay(boolean sharedElementsUseOverlay),我们将其设为false,重启App:

可以看到动画执行流程没有变但是共享元素在移动过程中被遮住了,我们来看源码

  protected void moveSharedElementsToOverlay() {if (mWindow == null || !mWindow.getSharedElementsUseOverlay()) {return;}setSharedElementMatrices();int numSharedElements = mSharedElements.size();ViewGroup decor = getDecor();if (decor != null) {boolean moveWithParent = moveSharedElementWithParent();Matrix tempMatrix = new Matrix();for (int i = 0; i < numSharedElements; i++) {View view = mSharedElements.get(i);tempMatrix.reset();mSharedElementParentMatrices.get(i).invert(tempMatrix);GhostView.addGhost(view, decor, tempMatrix);ViewGroup parent = (ViewGroup) view.getParent();if (moveWithParent && !isInTransitionGroup(parent, decor)) {GhostViewListeners listener = new GhostViewListeners(view, parent, decor);parent.getViewTreeObserver().addOnPreDrawListener(listener);mGhostViewListeners.add(listener);}}}}复制代码

可以看到,如果getSharedElementsUseOverlay==true(也就是默认状态),系统会得到这个View,然后GhostView.addGhost(view, decor, tempMatrix),放置在decorView的Overlay上,因为是decorView,所以也就是在整个view树结构的最上层。Overlay它是view的最上面的一个透明的层,添加到上面的和view不会被其他View遮挡住。

拓展:共享元素形变动画

前面的动画效果都是操作View原有的一些属性,View的内容没有(或者内容没有改变),所以如果与Svg矢量动画配合一番,会产生怎么样的效果呢:

其实很简单,监听SharedElementEnterTransition和SharedElementReturnTransition动画,在其执行的时候执行矢量动画就行了。在更多关于这个矢量动画实现的东西可以参考这篇文章。

写在最后

好了关于Android转场动画的内容完结了,代码已上传gitHub,欢迎指正!

Android转场动画深度解析(3)相关推荐

  1. android nfc标签类型,Android NFC标签 开发深度解析 触碰的艺术

    原标题:Android NFC标签 开发深度解析 触碰的艺术 本文来自于CSDN博客,作者:郭朝,已获授权,版权归原作者所有,未经作者同意,请勿转载. 欢迎同有博客好文章的作者加微信(ID:tm_fo ...

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

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

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

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

  4. android面试题(深度解析)

    1.activity的生命周期. 方法 描述 可被杀死 下一个 onCreate() 在activity第一次被创建的时候调用.这里是你做所有初始化设置的地方──创建视图.设置布局.绑定数据至列表等. ...

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

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

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

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

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

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

  8. android转场动画总结

    1.Android5.0以前转场动画 Activity overridePendingTransition(R.anim.activity_in, R.anim.activity_out); Frag ...

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

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

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

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

最新文章

  1. php heahd,heaheader phpder 详解
  2. 联想员工亲历联想大裁员:公司不是家
  3. Microservice Anti-patterns
  4. node-rsa加密,java解密调试
  5. python 爬取作品集_Python批量抓取站酷ZCOOL作品图片并归档
  6. redis nosql_Redis教程:NoSQL键值存储
  7. jquery ready方法实现原理
  8. 关于React中状态保存的研究
  9. 信息收集之域名、IP互查
  10. Ubuntu上: insufficient permissions for device解决
  11. 上海电力大学本科毕业论文答辩PPT模板
  12. 普通高中信息技术课程标准( 必修 选修科目)
  13. 用python的matplotlib和numpy库绘制股票K线均线
  14. 秀米推文添加附件的方法
  15. S3C6410启动方式
  16. 2020 对自己好一点之新 Mac Book Pro 环境的安装
  17. 如何查找app启动页面
  18. 百度炮轰Google搜索不创新 拟全力进攻云搜索
  19. python获取路由器信息_python 3.5实现检测路由器流量并写入txt的方法实例
  20. 什么是缺陷密度?计算的公式及示例

热门文章

  1. RGB绘制图片Python
  2. 二分法查找——C++代码
  3. Machine Learning ——Homework 8
  4. CryoSat-2数据下载
  5. python基本数据类型——整型,浮点型,复数,字符串
  6. Matlab半方差函数/变异函数
  7. ArcGIS设置默认金字塔弹出框
  8. 日照百分率建模及模拟
  9. 补码转源码 吐血总结
  10. java after 函数_函数周期表丨信息丨值丨ISONORAFTER