Android动画详解

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

实例:

public class FrameActivity1 extends AppCompatActivity {

    private ImageView iv;
    //声明帧动画管理器
    private AnimationDrawable drawable;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_frame1);
        iv = (ImageView) findViewById(R.id.iv);
        iv.setBackgroundResource(R.drawable.my_frame_animation);
        drawable = (AnimationDrawable) iv.getBackground();
    }

    public void start(View view) {
        if (!drawable.isRunning()) {
            drawable.start();   //开启帧动画
        }
    }

    public void stop(View view) {
        if (drawable.isRunning()) {
            drawable.stop();    //停止动画
        }
    }
}
<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
    android:oneshot="false">
    <item android:drawable="@mipmap/anim1" android:duration="50"></item>
    <item android:drawable="@mipmap/anim2" android:duration="50"></item>
</animation-list>

或者在代码中加载:

public class FrameActivity3 extends AppCompatActivity {

    private ImageView iv;
    private AnimationDrawable drawable;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_frame3);
        iv = (ImageView) findViewById(R.id.iv);
        //在代码当中完成帧动画
        drawable = new AnimationDrawable();
        //向帧动画管理器中添加图片资源的过程
        drawable.addFrame(getResources().getDrawable(R.mipmap.girl_1),200);
        drawable.addFrame(getResources().getDrawable(R.mipmap.girl_2),200);

        //将动画资源显示在imageview上
        iv.setImageDrawable(drawable);

        drawable.setOneShot(false);
    }

    public void onClick(View view) {

        if (drawable.isRunning()){
            drawable.stop();
        }else {
            drawable.start();
        }
    }
}

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的实例:

public class TweenActivity1 extends AppCompatActivity {

    private ImageView mIv;
    //声明补间动画对象
    private Animation setAnim;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_tween1);
        mIv = (ImageView) findViewById(R.id.tweeniv);
        setAnim = AnimationUtils.loadAnimation(this,R.anim.anim_set);
    }

    public void onClick(View view) {
                mIv.startAnimation(setAnim);
        }
    }
}
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:interpolator="@android:anim/linear_interpolator"
    android:duration="2000">
    <alpha
        android:fromAlpha="1"
        android:toAlpha="0"></alpha>

    <scale
        android:fromXScale="1"
        android:toXScale="0"
        android:fromYScale="1"
        android:toYScale="0"
        android:pivotX="50%"
        android:pivotY="50%"></scale>

    <translate
        android:fromXDelta="0"
        android:fromYDelta="0"
        android:toXDelta="0"
        android:toYDelta="2000"
        ></translate>

    <rotate
        android:fromDegrees="0"
        android:toDegrees="1800"
        android:pivotX="50%"
        android:pivotY="50%"></rotate>
</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();
实例

public class PropertyActivity1 extends AppCompatActivity {


    private ImageView mIv;
    private TextView mTv;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_property1);
        mIv = (ImageView) findViewById(R.id.iv);
        mTv = (TextView) findViewById(R.id.tv);
        //获得属性动画的对象
        ObjectAnimator backgroundAnimator = (ObjectAnimator) AnimatorInflater.loadAnimator(this,R.animator.anim_bgcolor);
        //给指定的ui控件设置动画
        backgroundAnimator.setTarget(mTv);
        //开启动画
        backgroundAnimator.start();
    }

    public void scale(View view) {

        switch (view.getId()) {
            case R.id.ScaleX:
                ObjectAnimator scaleXAnimator = (ObjectAnimator) AnimatorInflater.loadAnimator(this,R.animator.anim_scalex);
                scaleXAnimator.setTarget(mIv);
                scaleXAnimator.start();
                break;
            case R.id.ScaleXY:
                Animator scaleXYAnimator = AnimatorInflater.loadAnimator(this,R.animator.anim_scalexy);
                scaleXYAnimator.setTarget(mIv);
                scaleXYAnimator.start();
                break;
        }
    }
}
<?xml version="1.0" encoding="utf-8"?>
<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
    android:propertyName="textColor"
    android:duration="5000"
    android:valueType="intType"
    android:valueFrom="#ff0000"
    android:valueTo="#0000ff">

</objectAnimator>

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:ordering="sequentially">
    <set android:ordering="together">
        <objectAnimator
            android:propertyName="scaleX"
            android:valueType="floatType"
            android:interpolator="@android:anim/linear_interpolator"
            android:valueTo="2.0"
            android:duration="3000"
            android:valueFrom="1.0"></objectAnimator>

        <objectAnimator
            android:propertyName="scaleY"
            android:valueType="floatType"
            android:valueFrom="1.0"
            android:valueTo="2.0"
            android:duration="3000"
            android:interpolator="@android:anim/linear_interpolator"></objectAnimator>
    </set>
    <set android:ordering="together">
        <objectAnimator
            android:propertyName="translationY"
            android:valueType="floatType"
            android:valueFrom="0"
            android:valueTo="-1000"
            android:interpolator="@android:anim/accelerate_interpolator"
            android:duration="3000"></objectAnimator>

        <objectAnimator
            android:propertyName="alpha"
            android:valueType="floatType"
            android:valueFrom="1.0"
            android:valueTo="0.1"
            android:duration="3000"></objectAnimator>

        <objectAnimator
            android:propertyName="scaleX"
            android:valueType="floatType"
            android:interpolator="@android:anim/linear_interpolator"
            android:valueTo="1.0"
            android:duration="3000"
            android:valueFrom="2.0"></objectAnimator>

        <objectAnimator
            android:propertyName="scaleY"
            android:valueType="floatType"
            android:valueFrom="2.0"
            android:valueTo="1.0"
            android:duration="3000"
            android:interpolator="@android:anim/linear_interpolator"></objectAnimator>

    </set>


</set>

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

public class PropertyActivity3 extends AppCompatActivity {

    private ImageView iv;
    ObjectAnimator animator;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_property3);
        iv = (ImageView) findViewById(R.id.iv);

        animator = ObjectAnimator.ofFloat(iv,"translationY",200F);
        animator.setDuration(5000);

        //属性动画的响应事件   :包含了动画的四个常用的事件:start end   cancel  repeat
        animator.addListener(new Animator.AnimatorListener() {
            @Override
            public void onAnimationStart(Animator animation) {
                Log.i("tag","========onAnimationStart========");
            }
            @Override
            public void onAnimationEnd(Animator animation) {
                Log.i("tag","========onAnimationEnd========");
            }
            @Override
            public void onAnimationCancel(Animator animation) {
                Log.i("tag","========onAnimationCancel========");
            }
            @Override
            public void onAnimationRepeat(Animator animation) {
                Log.i("tag","========onAnimationRepeat========");
            }
        });

        //大部分情况下,并不关心其他过程,只关注结束的过程
        animator.addListener(new AnimatorListenerAdapter() {
            @Override
            public void onAnimationEnd(Animator animation) {
                super.onAnimationEnd(animation);
                Log.i("tag","===AnimatorListenerAdapter=====onAnimationEnd=========");
            }
        });
    }

    public void onClick(View view) {
        animator.start();
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值