随心而动--Animation(1)

本篇主要为Android Animation分析

导读:
1.Animation是什么?
2.Animation分类
3.Tween Animation
4.监听器和插值器
5. LayoutAnimationsController
6.Frame-By-Frame Animation
7.Property Animation
8.总结

一. Animation是什么?

Animation在英文里是动画的意思,在Android中,使用Animation实现Android UI界面动画效果,Animations提供了一系列的动画效果,可以进行旋转、缩放、淡入淡出等,这些效果可以应用在绝大多数的控件中。

二.Animation的分类

在Android 3.0(API Level 11)以前,Android仅支持2种动画:分别是Frame-By-Frame Animation(逐帧动画)和 Tween Animation(补间动画),在3.0之后Android添加了一种新的动画系统,称为:Property Animation(属性动画)。
其中前两种统称为视图动画(View Animation)。

三.Tween Animation(补间动画)

概念:补间动画指我们只需指定开始、结束时的“关键帧“,变化中的其他帧由系统来计算,从而达到动画效果。

补间动画的优点是可以节省空间。目前Tween Animation支持的动画效果有以下5种。

AlphaAnimation(渐变)
Translate Animation(位移)
Scale Animation(缩放)
Rotate Animation(旋转)
Animation Set(动画集合)

Tween Animation第一种使用方法:

1.创建一个animationset对象,
2.根据需要创建相应的animation对象
3.为animation设置相应的数据
4.将animation对象添加到animationset对象当中去,
5.设置空间执行animationset

首先在布局里放置启动动画按钮和动画演示图片,在java代码中设置相应的监听器之后,在监听器里添加动画代码

   //Alpha动画
                /*第一步:创建animationset对象
                *第二步:创建alphaanimation对象,设置相关参数
                 *第三步:设置时长(毫秒)
                 * 第四步:添加动画
                 * 第五步:设置动画
                 */
                AnimationSet animationset=new AnimationSet(true);
                //参数说明:0,1分别代表着起始透明度和终止透明度
                AlphaAnimation alphaanimation=new AlphaAnimation(0,1);
                alphaanimation.setDuration(1000);
                animationset.addAnimation(alphaanimation);
                image.startAnimation(animationset);
// Translate动画
//参数里的Animation.RELATIVE_TO_SELF是指相对于自身,另外还有相对父布局,绝对位置两种参数
   AnimationSet animationset=new AnimationSet(true);
                TranslateAnimation ta=new TranslateAnimation(
                        Animation.RELATIVE_TO_SELF,0f, //相对参考  x起始
                        Animation.RELATIVE_TO_SELF,2.5f, //相对参考    x结束
                       Animation.RELATIVE_TO_SELF,0f,   // 相对参考  y开始
                        Animation.RELATIVE_TO_SELF,-2.5f   //相对参考  y结束
                );
                ta.setDuration(1000);
                animationset.addAnimation(ta);
                image.startAnimation(animationset);
// Rotate动画
  AnimationSet animationset = new AnimationSet(true);
                //参数一:从?角度开始旋转
                //参数二:旋转到?角度
                //参数三:依靠的x轴是父布局还是自己
                //参数四:相对参数三旋转偏移量
                //参数五:依靠的y轴是父布局还是自己
                 //参数六:相对参数五旋转偏移量
                    RotateAnimation ra = new RotateAnimation(0, 360, Animation.RELATIVE_TO_PARENT,
                            0.2f, Animation.RELATIVE_TO_SELF, -0.2f);
                    ra.setDuration(12000);
                    animationset.addAnimation(ra);
                image.startAnimation(animationset);
//Scale动画
    AnimationSet animationset=new AnimationSet(true);
               //参数1,2:x轴从?缩小到?
                //参数3,4:y轴从?缩小到?
                //参数5,6:相对x轴参考及缩放量
                //参数7,8:相对y轴参考及缩放量
                ScaleAnimation sa=new ScaleAnimation(1,0.5f,1,0.5f
                ,Animation.RELATIVE_TO_SELF,1.0f,Animation.RELATIVE_TO_SELF
                ,1.0f);
                sa.setDuration(1000);
                animationset.addAnimation(sa);
                image.startAnimation(animationset);

以上是补间的四种基本动画,另外还有AnimationSet集合动画
首先什么是AnimationSet?

  • AnimationSet是Animation的子类
    一个AnimationSet包含一系列的Animation对象;

    怎么使用AnimationSet?

  • AnimationSet 使用方法同其他动画类似,代码如下
    AnimationSet animationSet=new AnimationSet(true);
             AlphaAnimation alpha = new AlphaAnimation(0.1f,1.0f);
             //一个渐变动画对象
                RotateAnimation rotateAnimation=new RotateAnimation(0,360,Animation.RELATIVE_TO_SELF,0.5f,Animation.RELATIVE_TO_SELF,0.5f);
                //一个旋转动画对象
                RotateAnimation ra = new RotateAnimation(0, 360, Animation.RELATIVE_TO_PARENT,
                        0.2f, Animation.RELATIVE_TO_SELF, -0.2f);
                          //第二个旋转动画对象
                animationSet.addAnimation(alpha);
                   //添加第一个渐变对象
                animationSet.addAnimation(rotateAnimation);
                   //添加第一个旋转对象
                animationSet.addAnimation(ra);
                    //添加第二个旋转对象
                animationSet.setDuration(2000);
                  //设置间隔时长
                animationSet.setStartOffset(500);
                  //设置动画开始前等待
                image.startAnimation(animationSet);
                 //设置动画

