记录Android中几种动画的实现方式

一、视图动画

视图动画只是在视图上产生动画效果,View的属性(位置、大小、角度等)实际并未发生变化。Android中提供了AlphaAnimation、RotateAnimation、TranslateAnimation、ScaleAnimation四种实现视图动画效果的API,同时提供了AnimationSet来实现动画集合,以便混合使用多种动画。以下示例对一个命名为mTestView的View使用AlphaAnimation动画效果,其他动画使用方式与此相同。
1. AlphaAnimation示例:

AlphaAnimation alphaAnimation = new AlphaAnimation(0, 1);
alphaAnimation.setDuration(2000);
mTestView.startAnimation(alphaAnimation);
//添加动画监听回调
alphaAnimation.setAnimationListener(new Animation.AnimationListener() {
                @Override
                public void onAnimationStart(Animation animation) {

                }

                @Override
                public void onAnimationEnd(Animation animation) {

                }

                @Override
                public void onAnimationRepeat(Animation animation) {

                }
            });

2. 使用AnimationSet混合多种动画效果

 AnimationSet animationSet = new AnimationSet(true);
 AlphaAnimation alphaAnimation1 = new AlphaAnimation(0, 1);
 alphaAnimation1.setDuration(2000);
 animationSet.addAnimation(alphaAnimation1);
 TranslateAnimation translateAnimation1 = new TranslateAnimation(0, 200, 0, 200);
 translateAnimation1.setDuration(2000);
 animationSet.addAnimation(translateAnimation1);
 mTestView.startAnimation(animationSet);

二、属性动画

属性动画是Android 3.0之后添加的动画框架,最经常使用的是AnimatorSet和ObjectAnimator的配合。ObjectAnimator可以精细化控制一个对象的一个属性值,实现动画效果的同时也改变动画对象的相应属性。AnimatorSet可以组合多个ObjectAnimator,实现多动画混合。
1. ObjectAnimator的使用

//参数一:要操纵的view;
//参数二:要操纵的属性(translationX、translationY、rotationX、rotationY、rotation、scaleX、scaleY)
//参数三:可变数组参数,代表属性变化的一个取值过程。
 ObjectAnimator translationX = ObjectAnimator.ofFloat(mTestView, "translationX", 300);
 translationX.setDuration(500);
 translationX.start();

2. PropertyValuesHolder:对同一对象的多个属性同时作用多种动画
示例:在平移过程中同时进行缩放

 PropertyValuesHolder pvh1 = PropertyValuesHolder.ofFloat("translationX", 300f);
 PropertyValuesHolder pvh2 = PropertyValuesHolder.ofFloat("scaleX", 1f,1.5f);
 PropertyValuesHolder pvh3 = PropertyValuesHolder.ofFloat("scaleY", 1f, 1.5f);
 ObjectAnimator.ofPropertyValuesHolder(mTestView, pvh1, pvh2, pvh3).setDuration(2000).start();

3. AnimatorSet:组合多个动画,并且能够对多个动画进行精确的顺序控制。
示例:按顺序执行3个动画:首先平移mTestView,然后mBtnAnimatorSet横向缩放,最后mBtnAnimatorSet纵向缩放

 ObjectAnimator translationX1 = ObjectAnimator.ofFloat(mTestView, "translationX", 300);
ObjectAnimator scaleX1 = ObjectAnimator.ofFloat(mBtnAnimatorSet, "scaleX", 1.5f);
ObjectAnimator scaleY1 = ObjectAnimator.ofFloat(mBtnAnimatorSet, "scaleY", 1.5f);
AnimatorSet animatorSet = new AnimatorSet();
animatorSet.setDuration(2000);
animatorSet.playSequentially(translationX1, scaleX1, scaleY1);
animatorSet.start();

4. 使用View的animate方法实现属性动画
Android 3.0之后,View增加的animate方法来直接实现属性动画。

mTestView.animate()
         .scaleX(1.5f)
         .x(300)
         .setDuration(1000)
         .withStartAction(new Runnable() {
              @Override
              public void run() {

              }
          })
         .withEndAction(new Runnable() {
              @Override
              public void run() {

              }
         }).start();

5. 布局动画
布局动画作用在布局上,当给布局添加view时,会添加一个动画过渡效果。如:给一个RelativeLayout添加一个AlphaAnimation,该布局中的view会以AlphaAnimation的动画效果出现。

 AlphaAnimation aa = new AlphaAnimation(0, 1);
 aa.setDuration(3000);
 LayoutAnimationController lac = new LayoutAnimationController(aa, 1f);
//LayoutAnimationController.ORDER_NORMAL:布局中的view按顺序出现
//LayoutAnimationController.ORDER_RANDOM:布局中的view按随机顺序出现
//LayoutAnimationController.ORDER_REVERSE:布局中的view反序出现
 lac.setOrder(LayoutAnimationController.ORDER_NORMAL);
 mTestLayout.setLayoutAnimation(lac);

你可能感兴趣的:(Android)