Android 笔记之 视图动画(Animation)和帧动画

视图动画(Animation)渐变动画,针对 View 的动画,主要支持平移、旋转、缩放、透明度
通过 View 不断的重绘实现动画
优点:使用方便,效率较高
缺点:不具备交互性,其响应事件的位置依然在动画前的地方
分类:
  • 透明度(AlphaAnimation
  • 旋转(RotateAnimation
  • 缩放(ScaleAnimation
  • 位移(TranslateAnimation
  • 动画集合(AnimationSet)
    均是 Animation 的子类,即可以通过XML 来定义,也可以通过代码来创建
1、透明度动画

             为视图增加透明度变换的动画

 AlphaAnimation aa = new AlphaAnimation(0, 1);//透明度变化范围
 aa.setDuration(1000);
 view.startAnimation(aa);
2、旋转动画
             为视图增加旋转变换的动画
        RotateAnimation ra = new RotateAnimation(0, 360, //起始角度及最终角度
                                                 100, 100);//旋转中心点的坐标
        ra.setDuration(1000);
        view.startAnimation(ra);

        RotateAnimation ra = new RotateAnimation(0,360,
                            RotateAnimation.RELATIVE_TO_SELF,//设置参考系为自身中心点,也可设置为父容器为参考系
                            RotateAnimation.RELATIVE_TO_SELF);

3、缩放动画
             为视图增加缩放变换的动画
       ScaleAnimation sa = new ScaleAnimation(0, 2, 0, 2);//缩放的起始坐标及最终坐标
       ScaleAnimation sa =  new ScaleAnimation(0,1,0,1,
                           ScaleAnimation.RELATIVE_TO_SELF,//设置以自身中心为缩放中心
                           ScaleAnimation.RELATIVE_TO_SELF);
        sa.setDuration(1000);
        view.startAnimation(sa);

4、位移动画
             为视图增加位移变换的动画
        TranslateAnimation ta = new TranslateAnimation(0, 200, 0, 300);//位移的起始坐标及最终坐标
        ta.setDuration(1000);
        view.startAnimation(ta);

5、动画集合
            AnimationSet 动画合集
        AnimationSet as = new AnimationSet(true);
        as.setDuration(1000);
        
        AlphaAnimation aa = new AlphaAnimation(0, 1);
        aa.setDuration(1000);
        as.addAnimation(aa);

        RotateAnimation ra = new RotateAnimation(0, 360, 100, 100);
        ra.setDuration(1000);
        as.addAnimation(ra);
        
        TranslateAnimation ta = new TranslateAnimation(0, 200, 0, 300);
        ta.setDuration(1000);
        as.addAnimation(ta);
        
        ScaleAnimation sa = new ScaleAnimation(0, 2, 0, 2);
        sa.setDuration(1000);
        as.addAnimation(sa);
        view.startAnimation(as);
        as.setAnimationListener(new Animation.AnimationListener() {//监听动画事件
            @Override
            public void onAnimationStart(Animation animation) {//开始
                
            }

            @Override
            public void onAnimationEnd(Animation animation) {//结束

            }

            @Override
            public void onAnimationRepeat(Animation animation) {//重复

            }
        });

这四种动画实现方式都是通过Animation类和AnimationUtils配合实现。
也可以通过xml实现:动画的XML文件在工程中res/anim目录。



    
    
    
    
    
    
    
    
    
    
    
    
    
    
        ....
    

从上可以看出,View 的视图动画既可以是单个动画,也可以是一系列动画的组合 标签表示动画集合,对应AnimationSet 类,它可以包含若干个动画,并且他的内部也是可以嵌套其它动画集合的, 他的两个属性含义如下:
interpolator:
    表示动画集合所采用的插值器,插值器影响动画的速度,比如非匀速动画就需要通过插值器来控制动画的播放过程。这个属性
可以不指定,默认为@android:anim/accelerate_decelerate_interpolator,即加速减速插值器

shareInterpolator:表示集合中的动画是否和集合共享一个插值器,如果不指定插值器,则子动画就需要单独指定所需的插值器或者 使用默认值。
    除了上述的属性外,View 动画还有一些常用的属性,如下
  • android:duration        动画的持续时间
  • android:fillAfter      动画结束后View 是否停留在结束位置,true表示 View 停留在结束位置,false则不停留
例如: rotate.xml
  
  
  
      
  

     如何应用上面的动画呢?如下所示:

Button mButton = (Button)findViewById(R。id.button);
Animation animation = AnimationUtils.loadAnimation(this,R.anim.animation_test);
mButton.startAnimation(animation);

Frame Animation(帧动画) 主要是设置 View 的背景,可以以动画的形式为 View 设置多张背景
     帧动画 是顺序播放事先做好的图像,跟电影类似。 Android SDK 提供了另外一个类 AnimationDrawable 来定义使用 帧动画
利用 xml 文件实现: res/drawable-hdpi/frame.xml:
  
  
  
         
         
         
         
         
         
 

使用动画
AnimationDrawable anim = (AnimationDrawable)getResources().  
getDrawable(R.drawable.frame);  
textWidget = (TextView)findViewById(R.id.text_widget);  
textWidget.setText("背景渐变动画效果");  
textWidget.setBackgroundDrawable(anim);  
anim.start();  

    这里有点不同的是,利用AnimationDrawable实现动画时,本身并没有提供接口来监听动画的状态(开始,结束),需要自己处理。帧动画使用比较简单,但是比较容易引起OOM,所以在使用帧动画时应尽量避免使用过多尺寸较大的图片

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