android中动画可分为三种:帧动画,补间动画,和属性动画。其中属性动画是google推荐的,它可以实现前面两种动画的效果,运用起来更加灵活。

  帧动画:顾名思义,就是一帧一帧的图片,快速播放形成的动画。 具体实现步骤如下: 

   第一:新建一个drawable资源 以animation-list 为根节点创建资源文件。

      

    第二:给ImageView或者其他View设置关联drawable。可以作为background或者src。

    第三:在java代码中,通过View.getBackground();或者ImageView.getDrawable()。得到已经关联View的Drawable对象,转成AnimationDrawable对象。

       然后调用AnimationDrawable.start()方法开始动画。也可以通过java代码动态加载Drawable资源,关联给View,再开始动画。

       (一定要先把Drawable与View关联之后,才能开始AnimationDrawable动画。)

  补间动画:类型有(透明度、缩放、旋转、平移、AnimationSet)AnimationSet。是一组Tween动画的集合。

  可以通过addAnimation添加四种动画。使其四种动画可以同步开始与结束。其中repeatCount在AnimationSet中不起作用,只能每个动画中单独设置,分别可设置不同的重复次数。在xml中,fillAfter属性只有在set节点中设置才有效果。在xml中,插值器android:interpolator也要定义在set节点才有效。

补间动画的xml写法:

    1.在res/anim/目录下创建动画资源文件,在其中定义需要的动画

    2.在代码中加载动画资源

      Animation animation = AnimationUtils.loadAnimation(this, R.anim.translation_anim);

    3.开启动画

       imageView.startAnimation(animation);

  补间动画的java代码写法:

      TranslateAnimation translateAnimation=new TranslateAnimation(Animation.RELATIVE_TO_PARENT,0,
      Animation.RELATIVE_TO_PARENT,0,Animation.RELATIVE_TO_PARENT,-1,Animation.RELATIVE_TO_PARENT,0);
      translateAnimation.setDuration(1000);
      translateAnimation.setInterpolator(new BounceInterpolator());
      mivLogoIcon.startAnimation(translateAnimation);

  补间动画动画集的java代码写法:

    

      补间动画还可以设置监听事件。animation.setAnimationListener;传入AnimationListener接口的类的对象,该类需要实现接口的三个方法:

      

   Android:interpolotor属性的常用属性值

     

属性

描述

@android:anim/linear_interpolator

动画一直在做匀速改变

@android:anim/accelerate_interpolator

动画一在开始的地方心变较慢,然后开始加速

@android:anim/decelerate_interpolator

在动画开始的地方改变速度较快,然后开始减速

@android:anim/accelerate_decelerate_interpolator

动画在开始和结束的地方改变速度较慢,在中间的时候加速

@android:anim/cycle_interpolator

动画循环播放特定的次数,变化速度按正弦曲线改变

@android:anim/bounce_interpolator

动画结束的地方采用弹球效果

@android:anim/anticipate_overshoot_interpolator

在动画开始的地方先向后退一小步,再开始动画,到结束的地方再超出一小步,最后回到动画结束的地方

@android:anim/overshoot_interpolator

动画快速到达终点,并超出一小步最后回到动画结束的地方

@android:anim/anticipate_interpolator

在动画开始的地方先向后退一小步,再快速到达动画结束的地方

    补间动画在Activity跳转时的运用:

定义动画资源:

1.enter_anim.xml

<?xml version="1.0" encoding="utf-8"?>

<set xmlns:android="http://schemas.android.com/apk/res/android">

<alpha  android:duration="3000"

android:fromAlpha="0.5"

android:toAlpha="1"/>

<scale

android:fromXScale="0.2"

android:toXScale="1"

android:fromYScale="0.2"

android:toYScale="1"

android:duration="3000"

android:pivotX="50%p"

android:pivotY="50%p"></scale>

</set>

2.exit_anim.xml

<?xml version="1.0" encoding="utf-8"?>

