Android动画实现详解

前言

咱们都知道,漂亮的用户界面是衡量一款应用"好坏"很重要的依据,由于人都是视觉动物,就比如说花容月貌总有男人为之倾倒,英俊潇洒总能博得芳心。这是一个无可置疑的事实,那么咱们的应用也是如此,一个漂亮的用户交互界面能提高用户对应用的好感,提高用户体验。而动画是提高用户体验的一个重要因素,好的动画交互让人用着更舒心,那么今天的这篇文章就是介绍Android中动画实现,让咱们的应用动起来。ide

Android动画分类

中也是按两种分类来说解的。布局

在Android 5.0开始增长了Material Design ,Material Design 中实现了一些动画为用户提供操做反馈并在用户与您的应用进行互动时提供视觉连续性。 它将为按钮与操做行为转换提供一些默认动画,咱们能够定制触摸反馈,使用揭露效果,定制操做行为转换,指定定制转换,使用转换启动一个操做行为,以共享元素启动一个操做行为等等。动画

Frame Animation

因为Frame Animation,Tween Animation的实现仍是有区别的,暂且就将这两种方式实现分开介绍,Frame Animation其实就是将一系列的图片一张一张的展现出来,这个和咱们看电影是相似的,因为人眼有一个可接收的暂留时间,这也就是为何人在线看视频会感受卡顿。固然咱们实现Frame Animation就是这个依据,当播放相同的图片张数用时越短也就越流畅,天然人就会感受是一个动画。咱们常见的Gif其实也是帧动画,若是你用PhotoShop打开Gif动画,会发现里面是有不少图层的也就是不少帧。spa

对于Frame动画有两种实现方式,第一种方式就是在drawable文件夹下建立一个xml文件。它的语法很简单,以下视频

 

看了上面你会发现实现Frame动画很简单,属性不多,animation-list 是动画的根元素,在根元素中的oneshot属性表示动画执行次数,若是设置为true表示只播放一次,若是false则表示会一直循环执行。在根元素下有item元素,该元素就是咱们要添加的图片,每个item表示一帧,item下的drawable就是咱们的图片资源,duration就是该帧动画执行的时间。例如xml

 

使用方法以下图片

 

Picture

运行效果图如上,在上面咱们没有添加oneshot属性,则该属性默认false,也就是说该动画会一直循环执行,当咱们设置true后则播放到最后一帧时动画中止,当咱们想中止时可使用AnimationDrawable 的stop方法,它还提供了isRunning()方法判断是否已经在执行动画。另外咱们还须要注意的是当心OOM。ip

固然用代码实现也很简单,以下ci

 

Tween Animation

Tween Animation即补间动画,主要分为四种,分别是平移、缩放、旋转、透明度,直接上语法资源

 

这是官方给的语法,set 是一个动画集合,内部能够是多个动画的组合,也能够嵌套set,这里包含了动画实现的全部属性。在上面的语法中咱们须要注意的是平移的时候其实位置接受百分比数值:从-100到100的值,以“%”结尾,表示百分比相对于自身;从-100到100的值,以“%p”结尾,表示百分比相对于父容器。例如平移开始位置在自身中间则是50%,如平时开始位置在父容器的则是50%p.

例若有些人给咱们的Activity会加一些从左边进右边出的动画,那么当咱们打开Activity时将Activity布局的fromXDelta值-100%p并将toXDelta为0%p,那么咱们看到的效果就是从左边进入了。

插值器

在动画插值器起的做用主要是改变更画的执行速率,通常状况咱们不须要本身实现插值器,由于在Android中已经给咱们提供了9种插值器,应该够咱们使用了,咱们使用插值器后会让动画执行的效果更酷炫,固然想自定义插值器也不难,能够查看已经实现插值器源码作参考。

  • accelerate_decelerate_interpolator:先加速后减速

  • accelerate_interpolator:一直加速

  • anticipate_interpolator: 开始的时候先向后甩一点而后向前,就比如人扔东西会先向后甩一下,这样才能抛的远

  • anticipate_overshoot_interpolator:和上一种插值器类似,先向后抛而后向前,到达终点后会有回弹一下效果,比如咱们将球抛到墙上,而后反弹回来

  • bounce_interpolator:动画结束的时候弹起,相似皮球落地,会弹几下才中止

  • cycle_interpolator:动画循环播放特定的次数回到原点,速率改变沿着正弦曲线

  • decelerate_interpolator:减速的插值器,刚开始速度快,而后愈来愈慢直到中止

  • linear_interpolator:线性的插值器。从开始到结束匀速运动

  • overshoot_interpolator:向前超过设定值一点而后返回

