基础动画的使用

今天,将要介绍一下Android中各种动画的制作。
主要围绕六个部来分别介绍:

1.透明动画;
2.移动动画;
3.旋转动画;
4.缩放动画;
5.混合动画;
6.自定义动画;
7.帧动画
前面的四种是我们Android中最基础的四种动画,好多复杂的动画都是经过这些动画合成起来的。

好了,废话不多说了,开始干活!
1.透明动画
透明动画就是一个View从一个透明度变到另一个透明度。
在这里我们有两种方法来实现,第一个就是直接在代码中进行实现,第二种就是通过在XML文件中进行,然后在代码中进行引用。
(1)直接在代码中进行实现

public class MainActivity extends Activity {
    Button btn;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        btn = (Button)findViewById(R.id.btn);
        /**
         * 透明度从0到1
         */
        final AlphaAnimation aa = new AlphaAnimation(0, 1);
        //设置动画持续时间2秒
        aa.setDuration(2000);
        btn.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                //开始动画
                v.startAnimation(aa);
            }
        });
    }

}

这里写图片描述

(2)在xml文件中写好动画,然后再去引用(touming.xml)

<?xml version="1.0" encoding="utf-8"?>
<alpha xmlns:android="http://schemas.android.com/apk/res/android"
    android:fromAlpha="0.5"
    android:toAlpha="1"
    android:duration="2000">
</alpha>

然后代码中只需要一句话即可:

v.startAnimation(AnimationUtils.loadAnimation(MainActivity.this, R.anim.touming));

这里写图片描述

2.移动动画
移动动画就是一个View从一个地方移动到另外一个地方。
在这里我们有两种方法来实现,第一个就是直接在代码中进行实现,第二种就是通过在XML文件中进行,然后在代码中进行引用。
(1)直接在代码中进行实现

public class MainActivity extends Activity {

    Button btn;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        btn = (Button)findViewById(R.id.btn);
        //系统自带的动画效果,一定要记住四个参数的含义,并不是从(0,0)到(200,200)坐标间的移动,而是一个向量值,从当前位置x轴方向正向移动200,y轴方向正向移动200.
        final TranslateAnimation ta = new TranslateAnimation(0, 200, 0, 200);
        //设置动画时间
        ta.setDuration(2000);
        //xml文件中自己编写的动画效果
        btn.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                //开始动画
            v.startAnimation(ta);
            }
        });
    }

}

这里写图片描述
(2)在xml文件中写好动画,然后再去引用(yidong.xml)

<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:android="http://schemas.android.com/apk/res/android"
<!--0代表当前位置的xy轴坐标-->
    android:fromXDelta="0"
    android:toXDelta="200"
    android:fromYDelta="0"
    android:toYDelta="200"
    android:duration="3000"
    <!--动画结束时固定在原地不动-->
    android:fillAfter="true">
</translate>

然后代码中只需要一句话即可:

v.startAnimation(AnimationUtils.loadAnimation(MainActivity.this, R.anim.yidong));

这里写图片描述
3.旋转动画
旋转动画就是一个View以某一点进行旋转。
在这里我们有两种方法来实现,第一个就是直接在代码中进行实现,第二种就是通过在XML文件中进行,然后在代码中进行引用。
(1)直接在代码中进行实现

public class MainActivity extends Activity {

    Button btn;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        btn = (Button)findViewById(R.id.btn);
        //相对于控件中心进行旋转,尤其要清楚参数的含义,前两个是旋转的角度(从0到360度),后面四个是以哪个点做为原点进行旋转的(以自身宽度的的中点。高度的中点)
       final RotateAnimation ra = new RotateAnimation(0, 360, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
       //时间为2秒
        ra.setDuration(2000);
        btn.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                //开始动画
                v.startAnimation(ra);

            }
        });
    }

}

这里写图片描述
(2)在xml文件中写好动画,然后再去引用(xuanzhuan.xml)

<?xml version="1.0" encoding="utf-8"?>
<rotate xmlns:android="http://schemas.android.com/apk/res/android"
    android:fromDegrees="0"
    android:toDegrees="180"
    android:duration="2000"
    <!--动画结束之后暂定状态-->
    android:fillAfter="true">
</rotate>

然后代码中只需要一句话即可:

v.startAnimation(AnimationUtils.loadAnimation(MainActivity.this,R.anim.xuanzhuan));

这里写图片描述
这里面有一个非常重要的点就是,旋转的开始位置为x轴右边
这里写图片描述

4.缩放动画
缩放动画就是一个View从一个尺寸拉伸到另一个尺寸。
在这里我们有两种方法来实现,第一个就是直接在代码中进行实现,第二种就是通过在XML文件中进行,然后在代码中进行引用。
(1)直接在代码中进行实现

public class MainActivity extends Activity {

    Button btn;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        /**
         * 第一个参数:初始为0.5倍宽度
         * 第二个参数:结束位1倍宽度
         * 第三个参数:初始为0.5倍高度
         * 第四个参数:结束位1倍高度
         * 第五个参数:已父控件为目标
         * 第六个参数:缩放开始点x为控件宽度中点
         * 第七个参数:已父控件为目标
         * 第八个参数:缩放开始点y为控件宽度中点
         */
        final ScaleAnimation sa = new ScaleAnimation(0.5f,1,0.5f, 1, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
        sa.setDuration(2000);
        btn = (Button)findViewById(R.id.btn);
        btn.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                v.startAnimation(sa);
            }   
        });
    }

}

这里写图片描述
(2)在xml文件中写好动画,然后再去引用(suofang.xml)

<?xml version="1.0" encoding="utf-8"?>
<scale xmlns:android="http://schemas.android.com/apk/res/android"
<!--x,y轴都是从0放大到1-->
    android:fromXScale="0"
    android:toXScale="1"
    android:fromYScale="0"
    android:toYScale="1"
    <!--都是以view的中点来缩放-->
    android:pivotX="50%"
    android:pivotY="50%"
    android:duration="3000">
</scale>

然后代码中只需要一句话即可:

v.startAnimation(AnimationUtils.loadAnimation(MainActivity.this,R.anim.suofang));

这里写图片描述
5、混合动画
混合动画就是将上面四种基础动画混合起来运行。
在这里我们有两种方法来实现,第一个就是直接在代码中进行实现,第二种就是通过在XML文件中进行,然后在代码中进行引用。
(1)直接在代码中进行实现

public class MainActivity extends Activity {

    Button btn;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        btn = (Button)findViewById(R.id.btn);
        //是否共同执行动画
        final AnimationSet aset = new AnimationSet(true);
        aset.setDuration(2000);
        //移动动画
        TranslateAnimation ta = new TranslateAnimation(0, 300, 0, 300);
        ta.setDuration(2000);
        aset.addAnimation(ta);
        //透明动画
        AlphaAnimation aa = new AlphaAnimation(0, 0.5f);
        aa.setDuration(2000);
        aset.addAnimation(aa);
        //动画监听
        aset.setAnimationListener(new Animation.AnimationListener() {

            @Override
            public void onAnimationStart(Animation arg0) {
                // TODO Auto-generated method stub
                Toast.makeText(MainActivity.this, "动画开始之前", 0).show();
            }

            @Override
            public void onAnimationRepeat(Animation arg0) {
                // TODO Auto-generated method stub
                Toast.makeText(MainActivity.this, "动画重复", 0).show();
            }

            @Override
            public void onAnimationEnd(Animation arg0) {
                // TODO Auto-generated method stub
                Toast.makeText(MainActivity.this, "动画结束", 0).show();
            }
        });

        btn.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                v.startAnimation(aset);

            }
        });
    }

}

这里写图片描述
(2)在xml文件中写好动画,然后再去引用(hunhe.xml)

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="2000"
    android:shareInterpolator="true" >
<!--透明动画-->
    <alpha
        android:duration="2000"
        android:fromAlpha="0"
        android:toAlpha="1" />
<!--移动动画-->
    <translate
        android:duration="2000"
        android:fromXDelta="0"
        android:fromYDelta="0"
        android:toXDelta="300"
        android:toYDelta="300" />

</set>

然后代码中只需要一句话即可:

v.startAnimation
(AnimationUtils.loadAnimation(MainActivity.this, R.anim.hunhe));

6.自定义动画
自定义动画就是其实跟自定义控件的含义是一样的,都是根据自己的需要定做一组动画。既然是跟自定义控件的含义是一样的,那么我们必须要写一个自定义动画类,用来写我们需要的动画。

//父类为Animation
public class DAnimation extends Animation {

    //执行过程中不断地调用这个方法interpolatedTime(0到1),t为要变化的控件
    @Override
    protected void applyTransformation(float interpolatedTime, Transformation t) {
        // TODO Auto-generated method stub
        //取一个周期的正弦值
        t.getMatrix().setTranslate((float)Math.sin(interpolatedTime*20)*50, 0);
    }

    @Override
    public void initialize(int width, int height, int parentWidth,
            int parentHeight) {
        // TODO Auto-generated method stub
        super.initialize(width, height, parentWidth, parentHeight);
    }


}

代码中去启动这自定义动画对象:

public class MainActivity extends Activity {

    Button btn;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        btn = (Button)findViewById(R.id.btn);
        final DAnimation ad = new DAnimation();
        ad.setDuration(2000);
        btn.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                v.startAnimation(ad);
            }
        });
    } 
}

这里写图片描述
7.帧动画
向我们平时开发用到比较多的就是帧动画,因为要想实现一些比较难的动画,而上面几种方法用起来有特别的费时费力,那么我们就可以请我们的美工妹妹给我们切一组图片,然后将其快速的播放出来就是帧动画,就像我们我们小时候看的那种小儿书,如果将其快速的翻阅,便会觉得有个动画在播放。
在这里我们就需要将这组动画,写到xml文件中。

<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
    android:oneshot="false" >
    <item 
        android:drawable="@drawable/load_img_temp_1"
        android:duration="80"
        ></item>
    <item 
        android:drawable="@drawable/load_img_temp_2"
        android:duration="80"
        ></item>
    <item 
        android:drawable="@drawable/load_img_temp_3"
        android:duration="80"
        ></item>
    <item 
        android:drawable="@drawable/load_img_temp_4"
        android:duration="80"
        ></item>
    <item 
        android:drawable="@drawable/load_img_temp_5"
        android:duration="80"
        ></item>
    <item 
        android:drawable="@drawable/load_img_temp_6"
        android:duration="80"
        ></item>
    <item 
        android:drawable="@drawable/load_img_temp_7"
        android:duration="80"
        ></item>
    <item 
        android:drawable="@drawable/load_img_temp_8"
        android:duration="80"
        ></item>
    <item 
        android:drawable="@drawable/load_img_temp_9"
        android:duration="80"
        ></item>
    <item 
        android:drawable="@drawable/load_img_temp_10"
        android:duration="80"
        ></item>
    <item 
        android:drawable="@drawable/load_img_temp_11"
        android:duration="80"
        ></item>
    <item 
        android:drawable="@drawable/load_img_temp_12"
        android:duration="80"
        ></item>
    <item 
        android:drawable="@drawable/load_img_temp_13"
        android:duration="80"
        ></item>
    <item 
        android:drawable="@drawable/load_img_temp_14"
        android:duration="80"
        ></item>
    <item 
        android:drawable="@drawable/load_img_temp_15"
        android:duration="80"
        ></item>
    <item 
        android:drawable="@drawable/load_img_temp_16"
        android:duration="80"
        ></item>
    <item 
        android:drawable="@drawable/load_img_temp_17"
        android:duration="80"
        ></item>
    <item 
        android:drawable="@drawable/load_img_temp_18"
        android:duration="80"
        ></item>

</animation-list>

注意每一个items都对应一段播放时间,这里面是80毫秒
布局文件

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".AnimationActivity" >

   <ImageView
       android:id="@+id/animation"
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:layout_centerHorizontal="true"
       android:layout_centerVertical="true"
       android:background="@drawable/refresh_load_list" />

</RelativeLayout>

java代码

public class AnimationActivity extends Activity {

    ImageView iv;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_animation);
        iv = (ImageView)findViewById(R.id.animation);
        //获取动画对象
        AnimationDrawable ad = (AnimationDrawable)iv.getBackground();
        ad.start();
    }
}

我们也可以通过动态添加的方式来实现:

public class AnimationActivity extends Activity {

    ImageView iv;
    AnimationDrawable ad;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_animation);
        iv = (ImageView)findViewById(R.id.animation);
        //将此动画的xml文件添加到该控件中
        iv.setImageResource(R.drawable.refresh_load_list);
        //获取动画
        ad = (AnimationDrawable)iv.getDrawable();
        ad.start();
    }

}

源码地址:下载源码

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值