Android 转场动画

setContentView(R.layout.activity_second);

getWindow().setExitTransition(new Slide());
getWindow().setEnterTransition(new Slide());
}
}

Tip: 官方文档说明转场动画要求当前Activity必须在setContentView之前写入如下代码, 不过api21以上并不需要以下设置.

getWindow().requestFeature(Window.FEATURE_CONTENT_TRANSITIONS);

如果要退出界面仍然有transition动画不能执行finish, 需要执行finishAfterTransition()

动画目标

默认转场动画会对所有的子View进行遍历加载动画, 但是如果添加目标则不会进行遍历所有子View, 或者你也可以排除特定View.

对于目标有三个操作

  • 添加

默认会进行遍历所有的视图加载动画, 但是如果使用了添加就不会遍历所有, 只会让指定的视图进行动画

  • 排除

如果使用排除方法, 依旧会进行遍历视图对象, 不过会排除你指定的视图

  • 删除

删除目标是在动画已经遍历视图完成以后还想对目标集合进行变更, 就可以删除指定的视图

添加/排除和删除目标支持以下参数类型

  1. 视图对象(View)
  2. 过渡名(TransitionNames)
  3. 字节码(Class)
  4. ID

Transition addTarget (View target)

Transition addTarget (String targetName)

Transition addTarget (Class targetType)

Transition addTarget (int targetId)

删除是removeTarget(), 排除是excludeTarget()

转场动画都支持设置监听器

Transition addListener (Transition.TransitionListener listener)

TransitionListener和AnimatorListener一样的重写方法.

窗口(Window)

从示例可以看出转场动画在代码中是通过获取Window对象进行设置的. 看下Window有哪些关于转场动画的方法.

转场动画有四种场景:

// 当前界面进入动画
void setEnterTransition (Transition transition)
// 当前界面退出动画
void setExitTransition (Transition transition)

// 以下介绍的是返回时的动画, 如果不设置就会默认和进入和退出动画相同

// 下个界面返回当前界面时, 当前界面进入动画
void setReenterTransition (Transition transition)

// 返回上个界面时当前界面退出动画
void setReturnTransition (Transition transition)

默认情况下界面A的退出动画还没有结束时, 界面B的进入动画就会开始执行. 以下两个方法默认为true. 想要进入动画等待退出动画结束后再播放就需要以下两个方法设置为false.

建议处于默认开启的状态, 否则可能出现背景空白期. 如果想清晰的看出几个不同状态的动画顺序可以开启

void setAllowEnterTransitionOverlap (boolean allow)
void setAllowReturnTransitionOverlap (boolean allow)

直接设置一个

void setTransitionManager (TransitionManager tm)

在分享元素过渡的时候是否允许重叠

void setSharedElementsUseOverlay (boolean sharedElementsUseOverlay)

Tip: 转场动画还支持主题文件里面直接设置

界面选项(ActivityOptions)

如果想兼容api16之前的系统版本可以使用ActivityOptionsCompat

该类用跳转界面的使用作为可选参数传递;

如果想让转场动画生效就必须使用下面两种方法开启界面

// 单一共享元素, 如果没有共享元素传入NULL
ActivityOptions makeSceneTransitionAnimation (Activity activity,
View sharedElement,
String sharedElementName)

// 支持多个共享元素
ActivityOptions makeSceneTransitionAnimation (Activity activity,
Pair…<View, String> sharedElements)

自定义进入和退出动画, 和overridePendingTransition方法一样

ActivityOptions makeCustomAnimation (Context context,
int enterResId,
int exitResId)

下面介绍三种系统提供的默认动画效果, 我实际使用感觉效果不是很明显, 感觉用处不大.

裁剪动画, 这是api23(Android m) 新增api.

ActivityOptions makeClipRevealAnimation (View source,
int startX,
int startY,
int width,
int height)

缩放动画

ActivityOptions makeScaleUpAnimation (View source,
int startX,
int startY,
int width,
int height)

缩略图

ActivityOptions makeThumbnailScaleUpAnimation (View source,
Bitmap thumbnail,
int startX,
int startY)

场景(Scene)

场景可以理解为在一个界面(Activity)当中切换或者改变布局内容, 场景是在api19引入

创建方式有两种, 一种是通过以下的静态方法直接创建

Scene getSceneForLayout (ViewGroup sceneRoot,
int layoutId,
Context context)

或者通过构造方法

