这篇博客主要总结一下自己在项目中对动画的一些使用。我写博客,其实更多的是总结自己在工作中用到的一些知识。比如某一段时间一个知识点相关的技术用的比较多,那我会总结一下。其实,对于Android动画的总结,这是几个月前就应该写完的一篇博客,然而那段时间工作实在是太忙了,没有及时去总结。于是,今天把这篇博客提上来,总结一下Android中动画的一些使用。
一、前言
在总结动画的使用前,我们先想想为我们的app添加动画的目的是什么?毫无疑问,为APP添加动画,会使我们的app界面更加美丽,效果更加华丽,这样也能吸引更多的用户使用我们的app。就好比自己的亲儿子或者亲闺女,我们总想把她(他)打扮的漂亮点。但是,是不是动画一定是好的呢?或者说,动画越多越好吗?当然也不是,其实在我们的app中添加动画,也会带来一些问题,最主要的就是耗电量增加。毫无疑问,华丽的动画效果会带来大量的电量消耗。因此,并不是说app都应该添加很多绚丽的动画,而应适度的添加。
二、动画
这个小节,按照分类大体总结一下Android常用动画的基本使用方法。作为Android开发,或者正在学习Android的朋友,大家对于Android动画的分类肯定不陌生。Android动画包括补间动画,帧动画,属性动画。
1、补间动画
首先,简单说一下什么是补间动画。补间动画是使一个物体由一个状态转变为另一种状态的动画。通俗来讲,定义一个补间动画,我们只需要给定物体的初始属性和终止属性,而中间的变化过程由补间动画自己实现。那么,这些状态包括什么呢?相信大家都知道,包括旋转,缩放,位置,透明度。
我们看一下补间动画的几个子类:AlphaAnimation,RotateAnimation,ScaleAnimation,TranslateAnimation,分别对应透明度动画,旋转动画,缩放动画,平移动画。此外,还包括AnimationSet,这是Android提供的把多个补间动画组合为一个动画的机制,我们后面会讲。如下图所示:
(1)AlphaAnimation
AlphaAnimation是控制物体透明度变化的动画,它的使用很简单,我们简单看一下AlphaAnimation的部分源码,如下所示。使用AlphaAnimation,可以使用Java代码,也可以使用xml代码,我们只看Java中使用的构造函数。需要两个变量:fromAlpha和toAlpha,也就是初始的alpha值和终止的alpha值。通过注释,我们可以看到alpha值的范围是0.0-1.0。
public class AlphaAnimation extends Animation {
private float mFromAlpha;
private float mToAlpha;
/**
* Constructor to use when building an AlphaAnimation from code
*
* @param fromAlpha Starting alpha value for the animation, where 1.0 means
* fully opaque and 0.0 means fully transparent.
* @param toAlpha Ending alpha value for the animation.
*/
public AlphaAnimation(float fromAlpha, float toAlpha) {
mFromAlpha = fromAlpha;
mToAlpha = toAlpha;
}
}
看过上面的构造函数,我们也尝试着去写一个简单的AlphaAnimation,动画有很多属性我们可以设置,例如时间,重复次数,重复模式等,我们在这里只设置一个持续时间:
private void initAlpha(){
alphaAnimation = new AlphaAnimation(1.0f,0.2f);
alphaAnimation.setDuration(2000);
imageView.startAnimation(alphaAnimation);
}
(2)ScaleAnimation
缩放动画是对物体进行缩放的补间动画,我们看一下ScaleAnimation的源码,看一下其构造函数。可以看到,比透明度动画的参数要多。不难理解,因为缩放涉及到x方向和y方向,因此需要传入四个值:
public ScaleAnimation(float fromX, float toX, float fromY, float toY) {
mResources = null;
mFromX = fromX;
mToX = toX;
mFromY = fromY;
mToY = toY;
mPivotX = 0;
mPivotY = 0;
}
我们尝试实现一个简单的缩放动画:
private void initScale(){
animation = new ScaleAnimation(1.0f,0.5f,1.0f,0.5f);
animation.setDuration(2000);
imageView.startAnimation(animation);
}
(3)TranslateAnimation
TranslateAnimation是实现物体平移的动画,我们还是简单看一下其构造函数,也是四个值。因为涉及到x和y两个方向的平移:
private void initTrans(){
animation = new TranslateAnimation(0,180,0,360);
animation.setDuration(2000);
imageView.startAnimation(animation);
}
下面,我们实现一个简单的平移动画:
private void initTrans(){
animation = new TranslateAnimation(0,180,0,360);
animation.setDuration(2000);
imageView.startAnimation(animation);
}
(4)RotateAnimation
RotateAnimation是控制物体旋转的动画。我们都知道,旋转一个物体,需要有一个参考点。
- RotateAnimation(float, float):
让物体围绕(0,0)从一个角度旋转到另一个角度。这里的(0, 0)其实就是物体的左上角,构造参数如下:
public RotateAnimation(float fromDegrees, float toDegrees) {
mFromDegrees = fromDegrees;
mToDegrees = toDegrees;
mPivotX = 0.0f;
mPivotY = 0.0f;
}
我们实现一个这样的旋转动画,也就是让物体围绕自己的左上角顶点旋转:
private void initRotate(){
animation = new RotateAnimation(0,360);
animation.setDuration(2000);
imageView.startAnimation(animation);
}
- RotateAnimation(float, float, float, float):
除了传入初始的角度和终止的角度外,还传入了一对坐标,也就是旋转参考点的坐标:
-
public RotateAnimation(float fromDegrees, float toDegrees, float pivotX, float pivotY) { mFromDegrees = fromDegrees; mToDegrees = toDegrees; mPivotXType = ABSOLUTE; mPivotYType = ABSOLUTE; mPivotXValue = pivotX; mPivotYValue = pivotY; initializePivotPoint(); }
我们实现一个让物体围绕自己的中心点旋转的动画:
-
private void initRotate(){ animation = new RotateAnimation(0,360,imageView.getWidth()/2,imageView.getHeight()/2); animation.setDuration(2000); imageView.startAnimation(animation); }