这篇博客主要总结一下自己在项目中对动画的一些使用。我写博客,其实更多的是总结自己在工作中用到的一些知识。比如某一段时间一个知识点相关的技术用的比较多,那我会总结一下。其实,对于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);}