Android帧动画与补间动画

动画

  • 帧动画

Drawable Animation, frame Animation 类似于电影胶片,一组图片快速的播放,显示出来一个动画效果

官方的API文档

使用: 
1. 在项目中的res文件夹下的drawable放置帧动画的资源文件,创建一个xml资源文件,XML文件包含一个< animation-list >元素作为根节点和一系列子< item >节点,每个定义一个框架:框架和框架的可拉的资源持续时间。下面是一个示例XML文件为可拉的动画, 
指定android:oneshot=""表示设置循环 为true表示开启循环,为false表示不循环:

<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
    android:oneshot="true">
    <item android:drawable="@drawable/rocket_thrust1"
    表示当前这幅画面停留的时间 
    android:duration="200" />
    <item android:drawable="@drawable/rocket_thrust2" android:duration="200" />
    <item android:drawable="@drawable/rocket_thrust3" android:duration="200" />
</animation-list>

2.代码中播放动画

    setContentView(R.layout.activity_main);
    iv = (ImageView) findViewById(R.id.iv);
    iv.setBackgroundResource(R.drawable.girl);
    //获取到动画资源对象
    girlAnimation = (AnimationDrawable) iv.getBackground();//可能在子线程花费时间。
    girlAnimation.start();
    new Thread(){
        public void run() {
            try {
                Thread.sleep(1);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

        };
    }.start();
  • 补间动画

    private ImageView iv;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        iv = ((ImageView) findViewById(R.id.iv));
    }
    
    /**
     * 透明度
     *
     * @param v
     */
    public void alpha(View v) {
        //获取透明度动画对象,参数是从哪个透明度到哪个透明度 0完全透明 1.0
        AlphaAnimation alphaAnimation = new AlphaAnimation(0, 1.0f);
        //设置持续时间
        alphaAnimation.setDuration(2000);
        //设置重复次数
        alphaAnimation.setRepeatCount(5);
        //设置循环播放模式 ResTaRT 重头播放
        //Reverse 倒叙播放
        alphaAnimation.setRepeatMode(Animation.RESTART);
        //设置动画
        iv.startAnimation(alphaAnimation);
    }
    
    /**
     * 旋转
     *
     * @param v
     */
    public void rotate(View v) {
        //构造方法参数:开始的角度 结束的角度
        RotateAnimation ra = new RotateAnimation(0, 360, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
        ra.setDuration(2000);
        ra.setRepeatCount(5);
        iv.startAnimation(ra);
    }
    
    /**
     * 位移
     *
     * @param v
     */
    public void trans(View v) {
        TranslateAnimation ta = new TranslateAnimation(Animation.RELATIVE_TO_PARENT, 0, Animation.RELATIVE_TO_PARENT, 0.5f, Animation.RELATIVE_TO_PARENT, 0, Animation.RELATIVE_TO_PARENT, 0.5f);
        ta.setRepeatCount(5);
        ta.setDuration(2000);
        iv.startAnimation(ta);
    }
    
    /**
     * 缩放
     *
     * @param v
     */
    public void scale(View v) {
        //参数:开始的x的比例,开始的y比例,缩放的x类型,缩放的中心点x,y的类型,缩放的中心点y
        ScaleAnimation sa = new ScaleAnimation(0, 0.5f, 0, 0.5f, Animation.RELATIVE_TO_SELF, 0, Animation.RELATIVE_TO_SELF, 0.5f);
        sa.setRepeatCount(5);
        sa.setDuration(2000);
        //设置播放前后的效果,注意,这里会覆盖,只会生效最后设置的
        sa.setFillAfter(true);
        sa.setFillBefore(false);
        sa.setRepeatMode(Animation.RESTART);
        iv.startAnimation(sa);
    }
    
        /**
         * 设置动画集合
         * @param v
         */
    public void setAnimation(View v) {
        //动画集合 参数:false 表示先快后慢 true可以自定义动画播放速度
        AnimationSet set = new AnimationSet(false);
        AlphaAnimation alphaAnimation = new AlphaAnimation(0, 1.0f);
        //设置持续时间
        alphaAnimation.setDuration(2000);
        //设置重复次数
        alphaAnimation.setRepeatCount(5);
        //设置循环播放模式 ResTaRT 重头播放
        //Reverse 倒叙播放
        alphaAnimation.setRepeatMode(Animation.RESTART);
        //构造方法参数:开始的角度 结束的角度
        RotateAnimation ra = new RotateAnimation(0, 360, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
        ra.setDuration(2000);
        ra.setRepeatCount(5);
        ScaleAnimation sa = new ScaleAnimation(0, 0.5f, 0, 0.5f, Animation.RELATIVE_TO_SELF, 0, Animation.RELATIVE_TO_SELF, 0.5f);
        sa.setRepeatCount(5);
        sa.setDuration(2000);
        //设置播放前后的效果,注意,这里会覆盖,只会生效最后设置的
        sa.setFillAfter(true);
        sa.setFillBefore(false);
        sa.setRepeatMode(Animation.RESTART);
        TranslateAnimation ta = new TranslateAnimation(Animation.RELATIVE_TO_PARENT, 0, Animation.RELATIVE_TO_PARENT, 0.5f, Animation.RELATIVE_TO_PARENT, 0, Animation.RELATIVE_TO_PARENT, 0.5f);
        ta.setRepeatCount(5);
        ta.setDuration(2000);
        set.addAnimation(alphaAnimation);
        set.addAnimation(ra);
        set.addAnimation(sa);
        set.addAnimation(ta);
        iv.startAnimation(set);
    
    }
    
  • xml定义补间动画

    动画一般都是需要复用的,我们可以在res文件夹下定义一个动画的文件夹anim 
    在anim文件夹下可以创建我们的动画xml文件 alpha.xml

    <?xml version="1.0" encoding="utf-8"?>
    <alpha xmlns:android="http://schemas.android.com/apk/res/android"
        android:fromAlpha="0"
        android:toAlpha="1.0"
        android:duration="2000"
        android:repeatCount="2"
        android:repeatMode="reverse" >
    </alpha>
    

    rotate.xml

    <?xml version="1.0" encoding="utf-8"?>
    <rotate xmlns:android="http://schemas.android.com/apk/res/android"
        android:fromDegrees="0"
        android:toDegrees="360"
        android:pivotX="50%p"
        android:pivotY="50%p"
        android:duration="2000"
        android:repeatCount="2"
        android:repeatMode="reverse"
         >
    
    </rotate>
    

    scale.xml

        <?xml version="1.0" encoding="utf-8"?>
        <scale xmlns:android="http://schemas.android.com/apk/res/android"
            android:fromXScale="0.1"
            android:toXScale="2.0"
             android:fromYScale="0.1"
            android:toYScale="2.0"
            android:pivotX="50%"
            android:pivotY="50%"
            android:duration="2000"
            android:repeatCount="2"
            android:fillAfter="true"
            android:repeatMode="reverse" >
    
        </scale>
    

    set.xml

    <?xml version="1.0" encoding="utf-8"?> <rotate xmlns:android="http://schemas.android.com/apk/res/android" android:duration="2000" android:fromDegrees="0" android:pivotX="50%" android:pivotY="50%" android:repeatCount="2" android:repeatMode="reverse" android:toDegrees="360" >

    <scale
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:duration="2000"
        android:fillAfter="true"
        android:fromXScale="0.1"
        android:fromYScale="0.1"
        android:pivotX="50%"
        android:pivotY="50%"
        android:repeatCount="2"
        android:repeatMode="reverse"
        android:toXScale="2.0"
        android:toYScale="2.0" >
    </scale>
    
    <translate
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:duration="2000"
        android:fromXDelta="-50%p"
        android:fromYDelta="-50%p"
        android:repeatCount="2"
        android:repeatMode="reverse"
        android:toXDelta="50%p"
        android:toYDelta="50%p" >
    </translate>
    </set>
    

    trans.xml

    <?xml version="1.0" encoding="utf-8"?>
    <translate xmlns:android="http://schemas.android.com/apk/res/android"
        这里加p表示parent相对于父亲
        android:fromXDelta="-50%p"
        android:toXDelta="50%p"
        android:fromYDelta="-50%p"
        android:toYDelta="50%p"
        android:duration="2000"
        android:repeatCount="2"
        android:repeatMode="reverse"
         >
    
    </translate>
    

    书写动画的xml语法就是: 
    创建相应的动画 动画节点下 android:动画的属性名= value

    代码中加载动画文件:
    Animation aa = AnimationUtils.loadAnimation(this, R.anim.alpha);
    iv.startAnimation(aa);
    


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值