Android动画详解

来源:互联网 发布:淘宝达人的推广方式 编辑:程序博客网 时间:2024/05/23 12:27
1.Frame 帧动画
   将每一张静止的图片依次的显示出来,利用人眼暂时停留的错觉,得出的动画。
   在drawable文件中中创建xml文件
   标签是<animation-list />
 使用步骤:
   1.在drawable文件夹下创建帧动画的资源文件,<animation-list />
   2.在代码或者在布局当中设置imageview的背景或者src资源为自定义的帧动画资源文件。
   3.获取AnimationDrawable的帧动画管理器,然后可以调用其start或者是stop方法开启关闭动画。
 添加oneshot属性
     true:表示指定的资源图片只切换一次
     false:表示指定的item图片无限切换。

实例:

[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. public class FrameActivity1 extends AppCompatActivity {  
  2.   
  3.     private ImageView iv;  
  4.     //声明帧动画管理器  
  5.     private AnimationDrawable drawable;  
  6.     @Override  
  7.     protected void onCreate(Bundle savedInstanceState) {  
  8.         super.onCreate(savedInstanceState);  
  9.         setContentView(R.layout.activity_frame1);  
  10.         iv = (ImageView) findViewById(R.id.iv);  
  11.         iv.setBackgroundResource(R.drawable.my_frame_animation);  
  12.         drawable = (AnimationDrawable) iv.getBackground();  
  13.     }  
  14.   
  15.     public void start(View view) {  
  16.         if (!drawable.isRunning()) {  
  17.             drawable.start();   //开启帧动画  
  18.         }  
  19.     }  
  20.   
  21.     public void stop(View view) {  
  22.         if (drawable.isRunning()) {  
  23.             drawable.stop();    //停止动画  
  24.         }  
  25.     }  
  26. }  
[html] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <animation-list xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:oneshot="false">  
  4.     <item android:drawable="@mipmap/anim1" android:duration="50"></item>  
  5.     <item android:drawable="@mipmap/anim2" android:duration="50"></item>  
  6. </animation-list>  

或者在代码中加载:

[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. public class FrameActivity3 extends AppCompatActivity {  
  2.   
  3.     private ImageView iv;  
  4.     private AnimationDrawable drawable;  
  5.     @Override  
  6.     protected void onCreate(Bundle savedInstanceState) {  
  7.         super.onCreate(savedInstanceState);  
  8.         setContentView(R.layout.activity_frame3);  
  9.         iv = (ImageView) findViewById(R.id.iv);  
  10.         //在代码当中完成帧动画  
  11.         drawable = new AnimationDrawable();  
  12.         //向帧动画管理器中添加图片资源的过程  
  13.         drawable.addFrame(getResources().getDrawable(R.mipmap.girl_1),200);  
  14.         drawable.addFrame(getResources().getDrawable(R.mipmap.girl_2),200);  
  15.   
  16.         //将动画资源显示在imageview上  
  17.         iv.setImageDrawable(drawable);  
  18.   
  19.         drawable.setOneShot(false);  
  20.     }  
  21.   
  22.     public void onClick(View view) {  
  23.   
  24.         if (drawable.isRunning()){  
  25.             drawable.stop();  
  26.         }else {  
  27.             drawable.start();  
  28.         }  
  29.     }  
  30. }  

2.Tween 补间动画
   补充中间的动画
   开发者只需要指定动画开始和结束的关键帧,而进行中的中间帧是由系统来计算并且补齐的。
   
   补间动画分为四种:
      1.透明度动画   : alpha
      2.大小缩放动画 : scale
      3.位移变化动画 : translate
      4.旋转动画     : rotate
      5.综合动画     :把前几种动画综合起来。
    补间动画的资源存放与res/anim目录之下
      四种变化方式都有对应的标签
      <alpha .../>
         定义的属性:
         android:fromAlpha="1"
         android:toAlpha="0.05"
            以上两个属性 取值范围 0-1 之间
                0:表示完全透明
                1:表示不透明
      <scale .../>
            定义的属性:
            确定开始和结束的尺寸
            android:fromXScale="1"
            android:toXScale="0.1"
            android:fromYScale="1"
            android:toYScale="0.1"
            确定放大缩小的中心点
            android:pivotX="50%"
            android:pivotY="50%"
      <translate .../>
         定义的属性:
             确定开始和结束的位置
            android:fromXDelta="0"
            android:toXDelta="200"
            android:fromYDelta="0"
            android:toYDelta="200"
            确定运动持续的时间
                android:duration="5000"
            插值器  :可以改变动画执行中间的效率,控制动画的速度
                android:interpolator
                accelerate_interpolator  加速
                decelerate_interpolator  减速
                accelerate_decelerate_interpolator   先加速后减速
                linear_interpolator  匀速
            表示重复的次数
                android:repeatCount
            表示重复的模式
                android:repeatMode
            是否保留动画结束时的状态
                android:fillAfter
      <rotate .../>
            定义的属性:
            旋转的起始角度和最终角度
                android:fromDegrees="0"
                android:toDegrees="360"
            旋转的中心点
                android:pivotX=""
                android:pivotY=""
            放入三种值:
                1.绝对的数值:传入绝对值,表示执行该view的某一个点作为中心点 (50,50)
                2.百分比 :表示以该view的宽高的百分比作为中心点  (50% ,50%)
                3.百分比p :表示执行该动画的view的外层布局的位置  (50%p  50%p)   
      <set .../>
          可以对以上四种动画任意组合。
    //代码中加载资源动画:
    Animation anim = AnimationUtils.loadAnimation(this,R.anim.anim_xxx);
    //开启动画

   xxx.startAnimation(anim);
对set的实例:

[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. public class TweenActivity1 extends AppCompatActivity {  
  2.   
  3.     private ImageView mIv;  
  4.     //声明补间动画对象  
  5.     private Animation setAnim;  
  6.   
  7.     @Override  
  8.     protected void onCreate(Bundle savedInstanceState) {  
  9.         super.onCreate(savedInstanceState);  
  10.         setContentView(R.layout.activity_tween1);  
  11.         mIv = (ImageView) findViewById(R.id.tweeniv);  
  12.         setAnim = AnimationUtils.loadAnimation(this,R.anim.anim_set);  
  13.     }  
  14.   
  15.     public void onClick(View view) {  
  16.                 mIv.startAnimation(setAnim);  
  17.         }  
  18.     }  
  19. }  
[html] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <set xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:interpolator="@android:anim/linear_interpolator"  
  4.     android:duration="2000">  
  5.     <alpha  
  6.         android:fromAlpha="1"  
  7.         android:toAlpha="0"></alpha>  
  8.   
  9.     <scale  
  10.         android:fromXScale="1"  
  11.         android:toXScale="0"  
  12.         android:fromYScale="1"  
  13.         android:toYScale="0"  
  14.         android:pivotX="50%"  
  15.         android:pivotY="50%"></scale>  
  16.   
  17.     <translate  
  18.         android:fromXDelta="0"  
  19.         android:fromYDelta="0"  
  20.         android:toXDelta="0"  
  21.         android:toYDelta="2000"  
  22.         ></translate>  
  23.   
  24.     <rotate  
  25.         android:fromDegrees="0"  
  26.         android:toDegrees="1800"  
  27.         android:pivotX="50%"  
  28.         android:pivotY="50%"></rotate>  
  29. </set>  

3.Property 属性动画    

android3.0之后引入的动画
属性动画的特点:
1.Animator框架之下的,常用的类包括AnimatorSet和ObjectAnimator
2.补间动画只能够定义控件的四个方面,而属性动画可以定义任何属性。
3.补间动画只能够让ui控件执行动画,而属性动画可以让任何对象执行动画。
属性动画可以定义以下属性:
1.动画持续时间
2.动画的插值方式
3.动画重复的次数
4.动画重复的行为
5.动画的集合
......
属性动画在xml文件当中定义的步骤。
1.在res/animator文件夹当中定义属性动画的资源文件,如果是单独的属性可以定义标签为<objectAnimator.../>
   如果是多个属性就要放入到<set.../>标签当中。
      在<objectAnimator.../>标签中可以定义的属性:
      android:propertyName="textColor"    //属性名
      android:duration="5000"              //动画持续时间
      android:valueType="intType"          //动画的输入类型
      android:valueFrom="#ff0000"          //动画的起始值
      android:valueTo="#0000ff"              //动画的最终值
      在set标签当中可以判断是同时执行,还是顺序执行
      android:ordering=""
            sequentially   :按顺序执行
            together       : 同时执行
2. 在activity当中把xml文件转化为属性动画,然后开启动画
    //获得属性动画的对象
        ObjectAnimator backgroundAnimator = (ObjectAnimator) AnimatorInflater.loadAnimator(this,R.animator.anim_bgcolor);
    //给指定的ui控件设置动画
        backgroundAnimator.setTarget(mTv);
    //开启动画
        backgroundAnimator.start();
实例

[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. public class PropertyActivity1 extends AppCompatActivity {  
  2.   
  3.   
  4.     private ImageView mIv;  
  5.     private TextView mTv;  
  6.   
  7.     @Override  
  8.     protected void onCreate(Bundle savedInstanceState) {  
  9.         super.onCreate(savedInstanceState);  
  10.         setContentView(R.layout.activity_property1);  
  11.         mIv = (ImageView) findViewById(R.id.iv);  
  12.         mTv = (TextView) findViewById(R.id.tv);  
  13.         //获得属性动画的对象  
  14.         ObjectAnimator backgroundAnimator = (ObjectAnimator) AnimatorInflater.loadAnimator(this,R.animator.anim_bgcolor);  
  15.         //给指定的ui控件设置动画  
  16.         backgroundAnimator.setTarget(mTv);  
  17.         //开启动画  
  18.         backgroundAnimator.start();  
  19.     }  
  20.   
  21.     public void scale(View view) {  
  22.   
  23.         switch (view.getId()) {  
  24.             case R.id.ScaleX:  
  25.                 ObjectAnimator scaleXAnimator = (ObjectAnimator) AnimatorInflater.loadAnimator(this,R.animator.anim_scalex);  
  26.                 scaleXAnimator.setTarget(mIv);  
  27.                 scaleXAnimator.start();  
  28.                 break;  
  29.             case R.id.ScaleXY:  
  30.                 Animator scaleXYAnimator = AnimatorInflater.loadAnimator(this,R.animator.anim_scalexy);  
  31.                 scaleXYAnimator.setTarget(mIv);  
  32.                 scaleXYAnimator.start();  
  33.                 break;  
  34.         }  
  35.     }  
  36. }  
[html] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:propertyName="textColor"  
  4.     android:duration="5000"  
  5.     android:valueType="intType"  
  6.     android:valueFrom="#ff0000"  
  7.     android:valueTo="#0000ff">  
  8.   
  9. </objectAnimator>  

[html] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <set xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:ordering="sequentially">  
  4.     <set android:ordering="together">  
  5.         <objectAnimator  
  6.             android:propertyName="scaleX"  
  7.             android:valueType="floatType"  
  8.             android:interpolator="@android:anim/linear_interpolator"  
  9.             android:valueTo="2.0"  
  10.             android:duration="3000"  
  11.             android:valueFrom="1.0"></objectAnimator>  
  12.   
  13.         <objectAnimator  
  14.             android:propertyName="scaleY"  
  15.             android:valueType="floatType"  
  16.             android:valueFrom="1.0"  
  17.             android:valueTo="2.0"  
  18.             android:duration="3000"  
  19.             android:interpolator="@android:anim/linear_interpolator"></objectAnimator>  
  20.     </set>  
  21.     <set android:ordering="together">  
  22.         <objectAnimator  
  23.             android:propertyName="translationY"  
  24.             android:valueType="floatType"  
  25.             android:valueFrom="0"  
  26.             android:valueTo="-1000"  
  27.             android:interpolator="@android:anim/accelerate_interpolator"  
  28.             android:duration="3000"></objectAnimator>  
  29.   
  30.         <objectAnimator  
  31.             android:propertyName="alpha"  
  32.             android:valueType="floatType"  
  33.             android:valueFrom="1.0"  
  34.             android:valueTo="0.1"  
  35.             android:duration="3000"></objectAnimator>  
  36.   
  37.         <objectAnimator  
  38.             android:propertyName="scaleX"  
  39.             android:valueType="floatType"  
  40.             android:interpolator="@android:anim/linear_interpolator"  
  41.             android:valueTo="1.0"  
  42.             android:duration="3000"  
  43.             android:valueFrom="2.0"></objectAnimator>  
  44.   
  45.         <objectAnimator  
  46.             android:propertyName="scaleY"  
  47.             android:valueType="floatType"  
  48.             android:valueFrom="2.0"  
  49.             android:valueTo="1.0"  
  50.             android:duration="3000"  
  51.             android:interpolator="@android:anim/linear_interpolator"></objectAnimator>  
  52.   
  53.     </set>  
  54.   
  55.   
  56. </set>  

实例:属性动画的响应谁事件

[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. public class PropertyActivity3 extends AppCompatActivity {  
  2.   
  3.     private ImageView iv;  
  4.     ObjectAnimator animator;  
  5.     @Override  
  6.     protected void onCreate(Bundle savedInstanceState) {  
  7.         super.onCreate(savedInstanceState);  
  8.         setContentView(R.layout.activity_property3);  
  9.         iv = (ImageView) findViewById(R.id.iv);  
  10.   
  11.         animator = ObjectAnimator.ofFloat(iv,"translationY",200F);  
  12.         animator.setDuration(5000);  
  13.   
  14.         //属性动画的响应事件   :包含了动画的四个常用的事件:start end   cancel  repeat  
  15.         animator.addListener(new Animator.AnimatorListener() {  
  16.             @Override  
  17.             public void onAnimationStart(Animator animation) {  
  18.                 Log.i("tag","========onAnimationStart========");  
  19.             }  
  20.             @Override  
  21.             public void onAnimationEnd(Animator animation) {  
  22.                 Log.i("tag","========onAnimationEnd========");  
  23.             }  
  24.             @Override  
  25.             public void onAnimationCancel(Animator animation) {  
  26.                 Log.i("tag","========onAnimationCancel========");  
  27.             }  
  28.             @Override  
  29.             public void onAnimationRepeat(Animator animation) {  
  30.                 Log.i("tag","========onAnimationRepeat========");  
  31.             }  
  32.         });  
  33.   
  34.         //大部分情况下,并不关心其他过程,只关注结束的过程  
  35.         animator.addListener(new AnimatorListenerAdapter() {  
  36.             @Override  
  37.             public void onAnimationEnd(Animator animation) {  
  38.                 super.onAnimationEnd(animation);  
  39.                 Log.i("tag","===AnimatorListenerAdapter=====onAnimationEnd=========");  
  40.             }  
  41.         });  
  42.     }  
  43.   
  44.     public void onClick(View view) {  
  45.         animator.start();  
  46.     }  
  47. }  
0 0
原创粉丝点击