专栏首页每天学点Android知识让转场更加酷炫——自定义Transition

让转场更加酷炫——自定义Transition

Android的Transition框架提供了在两个布局,即Scene之间的自动过渡,内置了AutoTransition、Fade、ChangeBounds动画,除此之外,也提供了给我们自定义Transition的途径。先看个效果:

可以看到,在两个场景中,背景色在渐渐变化。 ## 自定义Transition 将以上述例子,说明自定义Transition的步骤。

继承Transition

继承Transition,代码框架如下:

class CustomTransition : Transition() {    override fun captureStartValues(transitionValues: TransitionValues) {}    override fun captureEndValues(transitionValues: TransitionValues) {}    override fun createAnimator(        sceneRoot: ViewGroup,        startValues: TransitionValues?,        endValues: TransitionValues?    ): Animator? {}}

其中前两个方法是Transition中的抽象方法,为记录开始布局和结束布局的属性值所用;第三个方法为创建过渡动画,可以看到是一个属性动画Animator。

获取View属性值

通过对已有Transition代码的学习以及官方指导,可以这么写:

override fun captureStartValues(transitionValues: TransitionValues?) {        catureValues(transitionValues)    }    private fun catureValues(transitionValues: TransitionValues?) {        transitionValues?.values!![BACKGROUND_KEY] = transitionValues?.view?.background    }    override fun captureEndValues(transitionValues: TransitionValues?) {        catureValues(transitionValues)    }

最终都调用captureValues()方法,在该方法中保存属性值,属性值保存在transitionValues的values中,该values是一个map,这里的BACKGROUND_KEY的定义如下:

    private val BACKGROUND_KEY = "com.xingfeng.jetpackdemo.animation.layoutanimate:CustomTransition:background"

官方建议我们以"packagename:classname:property_name"命名一个Key,这样可以很好的避免重复。

创建过渡动画

接下来就是在createAnimator()方法中实现动画了,本文的代码如下:

override fun createAnimator(sceneRoot: ViewGroup?, startValues: TransitionValues?, endValues: TransitionValues?): Animator? {        if (startValues == null || endValues == null) {            return null        }        val startDrawable = startValues?.values!![BACKGROUND_KEY] as Drawable        val endDrawable = endValues?.values!![BACKGROUND_KEY] as Drawable        if (startDrawable is ColorDrawable && endDrawable is ColorDrawable) {            val startColor = startDrawable.color            val endColor = endDrawable.color            if (startColor != endColor) {                return ObjectAnimator.ofObject(ArgbEvaluator(), startColor, endColor).apply {                    addUpdateListener {                        endValues?.view!!.setBackgroundColor(it?.animatedValue as Int)                    }                    duration = 3000                }            }        }        return null    }

createAnimator()方法的参数有三个,其中后两个保存了起始和结束的属性值,通过key可以取出值,这里如果两个view的背景是ColorDrawable,那么将执行一个动画,否则为null。

总结

可以看到自定义Transition的流程是比较简单的,主要可以说是两步:

  1. 在captureValues()方法中保存刚兴趣的属性值,该方法是captureStartValues()和captureEndValues()的委托;
  2. 在createAnimator()中取出感兴趣的属性,创建属性动画即可。

关于代码,请参考Github地址https://github.com/wangli135/ClimbDemo/tree/master/jetpackdemo/src/main/java/com/xingfeng/jetpackdemo/animation/layoutanimate

参考

  • https://developer.android.google.cn/training/transitions/custom-transitions
  • https://medium.com/@belokon.roman/custom-transitions-in-android-f8949870bd63
  • https://github.com/lgvalle/Material-Animations

本文分享自微信公众号 - 每天学点Android知识(android_every_day),作者:星风coder

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-04-08

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • ViewGroup内容改变时的动画效果—LayoutTransition

    向一个ViewGroup中添加View或移除View时,针对当前所有的View,是可以有一个动画效果的,这个动画效果主要靠LayoutTransition实现。

    用户1108631
  • 在布局切换之间实现Transition动画

    同一个Activity之间,布局切换是可以有动画效果的,下面是仿照API Demo中的一个例子,如下图:

    用户1108631
  • 使用动画缩放图片

    我们的app经常遇到这样一种场景,就是小图到大图的转换,这时候如果有个缩放动画就会很自然。本节将介绍如何使用动画进行缩放图片,在点击头像看大图这种场景可以使用。...

    用户1108631
  • 【迪B课堂】如何正确的选择云数据库?

    刘迪
  • 使用VBA创建Access数据表

    导读: 本期介绍如何在Access数据库中创建一张空数据表。下期将介绍如何将工作表中的数据存入数据库对应的表中,随后还将介绍如何从数据库的表中取出数据输出到Ex...

    企鹅号小编
  • 前沿观察 | 如何选择合适的数据库代理

    版权声明:本文由腾讯云数据库产品团队整理,页面原始内容来自于severalnines英文官网,若转载请注明出处。翻译目的在于传递更多全球最新数据库领域相关信息,...

    腾讯云数据库 TencentDB
  • 前沿观察 | 如何选择合适的数据库代理

    点击上方蓝字关注每天学习数据库 版权声明:本文由腾讯云数据库产品团队整理,页面原始内容来自于severalnines英文官网,若转载请注明出处。翻译目的在于传...

    腾讯云数据库 TencentDB
  • 深度学习与神经网络:基于自建手写字体数据集上的模型测试

    云时之间
  • 【优化算法】遗传算法(Genetic Algorithm) (附代码及注释)

    遗传算法(Genetic Algorithm, GA)是模拟达尔文生物进化论的自然选择和遗传学机理的生物进化过程的计算模型,是一种通过模拟自然进化过程搜索最优解...

    短短的路走走停停
  • DBA发展的十三大方向

    用户5548425

扫码关注云+社区

领取腾讯云代金券

玩转腾讯云 有奖征文活动