欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-03-16 21:41:17
...
视图动画(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,所以在使用帧动画时应尽量避免使用过多尺寸较大的图片