Android动画基础-Tween和Frame动画

前言

Android动画是android开发中非常重要的一部分,现在越来越多的产品都加入了各种酷炫的动画,作为一名Android小码农,学习Android的动画是必不可少的。

Android给我们提供了几种类型的动画:Tween动画,Frame动画,Property动画,这篇文章先介绍前两种比较简单的。

一. Tween动画

Tween动画可以对对象进行缩小,放大,旋转,渐变,位移等操作,针对这不同的操作,Android提供了相应的接口,如下图。

Android动画基础-Tween和Frame动画_第1张图片

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,属性动画。

你可能感兴趣的:(Android)