<set xmlns:android="http://schemas.android.com/apk/res/android">

<alpha  android:duration="3000"

android:fromAlpha="1"

android:toAlpha="0.5"/>

<scale

android:fromXScale="1"

android:toXScale="0.2"

android:fromYScale="1"

android:toYScale="0.2"

android:duration="3000"

android:pivotX="50%p"

android:pivotY="50%p"></scale>

</set>

3. 在代码中startActivity(intent)后调用overridePendingTransition方法

Intent intent = new Intent(MainActivity.this,SecondActivity.class);

startActivity(intent);

overridePendingTransition(R.anim.enter2_anim,R.anim.exit_anim);

  属性动画:

    资源文件常用属性:

  • "rotation" 自身平面旋转
  • "rotationX" 3D翻转 X轴不变
  • "rotationY" 3D翻转 Y轴不变
  • "alpha" 透明度
  • "scaleX" 缩放X 轴
  • "scaleY" 缩放Y 轴
  • "translationY" Y轴上移动
  • "translationX" X轴上横向移动

java代码实现:

ObjectAnimator oa = ObjectAnimator.ofFloat(target, propertyName, values);

例如:

ObjectAnimator oa = ObjectAnimator.ofFloat(id_ball, "rotation", 0, 180);

oa.setDuration(5000)//动画执行的时间

oa.setRepeatCount(1);//动画的重复次数

oa.setRepeatMode(ObjectAnimator.REVERSE);//动画的重复方式

oa.start();//开始动画

属性动画集合实现:

  方式一,使用PropertyValuesHolder:

PropertyValuesHolder pvh1 = PropertyValuesHolder.ofFloat("scaleX", 1.0f, 2.0f);

PropertyValuesHolder pvh2 = PropertyValuesHolder.ofFloat("scaleY", 1.0f, 2.0f);

PropertyValuesHolder pvh3 = PropertyValuesHolder.ofFloat("alpha", 1.0f, 0.2f);

PropertyValuesHolder pvh4 = PropertyValuesHolder.ofFloat("rotationX", 0, 360);

PropertyValuesHolder pvh5 = PropertyValuesHolder.ofFloat("translationY", 1f, 100f);

ObjectAnimator.ofPropertyValuesHolder(id_ball, pvh1, pvh2, pvh3, pvh4, pvh5).setDuration(4000).start();

      方式二,使用监听器:

animator.addListener(new Animator.AnimatorListener() {

@Override

public void onAnimationStart(Animator animation) {

//TODO 动画开始前的操作

/**

* 比如这里可以初始化一些UI

*/

}

@Override

public void onAnimationEnd(Animator animation) {

//TODO 动画结束的操作

/**

* 比如这里可以等动画结束进行一些账号登录或者网络数据请求等。

*/

}

@Override

public void onAnimationCancel(Animator animation) {

//TODO 动画取消的操作

}

@Override

public void onAnimationRepeat(Animator animation) {

//TODO 动画重复的操作

}

});

如果不关心动画的全部状态,可以使用:

animator.addListener(new AnimatorListenerAdapter() {

@Override

public void onAnimationEnd(Animator animation) {

//TODO 动画结束的操作

/**

* 比如这里可以等动画结束进行一些账号登录或者网络数据请求等。

*/

}

});

监听当前动画的执行情况:

animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {

@Override

public void onAnimationUpdate(ValueAnimator animation) {

float value = (float) animation.getAnimatedValue();

//可以根据自己的需要来获取动画更新值。

Log.e("TAG", "the animation value is " + value);

}

});

举例:
ObjectAnimator anim = ObjectAnimator.ofFloat(id_ball, "null", 1.0F, 0.1F, 1).setDuration(4000);