Scene (ViewGroup sceneRoot, // 当前场景
View layout) // 需要进入的新场景

sceneRoot可以称为根视图. 在官方示例中是当前界面布局的视图对象, 可以理解为其场景(Scene)依附的Activity容器

如果你需要动态的设置场景的视图内容, 可以只指定根视图

Scene (ViewGroup sceneRoot)

进入场景和退出场景, 不带任何动画. 一般情况下场景的进入由TransitionManager负责

void enter ()

void exit ()

exit并不会对场景有任何变化

在场景进入和退出时可以设置两个回调方法

void setEnterAction (Runnable action)

void setExitAction (Runnable action)

Tip: 如果两个场景存在相同的ID会自动进行共享元素动画(前提是用的不是默认的AutoTransiton, 因为该类没有使用Change)

过渡管理器(TransitionManager)

Scene默认是没有针对场景的变化, TransitionManager提供两种方式

  1. 这种默认的过渡动画是 AutoTransition

static void go (Scene scene)

  1. 自定义过渡动画

static void go (Scene scene,
Transition transition)

开始延迟过渡, 即保存当前视图的属性状态, 然后在之后其发生改变的时候自动进行过渡动画

void beginDelayedTransition (ViewGroup sceneRoot)

void beginDelayedTransition (ViewGroup sceneRoot,
Transition transition)

后面还可以结束自动保存属性状态

void endTransitions (ViewGroup sceneRoot)

场景切换

// 创建一个自定义Transition动画的TransitionManager
mTransitionManagerForScene3 = TransitionInflater.from(getActivity())
.inflateTransitionManager(R.transition.scene3_transition_manager, mSceneRoot);

// 然后切换任意布局
mTransitionManagerForScene3.transitionTo(mScene3);

该方法等同于提到的go()

void transitionTo (Scene scene)

XML定义

不同于普通的动画, 转场动画拥有专属的资源目录transition

在res/transition目录下创建XML文件

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

标签一览

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

引用XML

Transition explode = TransitionInflater.from(this).inflateTransition(R.transition.explode);

或者可以直接在主题中设置

@transition/explode
@transition/explode
@transition/explode

TransitionInflat除上面提到的方法外还可以填充trantionManager对象

TransitionManager inflateTransitionManager (int resource,
ViewGroup sceneRoot)

共享元素(ShareElement)

共享元素

一般是在关联的界面之前存在相同的(或者说类似的, 并不强制一定要相同)控件元素就会使用, 例如下图的按钮:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

A界面跳转要指定共享元素

startActivity(new Intent(this, SecondActivity.class),
ActivityOptionsCompat.makeSceneTransitionAnimation(this, mButton, “button”)
.toBundle());

B界面的布局文件中指定共享元素android:transitionName="button"

可以看到所谓的共享元素即在两个界面的两个控件(或多个控件)之间的过渡变化效果

可以看到转场动画的操作都是针对Window对象, 拥有如下方法(同时都拥有对应的getter方法)

共享元素

void setSharedElementEnterTransition (Transition transition)
void setSharedElementExitTransition (Transition transition)
void setSharedElementReenterTransition (Transition transition)
void setSharedElementReturnTransition (Transition transition)

自定义Transiton

主要重写三个方法

  1. 开始值
  2. 结束值
  3. 创建动画

官方示例

Tip: 针对不同的View采用不同的动画效果可以重写Transition

扩散(Propagation)

Propagation可以指定Transition中的视图过渡延迟, 控制进入当前场景的视图进入的先后顺序. 例如要求Explode动画中特定的View速度快于其他的视图.

扩散中心

首先需要Transition确认扩散中心

void setEpicenterCallback (Transition.EpicenterCallback epicenterCallback)

在Transiton.EpicenterCallback回调中需要重写以下方法

Rect onGetEpicenter (Transition transition)

在回调方法内返回一个矩形, 其矩形的中心即扩散中心.

关系:

  • TransitionPropagation
  • VisibilityPropagation
  • SidePropagation
  • CircularPropagation

通过transition的方法指定

最后

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

img

img

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

10)]

[外链图片转存中…(img-X4JA8VF8-1714958118710)]

[外链图片转存中…(img-h8QXnyn8-1714958118710)]

[外链图片转存中…(img-QRzsfPdZ-1714958118710)]

[外链图片转存中…(img-SlPCg4pu-1714958118711)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

  • 10
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值