Android中的动画

一、View Animation 视图动画(API Level 1引入)

(一)、Tween Animation 补间动画

补间动画一共有五种:
RotateAnimation(旋转)、
ScaleAnimation(缩放)、
AlphaAnimation(透明度)、
TranslateAnimation(位移)、
AnimationSet(组合)。

实现方式有两种:
1.代码创建 2.使用xml

1、代码创建

(1)RotateAnimation(旋转)
 //初始化RotateAnimation
 /*fromDegrees、toDegrees表示开始、结束的角度(0度为水平方向右侧的开始角度)
   pivotXType、pivotXValuex表示X轴旋转的类型、X轴的中心位置(0.0f-1.0f)
   pivotYType、pivotYValue表示Y轴旋转的类型、Y轴的中心位置(0.0f-1.0f)
   当type为Animation.ABSOLUTE时,这个个值为具体的像素值,当type为Animation.RELATIVE_TO_SELF或Animation.RELATIVE_TO_PARENT,这个个值为比例值,取值范围是[0f, 1.0f]
  */   
   RotateAnimation animation = new RotateAnimation(0, 360, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
 //动画执行时间
    animation.setDuration(2000);
//动画重复次数-1表示不停重复
   animation.setRepeatCount(-1);
 //给控件设置动画
    mView.startAnimation(animation);
(2)ScaleAnimation(缩放动画)
 //初始化初始化ScaleAnimation
 /*fromX、toX 开始、结束的X轴缩放比率[0.0f-1.0f]
   fromY、toYtoY开始、结束的Y轴缩放比率[0.0f-1.0f]
   pivotXType、pivotXValuex表示X轴旋转的类型、X轴的中心位置(0.0f-1.0f)
   pivotYType、pivotYValue表示Y轴旋转的类型、Y轴的中心位置(0.0f-1.0f)
   当type为Animation.ABSOLUTE时,这个个值为具体的像素值,当type为Animation.RELATIVE_TO_SELF或Animation.RELATIVE_TO_PARENT,这个个值为比例值,取值范围是[0f, 1.0f]
  */   
    ScaleAnimation animation = new ScaleAnimation(1f, 0.5f, 1f, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
 //动画执行时间
    animation.setDuration(2000);
//动画重复次数-1表示不停重复
   animation.setRepeatCount(-1);
 //给控件设置动画
    mView.startAnimation(animation);
(3) AlphaAnimation(透明度)
//初始化AlphaAnimation
// fromAlpha、toAlpha表示透明度的起始值和结束值,0.0f表示全透明,1.0f表示不透明。
    AlphaAnimation animation = new AlphaAnimation(1.0f, 0.0f);
//动画执行时间
   animation.setDuration(2000);
//动画重复次数-1表示不停重复
  animation.setRepeatCount(-1);
//给控件设置动画
    mView.startAnimation(animation);
(4) TranslateAnimation(位移)
  //初始化AlphaAnimation
  /*fromXType、 fromXValue: X轴开始位置();
     toXType、oXValue: X轴到达位置();
     fromYType、 fromYValue: Y轴开始位置();
     toYType、oYValue: Y轴到达位置();
     当type为Animation.ABSOLUTE时,这个个值为具体的像素值,当type为Animation.RELATIVE_TO_SELF或Animation.RELATIVE_TO_PARENT,这个个值为比例值,取值范围是[0f, 1.0f]
  */   
      TranslateAnimation animation = new TranslateAnimation(Animation.RELATIVE_TO_SELF, 0f, Animation.RELATIVE_TO_SELF, 0f, Animation.RELATIVE_TO_SELF, 0f, Animation.ABSOLUTE, 100);
   //动画执行时间
        animation.setDuration(2000);
   //动画重复次数-1表示不停重复
       animation.setRepeatCount(-1);
   //动画结束后View停留在结束位置
       animation.setFillAfter(true);
   //给控件设置动画
       mView.startAnimation(animation);   
(4) AnimationSet(组合)
   //创建一个动画集合
    AnimationSet animationSet = new AnimationSet(true);
    //创建几种动画
    AlphaAnimation alphaAnimation = new AlphaAnimation(1.0f, 0.0f);
    ScaleAnimation scaleAnimation = new ScaleAnimation(1f, 0.5f, 1f, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
    RotateAnimation rotateAnimation = new RotateAnimation(0, 360, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
    TranslateAnimation translateAnimation = new TranslateAnimation(Animation.RELATIVE_TO_SELF, 0f, Animation.RELATIVE_TO_SELF, 0f, Animation.RELATIVE_TO_SELF, 0f, Animation.ABSOLUTE, 100);    animationSet.addAnimation(alphaAnimation);
    //把动画添加进动画集合
    animationSet.addAnimation(scaleAnimation);
    animationSet.addAnimation(rotateAnimation);
    animationSet.addAnimation(translateAnimation);
    //设置时间
    animationSet.setDuration(2000);
    //是否循环
    animationSet.setRepeatCount(-1);
    mView.startAnimation(animationSet);

2、xml创建

在res下创建anim文件夹


Android中的动画_第1张图片

set标签下的属性(也可在动画标签里单独设置):
------插值器:interpolator动画的变化率

 @android:anim/accelerate_interpolator: 越来越快
 @android:anim/decelerate_interpolator:越来越慢
 @android:anim/accelerate_decelerate_interpolator:先快后慢
 @android:anim/anticipate_interpolator: 先后退一小步然后向前加速
 @android:anim/overshoot_interpolator:快速到达终点超出一小步然后回到终点
 @android:anim/anticipate_overshoot_interpolator:到达终点超出一小步然后回到终点
 @android:anim/bounce_interpolator:到达终点产生弹球效果,弹几下回到终点
 @android:anim/linear_interpolator:均匀速度。

------shareInterpolator:是否设置所有动画的变化率都使用set里的

            android:shareInterpolator="true"  

------startOffset:动画延迟时间

alpha_demo.xml:
    
       
scale_demo.xml:
  
  
  
translate_demo.xml:
 
 
 
set_demo.xml:
 
     
     
     
     
 
 
代码内使用:
  Animation  anim = AnimationUtils.loadAnimation(getApplicationContext(), R.anim.alpha_demo);
    anim.setRepeatCount(-1);
    mView.startAnimation(anim);

3、动画效果:

Android中的动画_第2张图片

(二)、Frame Animation 逐帧动画

帧动画就是一张张图片连续的播放,产生连续的效果,图片不易过大,容易内存溢出。

在drawble下新建一个xml:

    
    
        //oneshot属性表示是否循环播放,值为true则只播放一次。
        
        
        
        
        
       
        
        
    

代码:

   ImageView mView = (ImageView) findViewById(R.id.image);
    mView.setImageResource(R.drawable.frame_animation);
    AnimationDrawable animationDrawable  = (AnimationDrawable) mView.getDrawable();
    animationDrawable.start();

效果:

Android中的动画_第3张图片

二、Property Animator 属性动画(API Level 11引入)

(一)、ValueAnimator

ValueAnimator使用:
1.首先创建一个取值范围,我设的0-1000;

2.设置这个动画的时长:setDuration(5000),5秒钟。

-----这些都没改变我们view的属性,关键是下面

3.addUpdateListener 监听1-1000值得变化,意思在5秒内这个方法会从0数到1000

4.int value = (int) animation.getAnimatedValue();获得动态变化的值

5.让我们的view根据这个值得改变来进行改变

      //初始化ValueAnimator
      ValueAnimator valueAnimator = ValueAnimator.ofInt(0, 1000);
      //监听动画
      valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
        @Override
        public void onAnimationUpdate(ValueAnimator animation) {
            int value = (int) animation.getAnimatedValue();//当前的值
            
            mView.getLayoutParams().width = value;
            mView.getLayoutParams().height = value;
            mView.requestLayout();
        }
    });
    valueAnimator.setDuration(5000);//动画时长
    valueAnimator.start();//启动动画
    }

效果:


Android中的动画_第4张图片

颜色的变化 :ofArgb():

       ValueAnimator valueAnimator = ValueAnimator.ofArgb(R.color.red,R.color.blue);
        valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
            @Override
            public void onAnimationUpdate(ValueAnimator animation) {
                int color = (int) animation.getAnimatedValue();
                mView.setBackgroundResource(color);
                mView.requestLayout();

            }
        });
        valueAnimator.setDuration(10000);//动画时长
        valueAnimator.start();//启动动画

(二)、ObjectAnimator

     ObjectAnimator animator = ObjectAnimator.ofFloat(tv, "translationY", 0, 200, -100,0);  
     animator.setDuration(2000);  
     animator.start();

三、View Animation视图动画和Property Animator属性动画区别:

Property Animator能实现View Animation补间动画无法实现的功能 ,View Animation只能能对View的控件实例起作用。Property Animator,可以动态修改其属性的值。例如颜色的值改变。

Animator 与 Animation

你可能感兴趣的:(Android中的动画)