下面简单实现一个动画,动画效果以下面截图,是一个透明度,平移,缩放的动画同时执行的动画。

Picture

 

而后使用下面代码给ImageView加入动画。

 

固然咱们也可给动画加上监听。如

 

Propterty Animation

属性动画是3.0以后引入的,在View动画中虽然咱们看到了咱们的控件位置发生发生变化,好比Button虽然位置变化了,可是点击响应区域还在原来的位置。而属性动画就能够解决这种问题。它能够做用于View的属性。
语法

 

下面列出了常见的属性名字,另外须要注意的是,使用属性动画时,必须有相应属性的set/get方法,不然属性动画没有效果的。

  • translationX 和 translationY : 控制View距离左边和顶部的距离的增长值。是一个相对值。相对于自身位置的具体。

  • rotation 、 rotationX 和 rotationY : rotation 是控制View围绕其支点进行旋转。 rotationX 和 rotationY 分别是围绕X轴和Y轴旋转。

  • scaleX 和 scaleY : 控制View的缩放。

  • pivotX 和 pivotY : 控制View的支点位置,进行旋转和缩放,默认是View的中点。它们都是 float 值, 0 表示View的最左边和最顶端, 1 表示最右端和最下端。

  • alpha : 控制View的透明度。

  • x 和 y : 控制View在布局容器中距离左边和顶部的距离。是一个绝对值。

例如咱们实现一个旋转加透明度变化的动画,效果图以下

Picture

 

而后

 

固然不用xml书写也是很简单的,以下代码

 

代码实现的效果就是在2秒内先旋转到180度,在回到90度在转回180度
效果图如

Picture

在上面代码实现了一直属性动画,那么若是咱们想同时做用几个属性那该如何操做呢。此时咱们有两种实现方式分别是类PropertyValuesHolder和AnimatorSet,话很少说,先上图再直接上代码。

Picture

 

Fragment/Activity动画

其实实现Activity及Fragment切换动画也是很简单的,具体的动画效果制做可使用即便上面介绍的补间动画。例如咱们Fragment动画。

 

Activity实现动画也很简单,在Activity中提供了overridePendingTransition(int enterAnim, int exitAnim) 方法,该方法接收两个参数,第一个参数是Activity进入时的动画,第二个参数是Activity退出时的动画。该方法通常写在startActivity()后和finish()后,若是咱们想打开或者退出不显示动画,可将参数设置为0。

在上面的咱们介绍了Activity/Fragment在代码中实现动画的方法,固然还有一种简单的实现方式,那就是在主题中设置动画。
对于Activity

 

可能你不太理解为何是设置了四种,假若有Activity1和Activity2。当咱们在Activity1中跳转到Activity2时,Activity1在页面上消失是执行的:activityOpenExitAnimation动画,Activity2出如今屏幕上执行的动画是activityOpenEnterAnimation。当Activity2 finish返回Activity1时,Activity2执行的动画是activityCloseExitAnimation,Activity1显示在屏幕执行的是activityCloseEnterAnimation。建立上面主题后咱们须要将该主题应用到咱们的Activty中就能够了。

同理Fragment也可相应设置,如activityCloseEnterAnimation改成fragmentCloseEnterAnimation便可。
除此以外咱们也可使用windowAnimation,它包括 windowEnterAnimation 和 windowExitAnimation。注意的一点就是WindowAnimation的控制权大于Activity/Fragment Animation的控制权。

除了上面介绍的动画实现,还有一些动画是从Android5.0增长的,你能够参考文末给出的连接文章,酷炫的Activity切换动画,打造更好的用户体验。我的感受这篇文章介绍的挺详细。对本文缺乏的内容也作了一个补充。到这里该篇文章就暂时告一段落,有问题欢迎指出,Have a wonderful day.

相关文章
相关标签/搜索