Tween Animation第二种使用方法:

使用第一种方法代码复用性不高,所以有了第二种:在xml中制作动画,在java中使用
具体方法:
1.在res下面新建anim文件夹
2.创建xml文件,首先加入< set >标签
3,在标签内加入四种动画标签(四选一或者set集合)
例:

单个动画

  < alpha
    android:fromAlpha="0.1"
  android:toAlpha="1.0"
  android:duration="3000"
  >

集合动画

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <alpha
        android:fromAlpha="0.1"
        android:toAlpha="1.0"
        android:duration="2000"
        />
    <rotate
        android:fromDegrees="0"
        android:toDegrees="360"
        android:pivotX="50%"
        android:pivotY="50%"
        android:duration="2000"/>
</set>

4,在代码里设置动画

//参数一:context
//参数二:xml文件
  Animation animation=AnimationUtils.loadAnimation(MainActivity.this,R.anim.alpha);
  imageView.startAnimation(animation);

补充在Activity跳转时的动画配置方式

startActivity(intent);
                overridePendingTransition(R.anim.rotate,R.anim.rotate);                 //设置传入动画,传出动画

Tweened Animations通用属性:

1.setDuration(1000) 设置持续时间
2.setFillAfter(boolean) true时,动画结束保留状态
3.setFillBefore(boolean) true时,动画结束回到初始
4.setStartOffSet(long) 动画开始前等待时间
5.setRepeatCount(int) 动画重复次数

在实际项目中,我们经常使用补间动画,原因是补间动画使用起来比较方便,功能也比逐帧动画强大不少,而且还可以很方便地进行动画叠加,实现更加复杂的效果,但是由于其交互性差,逐渐被属性动画所取代。

四.监听器和插值器

AnimationListener(动画监听器)是一个监听器,该监听器在动画执行的各个阶段会得到通知,从而调用相应的方法;AnimationListener主要包括如下三个方法:onAnimationEnd(Animation animation) - 当动画结束时调用onAnimationRepeat(Animation animation) - 当动画重复时调用
onAniamtionStart(Animation animation) - 当动画启动时调用

监听器使用方法:

 alpha.setAnimationListener(new Animation.AnimationListener() {
                    @Override
                    public void onAnimationStart(Animation animation) {
                        //添加逻辑
                    }

                    @Override
                    public void onAnimationEnd(Animation animation) {
                       //添加逻辑
                    }

                    @Override
                    public void onAnimationRepeat(Animation animation) {
                    //添加逻辑
                    }
                });

通过这个监听回调,可以获取到动画的开始,结束和重复事件,并针对相应的事件作出不同的处理。

Interpolator(插值器)定义了动画变化的速率,在Animations框架当中定义了以下四种情况。
1. AccelerateDecelerateInterpolator:在动画开始与结束的地方速率改变比较慢,在中间的时候速率快。
2.AccelerateInterpolator:在动画开始的地方速率改变比较慢,然后开始加速
3. CycleInterpolator:动画循环播放特定的次数,速率改变沿着正弦曲线
4 .DecelerateInterpolator:在动画开始的地方速率改变比较慢,然后开始减速
5. LinearInterpolator:动画以均匀的速率改变

插值器使用方法一:

在xml里使用,这种方式很简单,只需要在set标签里设置就可以

<set xmlns:android="http://schemas.android.com/apk/res/android"
  android:interpolator="@android:anim/accelerate_interpolator"
  android:shareInterpolator="true"  
>

android:shareInterpolator=”true” 代表插值器共享给每一个动画
如果 android:shareInterpolator=”false” 那么需要为每一个动画单独设置插值器
在动画标签里添加插值器 android:interpolator=”@android:anim/accelerate_interpolator”

插值器使用方法二:
首先我们要明白下面第一行代码(这个是在java使用动画的第一行代码)里的参数的意思

 AnimationSet animationSet=new AnimationSet(true);
                //true是共享interpoltor的意思(所有对象共享)

                animationSet.setInterpolator(new AccelerateDecelerateInterpolator());
                      //设置插值器

所有对象共享插值器,指代set集合里如果有很多种基础动画,那么他们将采用同一个速率规则来执行。如果这个参数为false,那么我们可以为动画本身设置插值方案。

   alpha.setInterpolator(new AccelerateDecelerateInterpolator());
                      //设置alpha插值器
                       translate.setInterpolator(new AccelerateDecelerateInterpolator());
                      //设置 translate插值器

未完待续
本文参考:《Android群英传》 ,Mars Android视频第二季
如有错误,请在留言区指出。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值