谷歌官方文档 给了一个 通过共享元素启动Activity的Demo
Demo很流畅,图片过渡很自然,但是由于两个页面的TextView大小不同(颜色不同会更加突兀),在动画开始和结束的时候TextView变化很突兀。
这篇博客在共享元素的基础上进一步自定义TextView的动画,使之过度更加自然

谷歌Demo效果展示

改进后效果展示

官方调用

这里不分析源码是怎么实现的,因为我还没彻底搞懂……
所以只简单贴一下调用方法
从ActivityA启动ActivityB时设置共享元素imageview_item和textview_name
ActivityA.java

Intent intent = new Intent(MainActivity.this, DetailActivity.class);intent.putExtra(DetailActivity.EXTRA_PARAM_ID, item.getId());ActivityOptionsCompat activityOptions = ActivityOptionsCompat.makeSceneTransitionAnimation(MainActivity.this,new Pair<>(view.findViewById(R.id.imageview_item),DetailActivity.VIEW_NAME_HEADER_IMAGE),new Pair<>(view.findViewById(R.id.textview_name),DetailActivity.VIEW_NAME_HEADER_TITLE));ActivityCompat.startActivity(MainActivity.this, intent, activityOptions.toBundle());

同样在ActivityB中也设置这两个共享元素

    private ImageView mHeaderImageView;private TextView mHeaderTitle;@Overrideprotected void onCreated(Bundle saveInstanceState){...HeaderImageView = findViewById(R.id.imageview_header);mHeaderTitle = findViewById(R.id.textview_title);   ViewCompat.setTransitionName(mHeaderImageView, VIEW_NAME_HEADER_IMAGE);ViewCompat.setTransitionName(mHeaderTitle, VIEW_NAME_HEADER_TITLE);...}

就这么简单。具体代码去看谷歌Demo

但是因为Demo中的textview这个共享元素在两个页面的字体不一样,所以过度很突兀

页面跳转共享元素动画实际上是先加载好ActivityB的textview,然后开始动画,所以看到在进入动画的时候,textview的字体样式突然变成了ActivityB的样式

自定义Transition

ActivityA的代码不变
ActivityB的代码略作修改

private ImageView mHeaderImageView;
private TextView mHeaderTitle;@Override
protected void onCreate(Bundle savedInstanceState) {...mHeaderImageView = findViewById(R.id.imageview_header);mHeaderTitle = findViewById(R.id.textview_title);ViewCompat.setTransitionName(mHeaderImageView, VIEW_NAME_HEADER_IMAGE);ViewCompat.setTransitionName(mHeaderTitle, VIEW_NAME_HEADER_TITLE);// 配置启动动画的属性configEnterExitAnimation(true);// 推迟动画启动postponeEnterTransition();... // 这里加载所需的数据// 数据加载好后启动动画startPostponedEnterTransition();
}

配置enter和exit的动画属性

private void configEnterExitAnimation(boolean isEnter) {// 文字大小和颜色动画TextviewTransition textviewTransition = new TextviewTransition(isEnter);textviewTransition.addTarget(R.id.textview_title);// 文字位置动画ChangeBounds textviewChangeBounds = new ChangeBounds();textviewChangeBounds.addTarget(R.id.textview_title);// ImageView位置动画ChangeBounds imageChangeBounds = new ChangeBounds();imageChangeBounds.addTarget(VIEW_NAME_HEADER_IMAGE);TransitionSet set = new TransitionSet().addTransition(textviewTransition).addTransition(textviewChangeBounds).addTransition(imageChangeBounds).setDuration(1500); // 这里把动画时长调成1.5s,过度效果更明显this.getWindow().setSharedElementEnterTransition(set);
}

自定义的TextView的Transition类,用来管理文字颜色和大小的动画过度

