Activity: 二、转场动画, RecycleView+ViewPager图片预览

Android转场艺术:Activity动画与控件无缝过渡指南
本文详细介绍了Android 5.0后如何使用系统内置动画实现Activity转场,包括Explode、Slide和Fade,以及前页动画的设置。还探讨了单元素和多元素共享过渡,以及RecyclerView和ViewPager的图片转场技巧。


前言

Android 5.0 以来, 我们可以方便的使用系统内置的转场动画. 平移, 淡入, 爆炸, 共享元素等. 当然大神也可以自定义复杂动画. 经过排列组合, 可以做出炫丽的转场效果


提示:以下是本篇文章正文内容,下面案例可供参考

一、Activity 转场:

无图无真相, 上图


在这里插入图片描述

1.三种常用转场

Explode

爆炸出入, 控件由屏幕中心 向四周扩散或汇聚.

// TransOneActivity  用双参的 startActivity()
startActivity(
	Intent(this, TransTwoActivity::class.java),
   	ActivityOptionsCompat.makeSceneTransitionAnimation(this).toBundle()
)

// TransTwoActivity 的 onCreate() 函数中:
window.enterTransition = Explode().setDuration(800)
// 如果退场动画跟进场动画一样, returnTransition 可以不设置; 这里可以注释掉
window.returnTransition = Explode().setDuration(800)	

// 布局文件?  要什么布局, 随便写几个 View 就完事了;

重点:

  • 系统会自动遍历屏幕上所有的 View, 并做对应动画处理;
  • enterTransition: 进场动画
  • returnTransition: 退场动画. 如果跟进场动画一样, 则可以不设置 (进场扩散, 则退场汇聚)

Slide

滑动平移, 默认是 向上滑入, 向下滑出

// TransOneActivity, 启动方法没变;
startActivity(
	Intent(this, TransTwoActivity::class.java),
   	ActivityOptionsCompat.makeSceneTransitionAnimation(this).toBundle()
)

// TransTwoActivity 的 onCreate() 函数中:
window.enterTransition = Slide(Gravity.START)	// 左滑入
window.returnTransition = Slide(Gravity.END)	// 右滑出

// 如果手动关闭页面, 则用 finishAfterTransition 替代 finish(); 
ActivityCompat.finishAfterTransition(this)

Slide 构造函数, 可以传一个 Gravity 常量; 可以从对应方向入场. 控件分步入场(带时间差);
如果不传参数, 则页面整体 向上滑入, 向下滑出;

  • Gravity.LEFT, Gravity.START: 左侧出入;
  • Gravity.TOP: 上方出入;
  • Gravity.RIGHT, Gravity.END: 右侧出入;
  • Gravity.BOTTOM: 底部出入;

Fade

整页面, 淡入淡出

// TransTwoActivity
window.enterTransition = Fade()

2.前页动画:

上面几个例子, 都是 被启动页 动画. 前页也可以有动画

假设 Activity A 转场启动 Activity B:

函数 意义 触发时机
setExitTransition() A的 前进关闭(离场)动画 启动B时执行, 早于B的入场动画
setEnterTransition( ) B的 启动入场动画 B被启动时
setReturnTransition() B的 后退离场动画 B关闭时
setReenterTransition() A的 返场动画 B关闭时, 回到A后执行

代码示例:

// TransOneActivity
window.reenterTransition = Slide(Gravity.START)
window.exitTransition = Slide(Gravity.END)
window.allowEnterTransitionOverlap = false  // 允许进入时过度重叠
window.allowReturnTransitionOverlap = false // 允许返回时过度重叠

// TransTwoActivity 的 onCreate() 函数中:
window.enterTransition = Explode()
window.returnTransition = Explode()

这里就不贴动图了, 有兴趣的小伙伴可以自己试一下; 我们可以看到, 前页动画执行完毕后, 后页的动画才开始执行; 当下面两个属性设为 false 时, 才会这样;

参数 意义
allowEnterTransitionOverlap 默认true; 前后页面的动画, 几乎同时执行
allowReturnTransitionOverlap 默认true; 返场时动画是否同时执行

3.单元素共享过度

说是元素共享. 实际上根本就不共享. 只是在元素前后页的位置上做了个渐变动画!

1.第一步: 设置 transitionName

xml中写死:

android:transitionName="trans_view"

代码指定:

ViewCompat.setTransitionName(view, "trans_view")

注意: 前后页的共享控件都要设置该属性;

2.第二步: 启动Activity 指定共享元素

startActivity(
    Intent(this, TransTwoActivity::class.java),
    ActivityOptionsCompat.makeSceneTransitionAnimation(
        this, transView, "trans_view").toBundle()
)

使用三参的 makeSceneTransitionAnimation() 函数, 传入 View 和 transitionName;

3.第三步: …

  • 确保: transitionName 设置好了
  • 退出页面时, 使用: ActivityCompat.finishAfterTransition(this); back键 可以不管;

有时候, 新的页面可能 View还没准备好. 这时候我们想让动画稍晚一点执行:

  • ActivityCompat.postponeEnterTransition(this): 暂停转场动画
  • ActivityCompat.startPostponedEnterTransition(this): 开始转场动画
// 例如
ActivityCompat.postponeEnterTransition(this)
// 准备 view 的代码; 例如 ViewPager
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值