前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >让转场更加酷炫——自定义Transition

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

作者头像
用户1108631
发布2019-08-17 12:41:09
8230
发布2019-08-17 12:41:09
举报

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

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

继承Transition

继承Transition,代码框架如下:

代码语言:javascript
复制
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代码的学习以及官方指导,可以这么写:

代码语言:javascript
复制
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的定义如下:

代码语言:javascript
复制
    private val BACKGROUND_KEY = "com.xingfeng.jetpackdemo.animation.layoutanimate:CustomTransition:background"

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

创建过渡动画

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

代码语言:javascript
复制
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
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-04-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 每天学点Android知识 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 继承Transition
  • 获取View属性值
  • 创建过渡动画
  • 总结
  • 参考
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档