前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >在Activity切换之间实现Transition动画

在Activity切换之间实现Transition动画

作者头像
用户1108631
发布2019-08-17 12:51:21
1.8K0
发布2019-08-17 12:51:21
举报

在Android 5.0执行,如果需要在Activity切换之间实现动画,需要实现 overridePendingTransition()方法,并实现入场动画和退场动画。而在5.0之后,出现了一些Material Design的转场动画,先看下demo样子。

上面的例子中,Slide效果还是比较明显的,Explode和Fade不是很容易看清,后面两个是Share Element的动画,最后两个是ActivityOptionsCompat的另外两种效果。

实现

使用Transition开启Activity

以ExplodeActivity为例,完整代码如下:

代码语言:javascript
复制
class ExplodeActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        with(window) {
            enterTransition = Explode()
            exitTransition = Explode()
        }
        setContentView(R.layout.activity_explode)
    }

}

Android Transition框架提供了三种自带动画,分别是Explode、Fade和Slide,更好的动画效果见下图:

图片来源自https://github.com/lgvalle/Material-Animations

Share Elements的跳转

实现这种转场动画,Activity的theme需要设置:

代码语言:javascript
复制
<style name="BaseAppTheme" parent="android:Theme.Material">
  <!-- enable window content transitions -->
  <item name="android:windowActivityTransitions">true</item>
</style>

上面等同于在Activity的onCreate()方法的setContentView()之前调用如下代码:

代码语言:javascript
复制
override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        with(window) {
            requestFeature(Window.FEATURE_CONTENT_TRANSITIONS)
        }
        setContentView(R.layout.activity_share_view)

        ivImage.transitionName = "image"
    }

在theme文件中可以指定进入、退出动画,同理,在代码中也是可以指定的。 有时候,两个页面的不同View之间可以设置转场动画,比如demo中大幂幂的图片,在第二个Activity也有使用,这个很简单,只需要给View关联上transitionName字段,并在启动Activity时将View与transitionName进行关联,即可。比demo中的例子为例, ActivityTransitionActivity中的启动代码如下

代码语言:javascript
复制
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
                ActivityCompat.startActivity(this,
                        Intent(this, ShareViewActivity::class.java),
                        ActivityOptionsCompat.makeSceneTransitionAnimation(this, ivShareIv, "image").toBundle())
            } else {
                startActivity(Intent(this, ShareViewActivity::class.java))
            }

需要注意的是,这里需要使用ActivityOptionsCompat.makeSceneTransitionAnimation()方法,"image"就是transitionName,ShareViewActivity中的代码如下:

代码语言:javascript
复制
override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        with(window) {
            requestFeature(Window.FEATURE_CONTENT_TRANSITIONS)
        }
        setContentView(R.layout.activity_share_view)

//关键
        ivImage.transitionName = "image"
    }

可以看到在onCreate()方法里设置了ivImage的transitionName="image",除了代码设置,也可以在xml中设置该属性的。

多个View的共享实现

上面只有一个View,如果有多个View,如何实现呢?也很easy,启动代码如下:

代码语言:javascript
复制
tvShare.setOnClickListener {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
                val options = ActivityOptionsCompat.makeSceneTransitionAnimation(
                        this,
                        UtilPair<View, String>(ivShareIv, "image"),
                        UtilPair<View, String>(tvShare, "text")
                )
                ActivityCompat.startActivity(this,
                        Intent(this, ShareViewActivity::class.java).apply {
                            putExtra("showTwoView", true)
                        },
                        options.toBundle()
                )
            } else {
                startActivity(Intent(this, ShareViewActivity::class.java))
            }
        }

需要使用Pair将每组View与transitionName关联,最后调用ActivityCompat开启新的页面。

ActivityOptionsCompat

ActivityOptionsCompat除了共享元素的动画外,还有另外两个方法:

  • makeScaleUpAnimation()
  • makeThumbnailScaleUpAnimation()

最后两个就是使用该方法实现的。

关闭Activity

如果需要反向转场动画,那么需要使用Activity.finishAfterTransition()代替Activity.finish()。

总结

重点推荐Material-Animations这个开源项目,demo很酷炫,原理也讲得很好。 关于代码,请参考Github

参考

  • https://developer.android.com/training/transitions/start-activity?hl=zh-cn
  • https://android.jlelse.eu/android-material-design-activity-transition-55de706ab967
  • https://www.jianshu.com/p/a43daa1e3d6e
  • https://github.com/lgvalle/Material-Animations
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-02-13,如有侵权请联系 cloudcommunity@tencent.com 删除

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 实现
    • 使用Transition开启Activity
      • Share Elements的跳转
        • 多个View的共享实现
      • ActivityOptionsCompat
        • 关闭Activity
        • 总结
        • 参考
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档