Android 之 3种动画

这里将讲述:
  1. 逐帧动画(FrameAnimation) 、补间动画(TweenAnimation) 、属性动画(PropertyAnimation);
  2. As的res文件中,分别使用drawable、anim、animator目录下的xml编写动画;
逐帧动画(FrameAnimation)

它的实现方式也有两种:代码和xml方式;

  • 代码方式:

    private void setSrcFrameAnim() {  
        animationDrawable = new AnimationDrawable();  
        // 为AnimationDrawable添加动画帧  
        animationDrawable.addFrame(  
            getResources().getDrawable(R.drawable.img00), 50);  
        animationDrawable.addFrame(  
            getResources().getDrawable(R.drawable.img01), 50);  
        animationDrawable.addFrame(  
            getResources().getDrawable(R.drawable.img02), 50);  
       
        // 设置为循环播放  
        animationDrawable.setOneShot(false);  
        imageView.setBackground(animationDrawable);  
        animationDrawable.start(); 
    }  
    
    
  • xml方式:
    在res/drawable文件夹下新建animation-list的XML实现帧动画

       
       
       
           
           
    
           
           
           
       
    

    在布局中可以这样:

        
          
          
       
    

    在代码中我们这样:

    private void setFrameAnim() {  
        imageView.setBackgroundResource(R.drawable.frame_anim);  
        animationDrawable = (AnimationDrawable) imageView.getBackground();  
        animationDrawable.start(); 
    
        //或者这样
        animationDrawable = (AnimationDrawable) getResources().getDrawable(R.drawable.frame_anim);  
        imageView.setBackground(animationDrawable);  
        animationDrawable.start(); 
    }
    
    


  • Drawable Animation(补间动画)

补间动画的属性有:RotateAnimation、AlphaAnimation、ScaleAnimation、TranslateAnimation、AnimationSet ,再者可以加上用于xml动画文件引入的AnimationUtils类,示例:

  ImageView iv = (ImageView) dialog.findViewById(R.id.loading_iv);
  RotateAnimation rotateAnimation = new RotateAnimation(0, 5760, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF,0.5f); //相对自己左上为0.0
 // Animation rotateAnimation=AnimationUtils.loadAnimation(this, R.anim.rote); //当然这里你也可以用xml方式
  rotateAnimation.setDuration(10000);
  iv.startAnimation(rotateAnimation); 
// rotateAnimation.start(); //或这样启动


  • Property Animation 属性动画

涉及到的属性值有 (名称一定要写对):
    1、透明度:alpha
    2、旋转度数:rotation、rotationX、rotationY
    3、平移:translationX、translationY
    4、缩放:scaleX、scaleY

示例 1. 使用代码实现:

    ObjectAnimator animator = ObjectAnimator
        .ofFloat(iv, "rotation", 0.0F, 360.0F)
        .setDuration(800);
    animator .setRepeatCount(ObjectAnimator.INFINITE);
    animator.setInterpolator(new LinearInterpolator());
    animator .start();

示例 2. 使用 xml文件配置动画(R.animator.anim_file):

      
          
          
      
          
              
              
      
              
                  
                  
                  
                  
              
          
      

然后在代码中用AnimatorInflater引入:

   Animator animator = AnimatorInflater.loadAnimator(context, R.animator.anim_file);  
   animator.setTarget(view);  
   animator.start();  

  • 动画总结:

    补间动画:
    XXXAnimation animation = new XXXAnimation (); //需要什么动画就new什么动画,然后.start();
    AnimationSet animationSet = new AnimationSet(false); //代码方式实现补间动画
    animationSet.addAnimation(new AlphaAnimation(1,0));
    Animation animation = AnimationUtils.loadAnimation(context, R.anim.cs);//加载的是补间动画文件(在anim中);
    注意:若想给动画设置重复模式,设置给AnimationSet是无效的,需要给每个单个动画设置才能生效,如:
    alphaAnimation.setRepeatMode(Animation.RESTART);
    alphaAnimation.setRepeatCount(Animation.INFINITE);

    属性动画:
    ObjectAnimator.ofFloat(iv, "rotation", 0.0F, 360.0F).start();
    AnimatorSet animatorSet = new AnimatorSet(); //代码方式实现属性动画
    animatorSet.playTogether();
    Animator animator = AnimatorInflater.loadAnimator(context, R.animator.scale_with_alpha); //加载的是属性动画文件(在animator中)

    anim、animator目录下的xml中动画属性是不同的:

    1. res的anim文件夹下XML文件中属性对应关系(补间动画):
      对应代码中 AnimationSet
      对应: RotateAnimation
      对应: AlphaAnimation
      对应: ScaleAnimation
      对应: TranslateAnimation
    2. res的animator文件夹的XML文件中属性对应关系(属性动画):
      对应代码中的 AnimatorSet
      对应代码中的 ObjectAnimator
      对应代码中的 ValueAnimator
  • 接下来说下Drawable的绘制(在res的drawable目录下):

    1 . 的机理就是一层层的覆盖,示例:

      
      
        
        
          
          
    
        
        
          
        
      
    

    2 . Drawable的类似于selector(效果如CheckBox的动画变换) 示例:

      
      
        
        
        
          
            
            
            
            
          
        
    
        
            android:fromId="@+id/state_off"
            android:toId="@+id/state_on">
          
            
            
            
            
          
        
      
    

    布局文件中代码

    在代码中配置

      view.setSelected(!view.isSelected());
    
  • 告诉你个小秘密:

    ProgressBar听这名字就是做进度用的,但是它功能不仅仅如此,你也可以用它来做图片切换、旋转等动画,比如上边三种方法绘制的Drawable都能设置给ProgressBar,而达到强大的动画效果,如下:

    布局代码:

      
    

    drawable/loadding.xml代码:

              
        
        
          
          
            
              
                
              
            
          
        
          
          
          
        
    

    xml文件@drawable/progressbar代码:

     
     
       
         
       
     
    

    当然ProgressBar也可以用上边的animation-list方式添加 android:indeterminateDrawable="@drawable/animation-list" 属性,效果也很棒,这个实验的机会就留给你啦!

  • 其它

    还有一种简单的设置动画的方法,如下:

    //ViewCompat这样的单次属性动画,只适用于要求只执行一次的需求,执行完后所有状态将会停留在最后一刻,
    //这种单值设置动画就是为了设置view的终态的,其默认view的初始状态就是当其view的状态。
    ViewCompat.animate(target)
         .setDuration(2100)
         .translationY(screenData.onScreenHeight/2)
         .setInterpolator(new BounceInterpolator())
         .rotation(1200)
         .alpha(0)
         .scaleX(8)
         .scaleY(7)
         .start();
    
    







好啦,就先写到这里,后继再来追加。。。

.

你可能感兴趣的:(Android 之 3种动画)