anim.addUpdateListener(new AnimatorUpdateListener() {

@Override

public void onAnimationUpdate(ValueAnimator animation) {

//得到变化后的value大小

float cVal = (Float) animation.getAnimatedValue();

id_ball.setAlpha(cVal);//改变控件的透明度

id_ball.setScaleX(cVal);//改变控件的缩放

id_ball.setScaleY(cVal);//***

id_ball.setTranslationX(id_ball.getWidth() * (1 - cVal));

}});

anim.start();

方式3,使用动画集AnimatorSet:

AnimatorSet这个类提供了一个play()方法,如果我们向这个方法中传入一个Animator对象(ValueAnimator或ObjectAnimator)将会返回一个AnimatorSet.Builder的实例,AnimatorSet.Builder中包括以下四个方法:

after(Animator anim) 将现有动画插入到传入的动画之后执行

after(long delay) 将现有动画延迟指定毫秒后执行

before(Animator anim) 将现有动画插入到传入的动画之前执行

with(Animator anim) 将现有动画和传入的动画同时执行

例:

ObjectAnimator alphaObjectAnimator2 = ObjectAnimator.ofFloat(textView,"alpha",1,0.5f,0.2f,0.1f,0.5f,1);

ObjectAnimator scaleXObjectAnimator = ObjectAnimator.ofFloat(textView,"scaleX",1,2,1,2,1);

ObjectAnimator scaleYObjectAnimator = ObjectAnimator.ofFloat(textView,"scaleY",1,2,1,2,1);

AnimatorSet animatorSet = new AnimatorSet();

animatorSet.play(alphaObjectAnimator2).with(scaleXObjectAnimator).after(scaleYObjectAnimator);

animatorSet.setDuration(3000);

animatorSet.start();

      属性动画的xml实现:

第一步:在res/animator目录下创建文件anim_file.xml

<set xmlns:android="http://schemas.android.com/apk/res/android"

android:duration="2000"

android:ordering="sequentially">

<!--动画执行顺序 sequentially:顺序执行;together:同时执行。 -->

<objectAnimator

android:propertyName="translationX"

android:valueFrom="0"

android:valueTo="200"

android:valueType="floatType" />

<set android:ordering="together">

<objectAnimator

android:propertyName="scaleX"

android:valueFrom="1"

android:valueTo="2"

android:valueType="floatType" />

<objectAnimator

android:propertyName="rotationX"

android:valueFrom="0"

android:valueTo="90"

android:valueType="floatType" /><!--动画值的类型-->

</set>

</set>

第二步,在代码中加载动画文件

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

animator.setTarget(view);

animator.start();

    最后注意补间动画与属性动画的区别:    

      补间动画就算控件移动到任何位置,控件本身位置还是不变(类似dota中冰女放大,被推推推走的效果)。

      属性动画是直接改变了控件的位置。

      补间动画是通过控件启动动画,如: imageView.startAnimation(translateAnimation);

      属性动画是动画对象启动,如:animator.start();

    

      

    

