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. MyBatis的两个配置文件

    MyBatis有两个基本的配置文件,一个用来配置环境信息(mybatis.xml),一个用来写SQL语句(xxMapper.xml). mybatis.xml: <?xml version=&q ...

  2. UVa 10900 (连续概率、递推) So you want to be a 2n-aire?

    题意: 初始奖金为1块钱,有n个问题,连续回答对i个问题后,奖金变为2i元. 回答对每道题的概率在t~1之间均匀分布. 听到问题后有两个选择: 放弃回答,拿走已得到的奖金 回答问题: 如果回答正确,奖 ...

  3. bzoj1196:[Hnoi2010]chorus 合唱队

    这数据范围明显的区间dp啊...然而据说二维会wa...那就写三维把... #include<cstdio> #include<cstring> #include<cct ...

  4. 干货分享:让你分分钟学会 javascript 闭包

    闭包,是 javascript 中重要的一个概念,对于初学者来讲,闭包是一个特别抽象的概念,特别是ECMA规范给的定义,如果没有实战经验,你很难从定义去理解它.因此,本文不会对闭包的概念进行大篇幅描述 ...

  5. UVA 1658 Admiral 海上将军(最小费用流,拆点)

    题意: 一个有v个点的有向图,要从点1到点v需要找两条路径,两路径不可经过同一个点(除了1和v点).求这两条路径的最小费用(保证有解). 分析: 难在建图,其他套模板. 此图给的是超级复杂图,两个点之 ...

  6. 分布式存储Memcache替代Session方案

    PHP自带的Session实际是在服务器中为每个客户建立独立的文件存放各自的信息. 在不做处理的情况下,很容易被客户端伪造.并且由于采用文件形式,所以存在着IO 读写的瓶颈.一般当用户在线达到1000 ...

  7. Xcode8安装不成功, 需要升级系统. The operation couldn't be completed. cpio read error

    https://developer.apple.com/library/prerelease/content/documentation/DeveloperTools/Conceptual/Whats ...

  8. [Bhatia.Matrix Analysis.Solutions to Exercises and Problems]ExI.5.3

    Let $\scrM$ be a $p$-dimensional subspace of $\scrH$ and $\scrN$ its orthogonal complement. Choosing ...

  9. 与非CCR代码互操作

    导读:CCR可以轻松的承载STA组件或者与它互操作:组件应该创建一个只有一个线程的CCR Dispatcher实例,并且在Dispatcher的构造函数中指定线程套间策略.DispatcherQueu ...

  10. JS实现网页下载[转]

    function downloadById() {        var url = "http://localhost:64610/WorkProcess/ResumeDetail/7&q ...