前言
Android动画是android开发中非常重要的一部分,现在越来越多的产品都加入了各种酷炫的动画,作为一名Android小码农,学习Android的动画是必不可少的。
Android给我们提供了几种类型的动画:Tween动画,Frame动画,Property动画,这篇文章先介绍前两种比较简单的。
一. Tween动画
Tween动画可以对对象进行缩小,放大,旋转,渐变,位移等操作,针对这不同的操作,Android提供了相应的接口,如下图。
AlphaAnimation:实现渐入渐出的动画,比较常用的构造方法是:AlphaAnimation(float fromAlpha, float toAlpha),两个参数分别是开始时和结束时的透明度,范围是0f-1.0f。
ScaleAnimation:缩放动画,常用的构造方法:ScaleAnimation(float fromX, float toX, float fromY, float toY),参数分别表示动画开始和结束时x和y轴的缩放比例。
RotateAnimation:旋转动画,常用构造方法:RotateAnimation(float fromDegrees, float toDegrees),参数表示旋转开始和结束时角度。
TranslateAnimation:位移动画,常用构造方法:TranslateAnimation(float fromXDelta, float toXDelta, float fromYDelta, float toYDelta),表示动画开始和结束时x,y坐标。
AnimationSet:动画的集合,可以包含多个动画,可以通过给每个动画设置启动时间(用setStartOffset方法),来决定这几个动画的执行顺序。
下面通过一个很简单的例子,看一下他们的用法,布局中只有一张图片,给这张图片分别添加这几个动画:
private ImageView mImageView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mImageView = (ImageView) findViewById(R.id.image);
AlphaAnimation alpha = new AlphaAnimation(0.2f,1.0f);
alpha.setDuration(3000);//设置动画执行时间
// mImageView.startAnimation(alpha);
ScaleAnimation scaleAnimation = new ScaleAnimation(0.5f,1.0f,0.5f,1.0f);
scaleAnimation.setDuration(3000);
scaleAnimation.setStartOffset(3000);//设置动画开始的时间
// mImageView.startAnimation(scaleAnimation);
RotateAnimation rotateAnimation = new RotateAnimation(360f,0f);
rotateAnimation.setDuration(3000);
rotateAnimation.setStartOffset(6000);
// rotateAnimation.setRepeatCount(5);//设置动画执行次数
// mImageView.startAnimation(rotateAnimation);
TranslateAnimation translateAnimation = new TranslateAnimation(100f,0f,0f,100f);
translateAnimation.setDuration(3000);
translateAnimation.setStartOffset(9000);
// mImageView.startAnimation(translateAnimation);
AnimationSet set = new AnimationSet(true);
set.addAnimation(alpha);
set.addAnimation(scaleAnimation);
set.addAnimation(rotateAnimation);
set.addAnimation(translateAnimation);
mImageView.startAnimation(set);
}}
同时,我们也可以在xml中定义动画,我这里定义了一个缩放动画,在res/anim/目录下,创建scal_anim.xml:
在代码中对ImageView使用此动画,通过AnimationUtils的loadAnimator方法创建出Animation:
Animation animation = AnimationUtils.loadAnimation(this, R.anim.scale_anim);
mImageView.startAnimation(animation);
xml的最外层是set,相当于动画的集合,它里面是可以定义多个动画的。
二. Frame动画
Frame动画是一系列图片按照顺序展示的,像gif图一样,也被称作逐帧动画,它的实现方式也非常简单,可以定义在xml中,在res/anim/目录下创建一个frame_anim.xml文件:
xml中必须以animation-list作为根元素,里面包含一个或多个item,其中,oneshot属性,表示动画执行的次数,true表示只执行一遍,false表示无限循环。每个item的drawable属性表示这一帧显示的图片,duration表示这一帧持续的时间。
这里同样将此动画应用到一个ImageView上,布局文件如下:
应用此动画的时候用到AnimationDrawable类,官方文档对这个类的描述是:
An object used to create frame-by-frame animations, defined by a series of Drawable objects, which can be used as a View object's background.
它就是用来创建帧动画的,这个动画可以当作一个view的背景,java代码如下:
AnimationDrawable animation = (AnimationDrawable) mImageView.getBackground();
animation.start();
总结,这两种动画都是比较简单,而且也有一些局限性,例如,Tween动画,给人看着它在变幻,但是view的位置时没有变的,在这个view上的响应还在原来的位置,还有一些3d的旋转动画,都很难实现,不过,Android还提供了Property Animation,属性动画。