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目录。

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
     android:interpolator="@[package:] anim/interpolator_resource"
     android:shareInterpolator="true">
    
    <!--透明度动画
    fromAlpha 透明度起始值,比如0.1
    toAlpha   透明度结束值,比如1
    -->
    <alpha
        android:fromAlpha="float"
        android:toAlpha="float"/>
    
    
    <!--缩放动画
    fromXScale 水平缩放的起始值,比如0.5
    toXScale   水平缩放的结束值,比如1.2
    pivotX/pivotY 中缩放心坐标点的x,y坐标
    -->
    <scale
        android:fromXScale="float"
        android:fromYScale="float"
        android:toXScale="float"
        android:toYScale="float"
        android:pivotX="float"
        android:pivotY="float"/>
    
    <!--平移动画
    fromXDelta x的起始值,比如0
    toXDelta   x的结束值,比如100
    -->
    <translate
        android:fromXDelta="float"
        android:fromYDelta="float"
        android:toXDelta="float"
        android:toYDelta="float"/>
    
    <!--旋转动画
    fromDegrees 旋转开始的角度,比如0
    toDegrees   旋转结束的角度,比如180
    pivotX/pivotY 中心坐标点
    -->
    <rotate
        android:fromDegrees="float"
        android:pivotX="float"
        android:pivotY="float"
        android:toDegrees="float"/>
    <set>
        ....
    </set>
</set>

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

shareInterpolator:表示集合中的动画是否和集合共享一个插值器,如果不指定插值器,则子动画就需要单独指定所需的插值器或者 使用默认值。
    除了上述的属性外,View 动画还有一些常用的属性,如下
  • android:duration        动画的持续时间
  • android:fillAfter      动画结束后View 是否停留在结束位置,true表示 View 停留在结束位置,false则不停留
例如: rotate.xml
<?xml version="1.0" encoding="utf-8"?>  
  
<set xmlns:android="http://schemas.android.com/apk/res/android"  
    android:fillAfter = "false"  
    android:zAdjustment="bottom"  
    >  
    <rotate  
        android:fromDegrees="0"  
        android:toDegrees="360"  
        android:pivotX="50%"  
        android:pivotY="50%"  
        android:duration="4000"  
        />  
</set>  

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

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:
<?xml version="1.0" encoding="utf-8"?>  
  
<animation-list  
  xmlns:android="http://schemas.android.com/apk/res/android"  
  android:oneshot="true"  
  >  
       <item android:drawable="@drawable/p1" android:duration="1000"></item>  
       <item android:drawable="@drawable/p2" android:duration="1000"></item>  
       <item android:drawable="@drawable/p3" android:duration="1000"></item>  
       <item android:drawable="@drawable/p4" android:duration="1000"></item>  
       <item android:drawable="@drawable/p5" android:duration="1000"></item>  
       <item android:drawable="@drawable/p6" android:duration="1000"></item>  
</animation-list> 

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

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

猜你喜欢

转载自blog.csdn.net/daxiong25/article/details/80333113