1 逐帧动画
 
逐帧动画 就是一系列的图片按照一定的顺序展示的过程。
 
逐帧动画很简单, 只需要在drawable中或者anim中定义一个Animation-list 其中包含多个item,每个item中包含一个图片 和duration
 
 
eg:
<?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/pic1" android:duration="500"/>
  <item android:drawable="@drawable/pic2" android:duration="500"/>
  <item android:drawable="@drawable/pic3" android:duration="500"/>
  <item android:drawable="@drawable/pic4" android:duration="500"/>
  <item android:drawable="@drawable/pic5" android:duration="500"/>
  <item android:drawable="@drawable/pic6" android:duration="500"/>
  <item android:drawable="@drawable/pic7" android:duration="500"/>
  <item android:drawable="@drawable/pic8" android:duration="500"/>
  <item android:drawable="@drawable/pic9" android:duration="500"/>
</animation-list>
 
其中oneshot 表示是不是只循环一次
 
 
在Activity中只需要获得AnimationDrawable 调用start即可
 
 public void startAnimation(View view)
  {
  AnimationDrawable animationDrawable = (AnimationDrawable) imageView.getBackground();
  animationDrawable.start();
  }
  public void stopAnimation(View view)
  {
  AnimationDrawable animationDrawable = (AnimationDrawable) imageView.getBackground();
  animationDrawable.stop();
  }
 
  其中的imageView已经指定了背景 即animation-list
 
  <ImageView
  android:id="@+id/image_Ani"
  android:layout_width="match_parent"
  android:layout_height="400dp"
  android:background="@drawable/animation_list" />
 
 
  如果设置图片是android:src="@drawable/animation_list", 那么获得AnimationDrawable 使用imageView.getDrawable();
 
 
  当然 也可以不用资源文件来定义图片列表,完全用代码去实现
 
  AnimationDrawable drawable = new AnimationDrawable();
  drawable.addFrame(getDrawable(R.drawable.pic1), 500);
  drawable.addFrame(getDrawable(R.drawable.pic2), 500);
  drawable.addFrame(getDrawable(R.drawable.pic2), 500);
  imageView.setImageDrawable(drawable);
  drawable.start();
 
2. 补间动画
补间动画也叫视图动画,指的是视图在容器内可以做一系列简单的变化,比如说ImageView可以简单的变化(淡入淡出,旋转,平移,缩放)
 
补间动画可以在anim中定义xml文件,也可以用代码实现,但是建议用xml实现,这样就会有可重用性
 
AlphaAnimation <alpha> 放置在res/anim/目录下 渐变透明度动画效果
  RotateAnimation <rotate> 放置在res/anim/目录下 画面转移旋转动画效果
  ScaleAnimation <scale> 放置在res/anim/目录下 渐变尺寸伸缩动画效果
  TranslateAnimation <translate> 放置在res/anim/目录下 画面转换位置移动动画效果
  AnimationSet <set> 放置在res/anim/目录下 一个持有其它动画元素alpha、scale、translate、rotate或者其它set元素的容器
 
所有animation的通用的属性:
android:detachWallpaper setDetachWallpaper(boolean) 是否在壁纸上运行
android:duration setDuration(long) 动画持续时间,毫秒为单位
android:fillAfter setFillAfter(boolean) 控件动画结束时是否保持动画最后的状态
android:fillBefore setFillBefore(boolean) 控件动画结束时是否还原到开始动画前的状态
android:fillEnabled setFillEnabled(boolean) 与android:fillBefore效果相同
android:interpolator setInterpolator(Interpolator) 设定插值器(指定的动画效果,譬如回弹等)
android:repeatCount setRepeatCount(int) 重复次数
android:repeatMode setRepeatMode(int) 重复类型有两个值,reverse表示倒序回放,restart表示从头播放
android:startOffset setStartOffset(long) 调用start函数之后等待开始运行的时间,单位为毫秒
android:zAdjustment setZAdjustment(int) 表示被设置动画的内容运行时在Z轴上的位置(top/bottom/normal),默认为normal
AlphaAnimation动画
  float fromAlpha
  float toAlpha
  透明度,从0 到1:
 
  eg:
  AlphaAnimation animation = new AlphaAnimation(1, 0);
  animation.setDuration(1000);
  animation.setRepeatCount(6);
  imageView.startAnimation(animation);
 
 
  XML 实现:
 
 
  <?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
  <alpha
android:fromAlpha="0"
android:toAlpha="1"
android:duration="3000"/>
</set>
 
 
调用:
 
Animation animation = AnimationUtils.loadAnimation(this,R.anim.scale);
  imageView.startAnimation(animation);
 
 
  当然在set中可以组合其他的动画,比如说rotation, translate,scale。
 