class TextviewTransition extends Transition {private boolean mIsEnter = true;   public TextviewTransition(boolean isEnter) {mIsEnter = isEnter;}@Overridepublic void captureStartValues(TransitionValues transitionValues) {}@Overridepublic void captureEndValues(TransitionValues transitionValues) {}@Overridepublic Animator createAnimator(ViewGroup sceneRoot, TransitionValues startValues, TransitionValues endValues) {if (startValues == null || endValues == null) {return null;}return createEnterAnimator(startValues, endValues);}private Animator createEnterAnimator(TransitionValues startValues, TransitionValues endValues) {// 文字大小过度动画ObjectAnimator textSizeAnimator = ObjectAnimator.ofFloat((TextView) startValues.view,new Property<TextView, Float>(Float.class, "textSize") {@Overridepublic void set(TextView object, Float value) {object.setTextSize(TypedValue.COMPLEX_UNIT_PX, value);}@Overridepublic Float get(TextView object) {return object.getTextSize();}},mIsEnter ? getResources().getDimensionPixelOffset(R.dimen.text_size_start) :getResources().getDimensionPixelOffset(R.dimen.text_size_end),mIsEnter ? getResources().getDimensionPixelOffset(R.dimen.text_size_end) :getResources().getDimensionPixelOffset(R.dimen.text_size_start));// 文字颜色过度动画ObjectAnimator textColorAnimator = ObjectAnimator.ofArgb((TextView) startValues.view,new Property<TextView, Integer>(Integer.class, "textColor") {@Overridepublic void set(TextView object, Integer value) {object.setTextColor(value);}@Overridepublic Integer get(TextView object) {return object.getCurrentTextColor();}},mIsEnter ? getResources().getColor(R.color.start_color, null) :getResources().getColor(R.color.end_color, null),mIsEnter ? getResources().getColor(R.color.end_color, null) :getResources().getColor(R.color.start_color, null));AnimatorSet animatorSet = new AnimatorSet();animatorSet.playTogether(textSizeAnimator, textColorAnimator);return animatorSet;}
}

简单分析下就是TextviewTransition类中包含了两个动画,一个是TextView的大小,另一个是TextView的颜色
然后整体的页面过度动画TransitionSet又包含三个:TextView大小颜色动画(TextviewTransition)、TextView大小和位置动画ImageView大小和位置动画。这样就能在谷歌Demo的基础上让文字过度更加自然。(这里没有处理字重过度的问题 ,感兴趣可以去拓展)

ChangeBounds: View的大小与位置动画
ChangeTransform: View的缩放与旋转动画
ChangeClipBounds: View的裁剪区域(View.getClipBounds())动画
ChangeScroll: 处理View的scrollX与scrollY属性
ChangeImageTransform: 处理ImageView的ScaleType属性
参考简书

效果不是很完美(包括字重过度、动画启动结束时TextView内容换行问题),但已经实现了TextView大小和动画的过度。

项目代码已传GitHub

【Android】共享元素 share elements TextView颜色大小动画过度相关推荐

  1. android共享元素动画_Android共享元素过渡动画

    android共享元素动画 In this tutorial we'll implement a different kind of animation transition namely Share ...

  2. android+场景切换,Android共享元素场景切换动画的实现

    今天跟大家分享的是场景切换的共享元素,源码已经上传到github: 我们知道安卓5.0系统引入了共享元素,能做出非常炫酷的场景切换效果,这让人非常兴奋同时非常蛋疼,因为低版本没法使用啊,所以今天就跟大 ...

  3. android共享元素动画兼容低版本

    文章目录 共享元素动画 5.0以上系统方案 详细代码流程 5.0以下兼容方案 简述流程 详细代码流程 上篇: activity转场动画 一款APP让人赏心悦目的APP,动画是它并不可少的部分,Andr ...

  4. Android 共享元素动画

    Andriod 5.0及之后,开始支持共享元素动画,该动画主要用于两个activity之间,两个Activity可以共享某些控件,Activity A跳转到Activity B的时候,A的某个控件能自 ...

