您的位置:首页 > 移动开发 > Android开发

Android动画基础-Tween和Frame动画

2015-10-31 22:21 316 查看
前言

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:

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<scale
android:interpolator="@android:anim/accelerate_decelerate_interpolator"
android:fromXScale="0.5"
android:toXScale="1.0"
android:fromYScale="0.5"
android:toYScale="1.0"
android:pivotX="50%" //表示缩放的中轴点的X
android:pivotY="50%" //表示缩放的中轴点的y,都是50%表示中轴点为图片的中心
android:fillAfter="false" //表示动画结束后,不保持最后的状态,若为true,表示保持最后的状态
android:duration="5000"
/>
</set>
在代码中对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 version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android" android:oneshot="true">
<item android:drawable="@drawable/image" android:duration="500" />
<item android:drawable="@drawable/notification_template_icon_bg" android:duration="500" />
<item android:drawable="@drawable/abc_dialog_material_background_dark" android:duration="500" />
</animation-list>
xml中必须以animation-list作为根元素,里面包含一个或多个item,其中,oneshot属性,表示动画执行的次数,true表示只执行一遍,false表示无限循环。每个item的drawable属性表示这一帧显示的图片,duration表示这一帧持续的时间。

这里同样将此动画应用到一个ImageView上,布局文件如下:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity">

<ImageView
android:id="@+id/image"
android:layout_width="300dp"
android:layout_height="250dp"
android:background="@anim/frame_anim"/>

</RelativeLayout>
应用此动画的时候用到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,属性动画。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: