Android动画总结

一.帧动画.

1.在drawable文件夹下面创建动画文件.

<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:drawable="@mipmap/tm_mui_bike_0"
        android:duration="10"/>
    <item
        android:drawable="@mipmap/tm_mui_bike_1"
        android:duration="10"/>
    <item
        android:drawable="@mipmap/tm_mui_bike_2"
        android:duration="10"/>
    <item
        android:drawable="@mipmap/tm_mui_bike_3"
        android:duration="10"/>
    <item
        android:drawable="@mipmap/tm_mui_bike_4"
        android:duration="10"/>
    <item
        android:drawable="@mipmap/tm_mui_bike_5"
        android:duration="10"/>
    <item
        android:drawable="@mipmap/tm_mui_bike_5"
        android:duration="10"/>
    <item
        android:drawable="@mipmap/tm_mui_bike_6"
        android:duration="10"/>
</animation-list>
   mImageView.setImageResource(R.drawable.animi);
        AnimationDrawable drawable = (AnimationDrawable) mImageView.getDrawable();
        drawable.start();

2.在 代码里面进行书写:

  AnimationDrawable animationDrawable = new AnimationDrawable();
        animationDrawable.setOneShot(false);
        animationDrawable.addFrame(getResources().getDrawable(R.mipmap.tm_mui_bike_0), 100);
        animationDrawable.addFrame(getResources().getDrawable(R.mipmap.tm_mui_bike_1), 100);
        animationDrawable.addFrame(getResources().getDrawable(R.mipmap.tm_mui_bike_2), 100);
        animationDrawable.addFrame(getResources().getDrawable(R.mipmap.tm_mui_bike_3), 100);
        animationDrawable.addFrame(getResources().getDrawable(R.mipmap.tm_mui_bike_4), 100);
        animationDrawable.addFrame(getResources().getDrawable(R.mipmap.tm_mui_bike_5), 100);
        animationDrawable.addFrame(getResources().getDrawable(R.mipmap.tm_mui_bike_6), 100);
        animationDrawable.addFrame(getResources().getDrawable(R.mipmap.tm_mui_bike_7), 100);
        mImageView.setBackground(animationDrawable);
        animationDrawable.start();

 二.补间动画.

1.旋转动画

RotateAnimation rote = new RotateAnimation(0, 360, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
rote.setDuration(3000);
rote.setFillAfter(true);
View.startAnimation(rote);

参数说明:
float fromDegrees:旋转的开始角度。
float toDegrees:旋转的结束角度。
int pivotXType:X轴的伸缩模式,可以取值为ABSOLUTE、RELATIVE_TO_SELF、RELATIVE_TO_PARENT。
float pivotXValue:X坐标的伸缩值。
int pivotYType:Y轴的伸缩模式,可以取值为ABSOLUTE、RELATIVE_TO_SELF、RELATIVE_TO_PARENT。
float pivotYValue:Y坐标的伸缩值。

2.渐变动画

AlphaAnimation alphaAnimation = new AlphaAnimation(0, 1);
//设置动画播放的时间的长短
alphaAnimation.setDuration(5000);
//设置动画结束的时候是否是在动画的终点的位置
alphaAnimation.setFillAfter(true);
//给控件设置上动画的效果
View.startAnimation(alphaAnimation);


参数说明:
 float fromAlpha 动画开始时的透明度
 float toAlpha      动画结束的透明度
0表示完全透明,1表示完全显示

3,平移动画

TranslateAnimation translateAnimation = new TranslateAnimation(0, 500, 0, 0);
translateAnimation.setDuration(1000);
translateAnimation.setFillAfter(false);
mAnima.startAnimation(translateAnimation);

float fromXDelta 动画开始的点离当前View X坐标上的差值
float toXDelta 动画结束的点离当前View X坐标上的差值
float fromYDelta 动画开始的点离当前View Y坐标上的差值
float toYDelta 动画开始的点离当前View Y坐标上的差值

4.缩放动画

ScaleAnimation sca = new ScaleAnimation(0.0f, 3f, 0.0f, 3f,
Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
sca.setDuration(1000);
sca.setFillAfter(true);
mAnima.startAnimation(sca);

float fromX 动画起始时 X坐标上的伸缩尺寸
float toX 动画结束时 X坐标上的伸缩尺寸
float fromY 动画起始时Y坐标上的伸缩尺寸
float toY 动画结束时Y坐标上的伸缩尺寸
int pivotXType 动画在X轴相对于物件位置类型
float pivotXValue 动画相对于物件的X坐标的开始位置
int pivotYType 动画在Y轴相对于物件位置类型
float pivotYValue 动画相对于物件的Y坐标的开始位置

 5.动画集

TranslateAnimation translateAnimation = new TranslateAnimation(0, 500, 0, 0);
translateAnimation.setDuration(3000);
RotateAnimation rote = new RotateAnimation(0, 360, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
rote.setDuration(3000);
ScaleAnimation sca = new ScaleAnimation(0.0f, 3f, 0.0f, 3f,
Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
sca.setDuration(1000);
AnimationSet animationSet = new AnimationSet(true);
animationSet.addAnimation(translateAnimation);
animationSet.addAnimation(rote);
animationSet.addAnimation(sca);
mAnima.startAnimation(animationSet);


new AnimationSet(false)创建AnimationSet时,可以在每个添加到AnimationSet中的Animation都使用Interpolator,且效果都能清楚的观察。
 new AnimationSet(true)创建AnimationSet时,如果在添加到AnimationSet中的Animation设置Interpolator将无效果,通过设置AnimationSet的Interpolator可以设置所有动画的Interpolator且所有动画的Interpolator都一样。

三.属性动画.

1.两种实现的方式:

1:在res文件夹下面创建一个animater文件夹,然后在文件夹里面定义动画.

在XML文件中我们一共可以使用如下三种标签:

  • 在XML文件中我们一共可以使用如下三种标签:
  • <objectAnimator> 对应代码中的ObjectAnimator
  • <set> 对应代码中的AnimatorSet
<?xml version="1.0" encoding="utf-8"?>
<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="1000"//时间
android:propertyName="scaleX"//属性
android:valueFrom="1.0"
android:valueTo="2.0"
android:valueType="floatType">
</objectAnimator>  

组合动画:

<set xmlns:android="http://schemas.android.com/apk/res/android"  
    android:ordering="sequentially" >  
  
    <objectAnimator  
        android:duration="2000"  
        android:propertyName="translationX"  
        android:valueFrom="-500"  
        android:valueTo="0"  
        android:valueType="floatType" >  
    </objectAnimator>  
  
    <set android:ordering="together" >  
        <objectAnimator  
            android:duration="3000"  
            android:propertyName="rotation"  
            android:valueFrom="0"  
            android:valueTo="360"  
            android:valueType="floatType" >  
        </objectAnimator>  
  
        <set android:ordering="sequentially" >  
            <objectAnimator  
                android:duration="1500"  
                android:propertyName="alpha"  
                android:valueFrom="1"  
                android:valueTo="0"  
                android:valueType="floatType" >  
            </objectAnimator>  
            <objectAnimator  
                android:duration="1500"  
                android:propertyName="alpha"  
                android:valueFrom="0"  
                android:valueTo="1"  
                android:valueType="floatType" >  
            </objectAnimator>  
        </set>  
    </set>  
  
</set>  

读取xml定义好的动画效果

Animator animator = AnimatorInflater.loadAnimator(context, R.animator.anim_file);  
animator.setTarget(view);  
animator.start(); 

1:使用代码进行创建

   ObjectAnimator objectAnimator1 = ObjectAnimator.ofFloat(mTextView, "alpha", 0f, 1f, 0f);
    objectAnimator1.setDuration(5000);
    objectAnimator1.start();

通过ObjectAnimator的静态工厂方法,创建一个ObjectAnimator对象,我们传递的第一个参数就是要动画要作用的view对象btn,第二个参数则是要操作的属性,而后面的一个参数是一个可变参数数组,当传递参数数组只有一个数值时,动画内部去调用get方法获取初始化参数,并把传递参数作为目标值,而当传递参数的数组中有两个数值时,则会把第一个数值作为初始值,这时就不会去调用get了,只会调用set方式设置动画过程,并以第二个数值作为目标值,如我们上面传递了0和200,其中0就是初始值,而200就是目标值。其后的设置,setDuration(3000);设置动画时间,objectAnimator.start();则是启动动画。

2.原理.

属性动画其本质就是改变view的属性,使其去实现动画的效果.

要给一个view设置动画需要查看该View是否是具有get和set方法的.例如:

translationX -->x方向平移
alpha        -->颜色渐变
rotation     -->旋转
scaleY       -->y轴放大    
scaleX       -->x轴放大     

3.组合动画.

实现组合动画功能主要需要借助AnimatorSet这个类,这个类提供了一个play()方法,如果我们向这个方法中传入一个Animator对象(ValueAnimator或ObjectAnimator)将会返回一个AnimatorSet.Builder的实例,AnimatorSet.Builder中包括以下四个方法:

  • after(Animator anim) 将现有动画插入到传入的动画之后执行
  • after(long delay) 将现有动画延迟指定毫秒后执行
  • before(Animator anim) 将现有动画插入到传入的动画之前执行
  • with(Animator anim) 将现有动画和传入的动画同时执行

例如:

 ObjectAnimator objectAnimator = ObjectAnimator.ofFloat(mTextView, "alpha", 0f, 1f, 0f);
                ObjectAnimator animator = ObjectAnimator.ofFloat(mTextView, "scaleY", 1f, 3f, 1f);
                ObjectAnimator animator2 = ObjectAnimator.ofFloat(mTextView, "scaleX", 1f, 3f, 1f);
                AnimatorSet animatorSet = new AnimatorSet();
                animatorSet.play(animator).before(animator2).before(objectAnimator);
                animatorSet.setDuration(5000);
                animatorSet.start();

4.监听动画播放的事件.

使用addListener()这个方法来监听动画播放事件.

   animatorSet.addListener(new Animator.AnimatorListener() {
                    @Override
                    public void onAnimationStart(Animator animation) {
                      //动画开始  
                    }

                    @Override
                    public void onAnimationEnd(Animator animation) {
                    //动画结束
                    }

                    @Override
                    public void onAnimationCancel(Animator animation) {
                    //动画取消
                    }

                    @Override
                    public void onAnimationRepeat(Animator animation) {
                    //动画重复播放
                    }
                });

但是也许很多时候我们并不想要监听那么多个事件,可能我只想要监听动画结束这一个事件,那么每次都要将四个接口全部实现一遍就显得非常繁琐。没关系,为此Android提供了一个适配器类,叫作AnimatorListenerAdapter,使用这个类就可以解决掉实现接口繁琐的问题了,如下所示:

animatorSet.addListener(new AnimatorListenerAdapter() {
                    @Override
                    public void onAnimationEnd(Animator animation) {
                        super.onAnimationEnd(animation);
                       //动画播放完毕
                    }
                });

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值