Android动画基础-补间动画

序:补间动画和帧动画的区别

帧动画是通过连续播放图片来模拟动画的效果。

补间动画是通过在两个关键帧之间补充渐变的动画效果来实现。

1.补间动画简介

补间动画的实现类主要是在android.view.animation包下。在这个包下主要包含AlphaAnimation,RotateAnimation,TranslateAnimtion,ScaleAnimation四种补间动画,他们的集合类AnimationSet,他们的工具类AnimationUtils。以及十种动画差值器等。接下来主要整理下四种补间动画在XML和JavaCode中的使用方式以及部分API的说明。

Android动画基础-补间动画_第1张图片

2.TranslateAnimtion

平移动画:给View添加移动的动画效果。比如“抖动效果”。

在JavaCode中的写法:

// fromXDelta动画开始前X轴位置,toXDelta动画结束后的X轴位置,fromYDelta动画开始前Y轴的位置,toYDelta动画结束后的Y轴的位置

TranslateAnimation ta = new TranslateAnimation(-100, 100, 0, 0);

// 动画执行的时间

ta.setDuration(2000);

// 动画和View绑定,开始动画

ivTranslateAnim.startAnimation(ta);


在XML中的写法:

首先在res下新建一个anim文件夹,然后创建一个关于动画的XML文件。

android:duration="2000"

android:fromXDelta="0"

android:fromYDelta="0"

android:toXDelta="100"

android:toYDelta="0">

然后在javaCode中利用AnimationUtils来获得该动画对象

Animation ta = AnimationUtils.loadAnimation(getApplicationContext(), R.anim.translate);

ivTranslateAnim2.startAnimation(ta);

3.AlphaAnimation

透明度动画:给View添加透明度的动画效果,比如闪烁。

在JavaCode中的写法:

// fromAlpha,toAlpha 这2个参数分别表示开始和结束该控件的透明度,0是完全透明,1是不透明

AlphaAnimation aa = new AlphaAnimation(0, 1);

其他的和TranslateAnimtion类似

4.RotaeAnimation

旋转动画,既然是旋转动画就需要知道一个旋转的点和旋转多少

// fromDegrees起始角度,toDegrees结束角度,pivotX旋转点X轴坐标,pivotY旋转点Y轴坐标

RotateAnimation ra = new RotateAnimation(0, 360, 100, 100);

5.ScaleAnimation

缩放动画,也需要知道缩放的比例和缩放的点

// fromX起始值的X轴倍数, toX缩放后的X轴倍数, fromY起始值的Y轴倍数, toY缩放后的Y轴倍数

// pivotXTypeX轴点类型, pivotXValueX轴点的值比例, pivotYTypeY轴点类型

// pivotYValueY轴点的值比例

ScaleAnimation sa = new ScaleAnimation(0, 1, 0, 1, Animation.RELATIVE_TO_SELF, 0.5F,

Animation.RELATIVE_TO_SELF, 0.5F);

6.AnimationSet

前面结束了四种动画,难度都只能单独使用?显然不是,我们可以使用组合动画将多种动画组合到一个View上使用:

通过setStartOffset来控制多个动画直接的时间间隔。

// 是否共享差值器

AnimationSet as = new AnimationSet(true);

TranslateAnimation ta = new TranslateAnimation(0, 100, 0, 0);

ta.setDuration(1000);

// 添加动画

as.addAnimation(ta);

RotateAnimation ra = new RotateAnimation(0, 360, RotateAnimation.RELATIVE_TO_SELF, 0.5f,

RotateAnimation.RELATIVE_TO_SELF, 0.5f);

ra.setDuration(1000);

ra.setStartOffset(1000);

as.addAnimation(ra);

ivSetAnim.startAnimation(as);

7.部分API的说明

setDuration(durationMillis);//设置动画的时间,单位是毫秒

setInterpolator(i);//设置动画的差值器,有10种,默认的是LinearInterpolator线性差值器

setFillAfter(fillAfter);//设置动画结束后,是否保持状态,默认是false

setFillBefore(fillBefore);//动画结束时是否还原到初始状态

setFillEnabled(boolean);//动画结束时是否还原到初始状态,同上

setRepeatCount(repeatCount);//设置动画执行的次数,Animation.INFINITE表示无限

setRepeatMode(repeatMode);//设置动画执行的方式,有正序Animation.RESTART,和倒序Animation.REVERSE

setStartOffset(durationMillis)//设置动画之间的时间间隔,用于组合动画

setZAdjustment(Animation.ZORDER_TOP);//动画在Z轴的位置top,bottom,normal ,没用过

anim.cancel();//取消动画的方法

8.补间动画的"假"(不足之处)

为什么说这个动画有点假?因为它只是视图上的变化,实际上的位置并没有改变,即它的属性没有改变。改变的只是他的绘制位置。

在《Android群英传》一书中,这样说到:

视图动画有个非常大的缺陷就是不具备交互性,当某个元素发生视图动画后,其响应事件的位置还依然在动画前的位置,所以视图动画只能做普通的动画效果,避免发生交互。

《Android群英传》这本是去年买的,现在看了大部分的内容,感觉通俗易懂,很实用,强力推荐~

下面做一个实验:

利用平移动画来移动一个控件,并且给这个控件设置点击事件,结果发现控件移动了,可是点击事件还在原地。

findViewById(R.id.btnTweenDefect).setOnClickListener(new OnClickListener() {

@Override

public void onClick(View v) {

TranslateAnimation ta = new TranslateAnimation(0, 200, 0, 200);

ta.setDuration(2000);

ta.setFillAfter(true);

ivTweenDefect.startAnimation(ta);

}

});

ivTweenDefect.setOnClickListener(new OnClickListener() {

@Override

public void onClick(View v) {

Toast.makeText(getApplicationContext(), "别点我", Toast.LENGTH_SHORT).show();

}

});

9.源码地址:

csdn下载地址

你可能感兴趣的:(Android动画基础-补间动画)