  5. Android:安卓学习笔记之共享元素的简单理解和使用

    Android 共享元素的简单理解和使用 1 .基本概念 2.基本使用 1.Activity to Activity跳转实现 1.1.使用步骤 1.2.案例说明 2.Fragment to Fragm ...

  6. android 延时播放动画,HollyTransition: 让APP丝滑般流畅:深入解读Android过渡动画Transition. 共享元素动画、场景动画、过场动画、延时动画...

    HollyTransition 零.导读 深入解读Android过渡动画Transition: 页面切换动画(过场动画) 共享元素动画 延时动画 场景动画 一.Transition前世今生 为了支持各 ...

  7. Android 虚拟按键隐藏或显示之后共享元素动画异常解决方案

    背景 本篇算是共享元素的第三篇文章.主要还是因为第一篇才会衍生出来了第二篇和第三篇文章,后两篇均属于bug的分析和解决. 1.Android 仿微信朋友圈图片拖拽返回 2.Android 共享元素动画 ...

  8. 深入理解Android L新特性之 页面内容amp;共享元素过渡动画

    今天我们来聊聊Android L(5.0)引入的新特性:页面内容过渡动画和页面共享动画,这两个特性都是基于我们前面已经说过的Transition动画,如果你对Transition动画不太属性,请先看我 ...

  9. 【Android视图效果】共享元素实现仿微信查看大图效果

    在之前的文章中,我们通过动画实现了这个,具体可以查看[Android 动画]动画详解之仿微信查看大图效果(四),这里,我们用过度动画来实现. 什么是共享元素? 它是Android 5.0新加入的一种过 ...

最新文章

  1. 物联网的层次结构如何划分?
  2. springboo整合security——权限设置
  3. 随手练——HDU-2037 、P-2920 时间安排(贪心)
  4. 【转】正则基础之——捕获组(capture group)
  5. Visual Studio Code 玩MS SQL
  6. kcp-go源码解析
  7. matlab 曲面拟合_利用python进行曲面拟合并进行3D显示
  8. java类对象转化成字符串_String类型字符串(xml格式)转换成java对象类型
  9. 在GitHub存储库中创建标记
  10. Silverlight+WCF 新手实例 象棋 棋子移动-规则补充(三十七)
  11. 利用GDAL进行工具开源化改造
  12. 信息安全系统设计基础_exp3
  13. javaee 与mysql留言簿_基于jsp的留言板系统-JavaEE实现留言板系统 - java项目源码
  14. 怎样做好微商 怎样推广引流客源效果好
  15. 高科技玩具这么无趣,为何还要鼓励孩子玩?
  16. wordpress mysql缓存_【新功能】wordpress数据库缓存功能介绍和教程
  17. python软件操作步骤_python+pywinauto C/S架构软件基本操作
  18. 如何快速提高自己的领导力?
  19. cocos2dx游戏-可爱的小精灵的各种用法大全
  20. html背景音乐怎么连续,如何在主页中制作连续的背景音乐_html网页培训

热门文章

  1. threejs模型可视化编辑器_加油!所见即所得的H5页面可视化编辑器H5-Dooring
  2. 【IoT】项目管理:做好敏捷管理,从敏捷看板开始
  3. html5 webgis开发,WebGIS开发-openlayers5入门(1)
  4. 用js代码判断质数_JavaScript判断数字是否为质数的方法汇总
  5. 编译OpenCV:opencv/3rdparty/openjpeg/openjp2/opj_stdint.h:48:2: error: #error unsupported platform
  6. transmac使用方法_使用transmac将镜像写入U盘后 提示格式化才能使用
  7. 爱米云共享网盘linux,Cozy Drive下载-云盘同步程序 v3.27.0 官方版 - 下载吧
  8. 游戏开发中,常见的贴图压缩方式
  9. gtj2018如何生成工程量报表_BIM造价应用:Revit+GTJ2018土建计量教程
  10. 分布式架构设计概要总结