Android中的动画学习总结的更多相关文章

  1. Android中矢量动画

    Android中矢量动画 Android中用<path> 标签来创建SVG,就好比控制着一支画笔,从一点到一点,动一条线. <path> 标签 支持一下属性 M = (Mx, ...

  2. Android中的动画

    Android中的动画分为: 1.逐帧动画(Frame Animation):  把动画过程的每张静态图片都收集起来,然后由Android来控制依次显示这些静态图片,然后利用人眼”视觉暂留“的原理,给 ...

  3. Android中的动画具体解释系列【4】——Activity之间切换动画

    前面介绍了Android中的逐帧动画和补间动画,并实现了简单的自己定义动画.这一篇我们来看看怎样将Android中的动画运用到实际开发中的一个场景--Activity之间跳转动画. 一.定义动画资源 ...

  4. Android中的动画详解系列【4】——Activity之间切换动画

    前面介绍了Android中的逐帧动画和补间动画,并实现了简单的自定义动画,这一篇我们来看看如何将Android中的动画运用到实际开发中的一个场景--Activity之间跳转动画. 一.定义动画资源 如 ...

  5. Android(java)学习笔记200:Android中View动画之 XML实现 和 代码实现

    1.Animation 动画类型 Android的animation由四种类型组成: XML中: alph 渐变透明度动画效果 scale 渐变尺寸伸缩动画效果 translate 画面转换位置移动动 ...

  6. Android(java)学习笔记143:Android中View动画之 XML实现 和 代码实现

    1.Animation 动画类型 Android的animation由四种类型组成: XML中: alph 渐变透明度动画效果 scale 渐变尺寸伸缩动画效果 translate 画面转换位置移动动 ...

  7. 初识android中的动画

    动画效果可以大大提高界面的交互效果,因此,动画在移动开发中的应用场景较为普遍.掌握基本的动画效果在成熟的软件开发中不可或缺.除此之外,用户对于动画的接受程度远高于文字和图片,利用动画效果可以加深用户对 ...

  8. Android中的动画机制

          1 逐帧动画   逐帧动画 就是一系列的图片按照一定的顺序展示的过程.   逐帧动画很简单, 只需要在drawable中或者anim中定义一个Animation-list 其中包含多个it ...

  9. Android中的动画效果

    动画的种类 透明动画alphaAnimation 在代码中配置动画: findViewById(R.id.btnAnimMe).setOnClickListener(new View.OnClickL ...

随机推荐

  1. Javascript学习笔记(一)

    1.form表单中button按钮的事件会导致表单的提交,可以改成<input type='button'  /> 实现 2. 手动触发select的onchange事件 var sele ...

  2. 排查Java线上服务故障的方法和实例分析

    前言 作为在线系统负责人或者是一个技术专家,你可能刚刚接手一个项目就需要处理紧急故障,或者被要求帮忙处理一些紧急的故障,这个时候的情景是: (1)你可能对这个业务仅仅是听说过,而不怎么真正了解: (2 ...

  3. Nandflash 驱动移植

    前段时间,研究了一下4G的Nandflash驱动.手头上只有飞凌6410BSP自带的Nandflash驱动,该驱动不支持K9GAG08U0D(2G)和K9LBG08U0D(4G)的Nandflash. ...

  4. sdut Message Flood(c++ map)

    用字典树没过,学习了一下map; 参考博客:http://blog.csdn.net/zhengnanlee/article/details/8962432 AC代码 #include<iost ...

  5. mysql隔离机制

    转  MySQL隔离级别 mysql-Innodb事务隔离级别-repeatable read详解(转)

  6. UVa 11082 (网络流建模) Matrix Decompressing

    网络流不难写,难的建一个能解决问题的模型.. 即使我知道这是网络流专题的题目,也绝不会能想出这种解法,=_=|| 题意: 给出一个矩阵的 前i行和 以及 前i列和,然后找到一个满足要求的矩阵,而且每个 ...

  7. Linux 根文件系统制作

    1.创建根文件目录 mkdir rootfs(名字是随便取的) 2.创建子目录 cd rootfs mkdir bin dev etc lib proc sbin sys usr mnt tmp va ...

  8. 什么是Code Review(转)

    Code Review是一种通过复查代码提高代码质量的过程,在XP方法中占有极为重要的地位,也已经成为软件工程中一个不可缺少的环节.本文通过对Code Review的一些概念和经验的探讨,就如何进行C ...

  9. HTML5 离线功能介绍

    HTML5 是目前正在讨论的新一代 HTML 标准,它代表了现在 Web 领域的最新发展方向.在 HTML5 标准中,加入了新的多样的内容描述标签,直接支持表单验证.视频音频标签.网页元素的拖拽.离线 ...

  10. http://www.cnblogs.com/youfan/articles/3216816.html

    我对 CodeFirst 的理解,与之对应的有 ModelFirst与 DatabaseFirst ,三者各有千秋,依项目实际情况自行选择. 1.开发过程中先行设计数据库并依此在项目中生成 *.dbm ...