Android学习笔记——动画(Animation)

来源:互联网 发布:sql 增加字段 默认值 编辑:程序博客网 时间:2024/05/20 23:30

一、Android动画简介。

Amination动画是一个android UI界面动画效果的API,可以实现淡入淡出,缩放,旋转,平移等效果。这些效果可以用在绝大多数的控件中。

二、Android动画分类。

Animation动画一般来说可以分为两类:补间动画,帧动画。

1、补间动画(Tweened Animation)

补间动画提供了4种效果:

名称 解释 Alpha 渐变 Scale 缩放 Rotate 旋转 Translate 平移

一个View 可以设置多个动画效果,既可以同时设置,也可以让这些动画效果有一个先后顺序。

2、帧动画(Frame-to-Frame Animation)

帧动画可以创建一个drawable 的序列,按照一定的规则逐个播放这些drawable.

三、具体实现步骤

1、Tweened Animation

Tweeted Animation 可以用两种方式来实现:

  • 1.用XML的方式实现。
  • 2.用代码方式实现

1).用XML的方式实现:

XML方式实现是一种相对简单快捷且清晰明了的方式,通常来说写动画都推荐使用这种方式。
引用方式:

ImageView imageView = (ImageView)findViewById(R.id.image);Animation aim = AnimationUtils.loadAnimation(this, R.anim.first_anim);imageView.startAnimation(aim);

XML定义的动画放在/res/anim/文件夹内,XML文件的根元素可以 为 < alpha > , < scale >,< translate >,< rotate >,interpolator 元素或< set >(表示以上几个动画的集合,set内可以嵌套其他的标签)。
默认情况下,所有动画是同时进行的,可以通过startOffset属性设置 各个动画的开始偏移(开始时间)来达到动画顺序播放的效果。

例1:实现一个渐变动画:
/**
* 本例对一个TextView: mTvTest1实现了一个渐变动画:mTvTest1的文字从完全不透明经过500毫秒的时间变成完全透明,然后再慢慢变回回到完全不透明的状态,重复10次。
* 其中:
* fromeAlpha 表示的是开始时的透明度 ,1表示完全不透明,0表示完全透明
* toAlpha 表示的是结束时的透明度 ,1表示完全不透明,0表示完全透明
* repeatMode表示重复的方式,重复的方式有两种,一种是reverse,表示倒序回放,一种是restart,表示重复播放。repeatMode必须和repeatCount在一起使用才有意义。
* repeatCount表示重复的次数,
* duration 表示从开始透明度到结束透明度所经历的时间。
* fillBefore 值为true时表示动画结束后回到动画之前的状态。
* fillAfter 值为true时表示动画结束后保持动画结束之后的状态。
*/

文件1:first_anim.xml(位于res/anim/first_anim.xml,如果res下没有anim这个文件夹,新建一个。)

< ?xml version="1.0" encoding="utf-8"? >   < setxmlns:android="http://schemas.android.com/apk/res/android">       < alpha       android:fromAlpha="1.0"        android:toAlpha="0.0"      android:repeatMode="reverse"    android:repeatCount = "10"    android:fillBefore="true"      android:duration="500"  />   < /set>

文件:MainActivity.java

package test.abby.com.animtest;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.view.Menu;import android.view.MenuInflater;import android.view.animation.Animation;import android.view.animation.AnimationUtils;import android.widget.TextView;    public class MainActivity extends AppCompatActivity {private TextView mTvTest1;private TextView mTvTest2;private TextView mTvTest3;private TextView mTvTest4;@Overrideprotected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        bindView();        initAnimation();    }    private void bindView(){        mTvTest1 = (TextView) findViewById(R.id.text1);        mTvTest2 = (TextView) findViewById(R.id.text2);        mTvTest3 = (TextView) findViewById(R.id.text3);        mTvTest4 = (TextView) findViewById(R.id.text4);    }    private void initAnimation(){        Animation anim = AnimationUtils.loadAnimation(this,R.anim.first_anim);        mTvTest1.setAnimation(anim);    }}

文件三:activity_main.xml:

<?xml version="1.0" encoding="utf-8"?><LinearLayout 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:orientation="vertical"android:paddingBottom="@dimen/activity_vertical_margin"android:paddingLeft="@dimen/activity_horizontal_margin"android:paddingRight="@dimen/activity_horizontal_margin"android:paddingTop="@dimen/activity_vertical_margin"tools:context="test.abby.com.animtest.MainActivity"><TextView    android:id="@+id/text1"    android:layout_width="wrap_content"    android:layout_height="wrap_content"    android:text="Hello World!" /><TextView    android:id="@+id/text2"    android:layout_width="wrap_content"    android:layout_height="wrap_content"    android:text="Hello World!" /><TextView    android:id="@+id/text3"    android:layout_width="wrap_content"    android:layout_height="wrap_content"    android:text="Hello World!" /><TextView    android:id="@+id/text4"    android:layout_width="wrap_content"    android:layout_height="wrap_content"    android:text="Hello World!" /></LinearLayout>

例2,实现一个缩放动画:

/**
* scale标签是缩放动画,可以实现动态调控件尺寸的效果,有下面几个属性:
* android:fromXScale 起始的X方向上相对自身的缩放比例,浮点值,比如1.0代表自身无变化,0.5代表起始时缩小一倍,2.0代表放大一倍;
* android:toXScale 结尾的X方向上相对自身的缩放比例,浮点值;
* android:fromYScale 起始的Y方向上相对自身的缩放比例,浮点值,
* android:toYScale 结尾的Y方向上相对自身的缩放比例,浮点值;
* android:pivotX 缩放起点X轴坐标,可以是数值、百分数、百分数p 三种样式,比如 50、50%、50%p,当为数值时,表示在当前View的左上角,即原点处加上50px,做为起始缩放点;如果是50%,表示在当前控件的左上角加上自己宽度的50%做为起始点;如果是50%p,那么就是表示在当前的左上角加上父控件宽度的50%做为起始点x轴坐标。(具体意义,后面会举例演示)
android:pivotY 缩放起点Y轴坐标,取值及意义和pivotX一样。
* 本例在上例的基础上,对mTvTest2实现了一个缩放动画,最终动画的效果为:mTvTest2用2000毫秒的时间,以自己的中心为放大中心,将自己扩大3倍,并且保持放大之后的样子。
**/

文件1:MainActivity.java(基本和上例一样,只有initAnimation()方法有些改动)

    private void initAnimation(){    Animation anim = AnimationUtils.loadAnimation(this,R.anim.first_anim);    mTvTest1.setAnimation(anim);    Animation anim2 = AnimationUtils.loadAnimation(this,R.anim.scale_anim);    mTvTest2.setAnimation(anim2);}

文件2:scale_anim.xml

<?xml version="1.0" encoding="utf-8"?><set xmlns:android="http://schemas.android.com/apk/res/android"><scale    android:fromXScale="1"    android:fromYScale="1"    android:pivotX="50%"    android:pivotY="50%"    android:toXScale="3.0"    android:toYScale="3.0"    android:duration = "2000"    android:fillAfter="true"/></set>

例3.实现一个旋转动画:

/**
*本例在例2的基础上对mTvTest3实现了一个旋转动画。具体动画效果为:
* pivotX 和 pivotY
**/

文件1. rotate_anim.xml

<?xml version="1.0" encoding="utf-8"?><set xmlns:android="http://schemas.android.com/apk/res/android"><rotate    android:duration="2000"    android:pivotY="50%"    android:pivotX="50%"    android:fromDegrees="90"    android:toDegrees="-90"/></set>

文件2:MainActivity.java(和上例基本一致,仅对initAnimation做改动)

private void initAnimation(){    Animation anim = AnimationUtils.loadAnimation(this,R.anim.first_anim);    mTvTest1.setAnimation(anim);    Animation anim2 = AnimationUtils.loadAnimation(this,R.anim.scale_anim);    mTvTest2.setAnimation(anim2);    Animation anim3 = AnimationUtils.loadAnimation(this,R.anim.rotate_anim);    mTvTest3.setAnimation(anim3);}

下面这些是几个动画都通用的属性:

android:duration        动画持续时间,以毫秒为单位 android:fillAfter          如果设置为true,控件动画结束时,将保持动画最后时的状态android:fillBefore       如果设置为true,控件动画结束时,还原到开始动画前的状态android:repeatCount 重复次数,0表示不重复,1表示重复一次,infinite表示无限循环。android:repeatMode  重复类型,有reverse和restart两个值,reverse表示倒序回放,restart表示重新放一遍,必须与repeatCount一起使用才能看到效果。android:interpolator  设定插值器,其实就是指定的动作效果,比如弹跳效果等,具体的看下面的表格。
名称(interpolator) 解释 AccelerateDecelerateInterpolator 在动画开始与介绍的地方速率改变比较慢,在中间的时候加速 AccelerateInterpolator 在动画开始的地方速率改变比较慢,然后开始加速 AnticipateInterpolator 开始的时候向后然后向前甩 AnticipateOvershootInterpolator 开始的时候向后然后向前甩一定值后返回最后的值 BounceInterpolator 动画结束的时候弹起 CycleInterpolator 动画循环播放特定的次数,速率改变沿着正弦曲线 DecelerateInterpolator 在动画开始的地方快然后慢 LinearInterpolator 以常量速率改变 OvershootInterpolator 向前甩一定值后再回到原来位置

2).用代码方式实现:

Tweened Animation 代码实现步骤主要包括以下几个:

  • 创建一个AnimationSet对象(Animation子类);
  • 创建相应的Animation对象;
  • 为Animation对象设置相应的数据;
  • 将Animatin对象添加到AnimationSet对象当中;
  • 使用控件对象开始执行AnimationSet;

创建AnimationSet有两种方式:
Android Developers中是这样写的:

AnimationSet(Context context, AttributeSet attrs)
//Constructor used when an AnimationSet is loaded from a resource.

AnimationSet(boolean shareInterpolator)
//Constructor to use when building an AnimationSet from code

***************** 未完待续 ****************

0 0
原创粉丝点击