这是我参与「第四届青训营」笔记创作活动的第4天。
本笔记内容是第三课的动画基础部分。
1 Android动画概述
在用户使用一个App时,往往会出现切换、过渡、等待等场景,此时App如向用户展示动画,可以为用户提供更好的使用体验。同时,如果动画设计得美观,可以使App的表现能力获得明显的增强。
本节课介绍了帧动画、补间动画、属性动画三种动画。下面针对这三种动画做出介绍总结。
2 帧动画
在如今的互联网中,GIF图是非常常见的,这种图就是一帧一帧地播放,最终形成一个动图。在Android中,我们也可以将动画分解为帧的形式,和GIF图相似,将动画的每一部分的图片作为一帧,便可以通过设计帧播放的顺序和间隔,形成一个动画。
帧动画原理简单,使用方便,但是因为这种动画方式要加载多张图片,如果图片过大或者图片过多,容易造成内存不足问题,即OOM。
这种动画可以通过XML 文件定义,在文件中包含一个<animation-list>节点,作为根节点。在该根节点中,可以通过指定android:oneshot属性来使动画只播放一次后自动停止,停留在最后一帧(true),或是动画一直播放 (false)。对于每一个帧,定义一系列子 <item> 节点,利用android:drawable属性指定drawable资源,即该帧需要显示的图片,同时使用android:duration属性定义长度。
3 补间动画
另一种动画的原理可以首先定义一个开始样式,然后再定义一个结束样式,那么在开始样式和结束样式之间,便可以通过插值器形成一个动画,比如透明度渐变效果、旋转效果、缩放效果、平移效果等。通过这种方式实现的动画称作补间动画。
这种动画使用也比较简单方便,在如转场等场景中使用也是比较合适的。这种动画也无法控制属性。
Android中,使用AnimationSet表示应该一起播放的一组动画。每个单独动画的变换组合在一起成为一个变换。因此,可以通过AnimationSet将上面提到的几种效果组合到一起。
4 属性动画
上面的几种动画只能对视图View控件生效,不能满足所有需求。我们考虑,通过不断在指定时长内更改对象属性的值,应该也能生成动画效果,且不限于对象的类型。这种思路形成的动画称之为属性动画。Android支持属性动画,可以用于为几乎任何内容添加动画效果,并且由于这种实现原理,动画效果可以变得非常丰富,因此,对于复杂的动画,这种形式非常适合。
创建属性动画需要指定要添加动画效果的对象属性,如,对象在屏幕上的位置、动画效果持续多长时间,动画效果对应的值等。
要创建一个属性动画,需要指定动画时长,如果不设置,默认时长为 300 毫秒。然后,可以指定属性的值的变化方法。是否在某个时长结束后重复播放动画、如果重复播放,播放多少次都是可以设置的。同样,可以将每一个属性动画设置好后,通过上文补间动画介绍过的AnimationSet组合这些动画效果。
5 总结
本文介绍了帧动画、补间动画和属性动画三种常见的动画。其中,前两者属于视图动画。视图动画只能为 View 对象添加动画效果,视图动画的另一个缺点是它只会在绘制视图的位置进行修改,而不会修改实际的视图本身。这就导致动画在播放时可能会存在问题。比如,对一个按钮做动画效果,但在动画播放过程中,按钮可以被点击的实际位置并不会更改,可能会导致不良的用户体验。
通过属性动画,就可以完全摆脱这些限制,还可以为任何对象的任何属性添加动画效果,对对象本身修改属性。
但视图动画并非一无是处。根据上文的介绍不难看出,视图动画使用比较简单。如果动画需求用视图动画可以解决,不必使用属性动画,尤其是,属性动画和视图动画是可以搭配使用的。