ScaleAnimation: 缩放动画
 
float fromX 表是从哪个比例开始缩放,取值1到0, 1表示正常大小
float toX 表示缩放到哪个范围 取值1到0, 1表示正常大小
float fromY 沿Y轴 同上
float toY
 
float pivotX 相对于x轴的缩放的位置
float pivotY
 
 
eg:
  ScaleAnimation animation = new ScaleAnimation(0.5f, 1, 0.5f,1,500,500);
  animation.setDuration(3000);
  imageView.startAnimation(animation);
RotateAnimation:旋转动画
float fromDegrees
float toDegrees 旋转的度数, 正数表示顺时针旋转,负数表示逆时针旋转
float pivotX 旋转的中心点
float pivotY
 
 
eg:
RotateAnimation animation = new RotateAnimation(0, 360,500, 500);
  animation.setDuration(2000);
  imageView.startAnimation(animation);
TranstlateAnimation: 平移动画
float fromXDelta 平移的起始坐标
float toXDelta
float fromYDelta
float toYDelta
 
 
eg:
 
TranslateAnimation animation = new TranslateAnimation(0, 400, 0, 0);
  animation.setDuration(2000);
  imageView.startAnimation(animation);
 
AnimationSet: 各种动画的组合
 
eg:
 
   
AnimationSet animationSet = new AnimationSet(true);
  AlphaAnimation animation = new AlphaAnimation(1, 0);
  animation.setDuration(2000);
 
  ScaleAnimation animation1 = new ScaleAnimation(0.5f, 1, 0.5f,1);
  animation1.setDuration(3000);
 
  RotateAnimation animation2 = new RotateAnimation(0, 360,400, 400);
  animation2.setDuration(2000);
 
  TranslateAnimation animation3 = new TranslateAnimation(0, 400, 0, 0);
  animation3.setDuration(2000);
 
  animationSet.addAnimation(animation);
  animationSet.addAnimation(animation1);
  animationSet.addAnimation(animation2);
  animationSet.addAnimation(animation3);
  imageView.startAnimation(animationSet);
 
 
Android 中的属性动画
属性动画可以对对象的属性进行操作,也就是说在一个时间间隔内完成对对象的属性从一个值到另个一个值得转变,因此属性动画的功能是很强大的,只有你有这个属性,就能实现动画效果. 当然,因为属性动画其实利用的是反射原理,所以对于这个属性必须要有get,set方法才能操作成功,否则说不好会crash。
 
  属性动画 最重要的是三个类 AnimatorSet, ObjectAnimator和ValueAnimator。
  ValueAnimator类似于一个平滑过渡的产生器。
  eg:
 
  ValueAnimator valueAnimator = ValueAnimator.ofInt(1, 100);
  valueAnimator.setDuration(300);
  valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
  @Override
  public void onAnimationUpdate(ValueAnimator valueAnimator) {
  int value = valueAnimator.getAnimatedValue()
  }
  });
  valueAnimator.start();
 
  start 之后 在300毫秒之内,这个valueAnimator会从1走到100,产生的值赋值给value。所以 如果我们想 自己实现一些动画,比如说一个控件的空度的改变,那么只需要在onAnimationUpdate这个方法中不断的去设置其宽度的值,就可以实现平滑的改变。
 
  ObjectAnimator继承自ValueAnimator. ObjectAnimator 实际上就是封转了类似我们上面说的宽度改变的动画。ObjectAnimator 内部用的是反射,所以我们需要的是传递给ObjectAnimator是空间的属性,以及value值得变化,所以就要求这个属性一定要有get,set方法。
  eg:
 
 
ObjectAnimator animator = ObjectAnimator.ofFloat(imageView,"translationX",0, 100);
  animator.setDuration(6000);
  animator.start();
 
 
  所以补间动画能够实现的功能,我们都能够实现,比如 rotationX,rotationY, scaleX,scaleY等等。
 
 
  当然如果某些属性没有 getset方法,那么怎么办呢?
  谷歌给的解决方案是:
  一个是通过自定义一个包装类,来间接的改变这个属性的值:
  eg:
 
private class MyselfView{
  private View view;
  private int width;
  public MyselfView(View view)
  {
  this.view = view;
  }
 
  public int getWidth() {
  return width;
  }
 
  public void setWidth(int width) {
  this.width = width;
  view.getLayoutParams().width = width;
  view.requestLayout();
  }
  }
 
  定义好这个类之后只要:
 
  ObjectAnimator animator = ObjectAnimator.ofFloat(new MyselfView(imageView),"width",0, 100);
  animator.setDuration(4000);
  animator.start();
 
  另一种方法就是利用ValueAnimator来实现了
 
 
  对于AnimatorSet动画的集合 提供了paly .with,before, after等,来实现动画的先后顺序 当然也有playTogether(......)。
  eg:
 
 
  AnimatorSet animatorSet = new AnimatorSet();
  animatorSet.play(animator1).with(animator2);
 
 
 
  属性动画也可以在XML中定义,以更具有通用性。这个xml动画要放在资源文件res/animator下
 
  eg:
        
