android设置渐入渐出动画,GitHub - it212/HollyTransition: 让APP丝滑般流畅:深入解读Android过渡动画Transition. 共享元素动画、场景动画、过场...

深入解析Android过渡动画Transition
本文详细解读Android的Transition动画,包括页面切换动画、共享元素动画、延时动画和场景动画。重点讨论了Transition如何简化复杂的动画实现,以及在Fragment中使用共享元素动画的注意事项,如形变过程中的Alpha变化。此外,还提到了延时动画的应用,如进度条平滑过渡和放大缩小效果。最后,探讨了路径动画的实现和在实际应用中的常见问题。

HollyTransition

零、导读

深入解读Android过渡动画Transition:

页面切换动画(过场动画)

共享元素动画

延时动画

场景动画

一、Transition前世今生

为了支持各种交互视觉设计的不断更新,Android对于开发者提供了越来越多的动画API支持。从API 1就存在的Drawable Animation和View Animation,以及API 11(Android 3.0)以后加入的Property Animation。而过渡动画Transition是在API 19(Android 4.4.2)中加入的。说道炫酷的动画,很多人首先想到的是Android5.0开发流行起来的共享元素动画。然而共享元素动画只是Transition的冰山一角。今天就让我们来一一揭开。

二、为什么要引入Transition

那为什么要引入Transition动画呢?由于在Android引入了Metrial Desigon之后,动画的场面越来越大,比如以前我们制作一个动画可能涉及到的View就一个,或者就那么几个,如果我们一个动画中涉及到了当前Activity视图树中的各个View,那么情况就复杂了。比如我们要一次针对视图树中的10个View进行动画,这些View的效果都不同,可能有的是平移,有的是旋转,有的是淡入淡出,那么不管是使用之前哪种方式的动画,我们都需要为每个View定义一个开始状态和结束状态【关键帧,比如放缩,我们得设置fromXScale和toXScale 】,随着View个数的增加,这个情况会越来越复杂。这个时候如果使用一堆Animator去实现这一连串动画,代码将会又臭又长,Transition的出现大大减轻了开发的工作。

三、页面切换动画(过场动画)

以前使用过场动画时,实现共享元素,主要是使用Activity,但是有遇到很多坑:比如最严重的一个是在某些机型上出现做返场动画时,第二个页面的画面还残留在页面上;第二个问题是,在存在虚拟导航栏的手机上,由于不同Activity是在不同的Window上绘制的,在Activity切换时界面存在闪烁的情况。而Fragment的切换则不存在这样的问题。综合考虑,决定使用Fragment。

示例图1:入场动画

b5cca70d7e3959cf90a7723f98efcde3.png

示例图2:返场动画

327356b02b2fec3d89da47dfc79f5b31.png

三(1)、共享元素动画

如上图中 画廊按钮、拍摄按钮、设置按钮 ;页面切换时,对共享元素动画来讲,重要的函数有以下几个。共享元素执行的动画主要是针对将要进入的页面的。一个是入场动画 EnterTransition,另一个是返场 ReturnTransition。在做共享元素动画时,需要在前后两个页面对共享元素设定TransitionName,且对应的两个View,TransitionName需要相同。

//在第二个页面(即要进入的那个页面)设置共享元素TransitionName ViewCompat可兼容5.0以下版本,不报错

ViewCompat.setTransitionName(mFakeLeft, SHARE_NAME_LEFT);

ViewCompat.setTransitionName(mPhotoBtn, SHARE_NAME_MIDDLE);

ViewCompat.setTransitionName(mFakeRight, SHARE_NAME_RIGHT);

//设定入场动画和返场动画

fragment.setSharedElementEnterTransition(new ChangeBounds());

fragment.setSharedElementReturnTransition(new ChangeBounds());

//添加共享元素

FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction();

fragmentTransaction.replace(R.id.app_ctrl_view, fragment);

fragmentTransaction.addToBackStack(null);

if (shareViews != null && shareViews.length > 0) {

for (Pair shareView : shareViews) {

fragmentTransaction.addSharedElement(shareView.first, shareView.second);

}

}

fragmentTransaction.commit();

疑问:上图的共享元素是如何实现形变的过程中发生alpha变化的?

刚开始,准备直接使用 xml 定制动画,一个changeBounds(左中右三个按钮同时形变) + 一个 fade (左右按钮在形变的同时 fadeout),但是发现只有形变生效。于是尝试使用自定义ChangeBounds来改造共享元素动画,在createAnimator中拿到Animator,从而可以拿到Animator变化的过程 ValueAnimator.An

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值