Android动画详解

一、补间动画
(一)通过XML形式定义动画。
新建动画文件:res→new→Android resource file→Resource type选择
Animation.

1.透明度渐变(AlphaAnimation)

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:interpolator="@android:anim/linear_interpolator">

    <alpha
        android:repeatMode="restart"
        android:repeatCount="infinite"
        android:duration="1000"
        android:fromAlpha="0.0"
        android:toAlpha="1.0"
        />
</set>

2旋转动画(RotateAnimation)

<rotate
        android:fromDegrees="0"
        android:toDegrees="180"
        android:pivotX="50%"
        android:pivotY="50%"
        android:repeatMode="restart"
        android:repeatCount="infinite"
        android:duration="2000"/>
    <!-- android:pivotX="50%"   指定轴心的X坐标-->

3.缩放动画(ScaleAnimation)

<scale
        android:repeatMode="restart"
        android:repeatCount="infinite"
        android:duration="3000"
        android:fromXScale="1.0"
        android:fromYScale="1.0"
        android:toXScale="2.0"
        android:toYScale="0.5"
        android:pivotX="50%"
        android:pivotY="50%"/>
    <!--android:fromXScale="1.0" 指定动画开始时X轴的缩放系数-->
    <!--android:toXScale="2.0"   指定动画结束时X轴的缩放系数-->

4.平移动画(TranslateAnimation)

<translate
        android:fromXDelta="50"
        android:fromYDelta="50"
        android:toXDelta="200"
        android:toYDelta="200"
        android:repeatCount="infinite"
        android:repeatMode="restart"
        android:duration="5000"/>

在代码中:

 Animation ani1 = AnimationUtils.loadAnimation(this,R.anim.alpha_animation);
                img01.startAnimation(ani1);

(二)、通过代码创建补间动画

//缩放
    public void scale(View view) {
        scale_anim = new ScaleAnimation(1f,1.5f,1f,0.5f,Animation.RELATIVE_TO_SELF,
                0.5f,Animation.RELATIVE_TO_SELF,0.5f);
        scale_anim.setFillAfter(true);  //设置是否保持动画后的状态
//        scale_anim.setStartOffset(1000);//设置延时时间
        scale_anim.setDuration(2000);
        imageView.startAnimation(scale_anim);
    }

    //旋转
    public void rotate(View view) {
        rotate_anim = new RotateAnimation(0f,300f,
                Animation.RELATIVE_TO_SELF,0.5f,
                Animation.RELATIVE_TO_SELF,0.5f);
        rotate_anim.setDuration(3000);
        //设置是否保持旋转后的状态
        rotate_anim.setFillAfter(true);
        rotate_anim.setRepeatCount(2);
        imageView.startAnimation(rotate_anim);
    }

    //平移
    public void translate(View view) {
        translate_anim = new TranslateAnimation(0f,300f,0,0);
        translate_anim.setInterpolator(new BounceInterpolator());//设置插值器
        translate_anim.setDuration(2000);

        translate_anim.setAnimationListener(new MyAnimationListener());
        imageView.startAnimation(translate_anim);
    }

    //渐变
    public void alpha(View view) {
        //fromAlpha   toAlpha
        alpha_anim = new AlphaAnimation(1.0f, 0.2f);

        //duration time
        alpha_anim.setDuration(3000);
        imageView.startAnimation(alpha_anim);

    }

    //动画集合
    public void all(View view) {
        translate_anim = new TranslateAnimation(0f,300f,0,0);
//        translate_anim.setInterpolator(new BounceInterpolator());

        rotate_anim = new RotateAnimation(200f,30f,
                Animation.RELATIVE_TO_SELF,0.5f,
                Animation.RELATIVE_TO_SELF,0.5f);
        rotate_anim.setRepeatCount(2);

        AnimationSet set = new AnimationSet(true);
        set.addAnimation(translate_anim);
        set.addAnimation(rotate_anim);
        set.setDuration(3000);
        set.setInterpolator(new BounceInterpolator());
        imageView.startAnimation(set);
    }

二、逐帧动画
新建资源文件:res→new→Android resource file→Resource type选择
Drawable,Root element选择animation-list;

<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:drawable="@mipmap/horse1"
        android:duration="200" />
    <item
        android:drawable="@mipmap/horse2"
        android:duration="200" />
   ......

</animation-list>

布局文件中:

 <ImageView
            android:id="@+id/image_array"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:background="@drawable/frame"/>

注意这里使用backg而非src

然后得到AnimationDrawable对象:
private AnimationDrawable ad;
ad = (AnimationDrawable) ima.getBackground();

 public void begin(View view) {
//        ima.setImageResource(R.drawable.frame);
//        //拿到AnimationDrawable对象
//        ad = (AnimationDrawable) ima.getDrawable();
        if(!ad.isRunning()){
            ad.start();
        }
    }

    public void pause(View view) {
        if(ad.isRunning()){
            ad.stop();
        }

    }

三、属性动画

//渐变
    public void alpha(View view) {
        ObjectAnimator animator = ObjectAnimator.ofFloat(ima,"alpha",1.0f,0.5f);
        animator.setDuration(2000);
        animator.start();
    }
    //平移
    public void translate(View view) {
        ObjectAnimator animator = ObjectAnimator.ofFloat(ima,"translationY",0.0f,300f);
        animator.setDuration(2000);
        animator.start();
    }
    //缩放
    public void scale(View view) {
        ObjectAnimator animator = ObjectAnimator.ofFloat(ima,"scaleX",1.0f,0.5f);
        animator.setInterpolator(new BounceInterpolator());
        animator.setDuration(2000);
        animator.start();


    }
    //旋转
    public void rotate(View view) {
        ObjectAnimator animator = ObjectAnimator.ofFloat(ima,"rotationX",0.0f,720f);
        animator.setInterpolator(new BounceInterpolator());
        animator.setDuration(2000);
        animator.start();
    }

    //动画集合
    public void all(View view) {
//        PropertyValuesHolder holder1 = PropertyValuesHolder.ofFloat("translationY",0.0f,300f);
//        PropertyValuesHolder holder2 = PropertyValuesHolder.ofFloat("rotationX",0.0f,600f);
//        ObjectAnimator anim_all = ObjectAnimator.ofPropertyValuesHolder(ima,holder1,holder2);
//        anim_all.setInterpolator(new CycleInterpolator(0.5f)); //设置插值器
//        anim_all.setDuration(1000);
//        anim_all.start();

        /*第二种方式*/
        ObjectAnimator anim1 = ObjectAnimator.ofFloat(ima, "translateY", 0f, 300f);
        ObjectAnimator anim2 = ObjectAnimator.ofFloat(ima, "rotationY", 0f, 300f);
        ObjectAnimator anim3 = ObjectAnimator.ofFloat(ima, "scaleX", 1f, 0.5f);
        AnimatorSet set = new AnimatorSet();

//        set.playTogether(anim1,anim2,anim3);//一起执行
        set.playSequentially(anim1,anim2,anim3);//按顺序执行
//        set.play(anim1).after(anim2);set.play(anim2).with(anim1)...//先后顺序

        set.setDuration(2000);
        set.start();
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

KindSuper_liu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值