<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
  android:duration="4000"
  android:propertyName="rotation"
  android:valueFrom="0"
  android:valueTo="360"/>
 
 
  调用的时候也和补间动画类似:
  Animator animator = AnimatorInflater.loadAnimator(this, R.animator.obhectanimotr1);
  animator.setTarget(imageView);
  animator.start();
 
  博客 http://blog.csdn.net/lingling1420q/article/details/38678493 还不错哦
 
 
 
 
 
 
 

Android中的动画机制的更多相关文章

  1. Android中矢量动画

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

  2. 浅析Android中的消息机制(转)

    原博客地址:http://blog.csdn.net/liuhe688/article/details/6407225 在分析Android消息机制之前,我们先来看一段代码: public class ...

  3. 浅析Android中的消息机制(转)

    在分析Android消息机制之前,我们先来看一段代码: public class MainActivity extends Activity implements View.OnClickListen ...

  4. Android中的Parcel机制 实现Bundle传递对象

    Android中的Parcel机制    实现了Bundle传递对象    使用Bundle传递对象,首先要将其序列化,但是,在Android中要使用这种传递对象的方式需要用到Android Parc ...

  5. 浅析Android中的消息机制-解决:Only the original thread that created a view hierarchy can touch its views.

    在分析Android消息机制之前,我们先来看一段代码: public class MainActivity extends Activity implements View.OnClickListen ...

  6. Android中的动画

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

  7. 浅析Android中的消息机制

    在分析Android消息机制之前,我们先来看一段代码: public class MainActivity extends Activity implements View.OnClickListen ...

  8. 探索Android中的Parcel机制(上)

    一.先从Serialize说起 我们都知道JAVA中的Serialize机制,译成串行化.序列化……,其作用是能将数据对象存入字节流其中,在须要时又一次生成对象.主要应用是利用外部存储设备保存对象状态 ...

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

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

随机推荐

  1. 洛谷10月月赛Round.3

    Rank11:260=60+100+100 P2409 Y的积木 题目背景 Y是个大建筑师,他总能用最简单的积木拼出最有创意的造型. 题目描述 Y手上有n盒积木,每个积木有个重量.现在他想从每盒积木中 ...

  2. winform修改、打开窗体、构造函数传值

    制作登录窗体: 制作一个登陆窗体,实现点击按钮关闭此窗体并打开另一个窗体 直接在按钮点击事件中,实例化一个想要打开的窗体 使用show方法打开,并把登陆窗体的visible属性改为false Form ...

  3. webstrom live templates

    javascript: 在live templates底部要选择javascript # $('#$END$') $ $($end$) $bd $(document.body) $d $(docume ...

  4. 微软TFS Agile/CMMI/Scrum

    二.VS Online 与 Agile/Cmmi/Scrum 介绍了背景,那就言归正传了.VS Online 和文章标题有什么关系呢? 成功注册VS Online之后,我准备创建自己的project时 ...

  5. ROS系统C++代码测试之gtest

    1. 安装gtestsudo apt-get install libgtest-dev 2.修改CMakeLists.txtfind_package(GTest REQUIRED)uncommend ...

  6. C/C++实践笔记 005

    整型常量int a=101u; 无符号整数int b=102l; 长整数int c=103ll; long long整数 存储qq号,手机号 010八进制 0x10十六进制 嵌入式的场合经常用shor ...

  7. C#进阶系列——DDD领域驱动设计初探(六):领域服务

    前言:之前一直在搭建项目架构的代码,有点偏离我们的主题(DDD)了,这篇我们继续来聊聊DDD里面另一个比较重要的知识点:领域服务.关于领域服务的使用,书中也介绍得比较晦涩,在此就根据博主自己的理解谈谈 ...

  8. CSS基本知识5-CSS对齐

    要对齐的关键,在于理解块,行的概念,块的对齐主要靠自动计算定位,比如margin:auto,及浮动,所以最好的办法是尽量使用行来对齐. 实例: .box { border: 1px solid #80 ...

  9. 【JavaScript】【CSS】前端规则摘抄

    源:http://zhibimo.com

  10. 转发 VS 重定向

    转发:JSP容器将使用一个内部的方法来调用目标页面,新的页面继续处理同一个请求,而浏览器将不会知道这个过程.以前的request中存放的变量全部失效,并进入一个新的request作用域. 重定向:第一 ...