android动画类有三种实现形式,分别是Property Animation,Frame Animation,Tween Animation。Tween Animation主要是实现图片的移动来实现的动画,Frame Animation就是帧动画,就是实现图片的转换实现动画,Property Animation属性动画则是前面两种都可以实现,但是是通过改变属性实现的,就像Tween Animation在移动完之后还会回到原来的地方,因为属性没变,但是属性动画则不会,因为属性变了。而android动画的思想和java有所不同,反而是更加简单了,因为android将java动画的实现细节封装了,当然libGDX游戏引擎封装更好。

这当中可能还有涉及到使用XML文件加载动画的情况需掌握。在Tween Animation中使用Set开头的项,当然,在Property Animation中有使用objectAnimator的,然后,Tween Animation中就是使用alpha等作为属性名。其实,XML文件的项名称,属性名都是可以自定义的,关键是如果有被程序用到的XML文件需要让程序知道所设定的项名,属性名。

Tween Animation的实现程序是Animation anim=AnimatonUtils.loadAnimation(Context,R.xx.xxx),View.startAnimation(Animation),这里View一般是已经可以使用的类,如ImageView等。同样的startAnimation()也需要在其他对象中加载。其中R.xx.xxx是动画在XML中的实现产生的,该XML一般用于实现在set项中实现alpha,scale,rotate,translate等功能。这是利用XML进行的,还有另外一种不需使用XML的,但是会涉及到Animation的子类,AlphaAnimation,TranslateAnimation,ScaleAnimation,RotateAnimation。(另外Animation的子类中还有AnimationSet可进行同时加载多个Animation)

Frame Animation的实现程序是AnimationDrawable anim=new AnimationDrawable(),Drawable drawable=getResources().getDrawable(),anim.addFrame(),anim.setOneShot(),这样就能完成一个AnimationDrawable了,但是还要在onWindowFocusChanged(boolean focusChange){}里面实现程序段,super.onWindowFocusChanged(),ImageView iv=new ImageView(),iv.setBackgroundDrawable(anim),AnimationDrawable ad=(AnimationDrawable)iv.getBackground(),ad.start()。总的来说就是,实现AnimationDrawable,将其加载给ImageView,然后再从ImageView那里得到背景动画AnimationDrawable并启动。(将动画设置为图片的背景动画,在从图片中拿出来播放)(这里注意,如果动画需要在app一启动就需要运行,那么必须要将代码加在onWindowFocusChanged()里,否则出错。)

Property Animation的实现程序是ValueAnimator.ofFloat(float...values)参数values是时间值,可以通过设置setTarget()设置对象,setDuration()设置总时间,addUpdataListener(ValueAnimator.animatorUpdateListener(public void onAnimaiottionUpdate(ValueAnimator  va){}))设置监听,start()开始。而实际上一般不使用ValueAnimator,而是使用ObjectAnimator(Animator有子类ValueAnimator与AnimatorSet,而ValueAnimator的子类有ObjectAnimator与TimeAnimator)。

重点注意ValueAnimator的使用需要监听,就是说ValueAnimator在使用时,必须配合AnimatorUpdateListener使用。其实之所以出现这种情况,是因为ValueAnimator只是计算出了值,而没有将值赋予某个对象,所以才需要我们增加监听来联系ValueAnimator与对象。

其实ValueAnimator就是一些变化的数值而已。在我们ofXX()初始化完之后就设定了数值的范围,在setEvaluator(),setInterpolator()之后就设定了变化的方式,在设定了setTarget()之后就设定了作用的对象(其实在这里setTarget()完全没必要设置,因为是不起作用的,ValueAnimator就是一些变化的数值,我们的工作就是要将这些数值设置给对象)。二以上这些都不是关键,因为其实最关键的是要设置addUpdateListener()然后在onAnimationUpdate(Animation)中将Animation的数值赋给对象。总的来说,其实ValueAnimator就是在addUpdateListener()中将数值通过View.setXX()将数值赋予View对象,例如ValueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener(){public void onAnimationUpdate(Animation animation){View.setAlpha(animation.getAnimatedValue())

}

});然后在ValueAnimator.start()就可以了。

ObjectAnimator的使用程序是ObjectAnimator anim=ObjectAnimator.ofFloat(Object,property,int,int),anim.setDuration(),anim.setEvaluator(),anim.setInterpolator(),anim.start(),但是启动anim需要使用其他对象进行,也就是说anim.start()需要其他对象的程序进行。例如按钮的监听程序里面进行。

这里重点注意,对于ObjectAnimator,在使用时实例化基本使用的是类自身的静态方法,ofXX(),而非ObejctAnimator()。但是对于ObjectAnimator.ofFloat(Object,String,float,float)方法,其实最关键的是属性字符串,因为ObjectAnimator作为属性动画,最关键的当然就是属性了,而属性字符串又有哪些呢?这才是最头痛的。事实上,作为属性,这里的字符串都是一名词形式出现的,可以说属性动画几乎可以改变对象的所有属性,这里常见的有alpha,rotation,rotationX,rotationY,translationX,translationY,scaleX,scaleY,x,y等。同时这里的字符串可以都是小写,首字母大写其余的小写,但是不可以都大写。(事实上,由于我们改变的属性值基本都是View的,所以我们可以在View中查找属性名称,一般在getXX(),setXX()中可以看到,这里其实还涉及到了View.invalidate(),View.postInvalidate())

注意,属性动画里面setRepeatCount()默认为零,也就是说,不设置setRepeatCount()时,重复数值为零。而重复次数其实是从零开始的,也就是说,设置为零就运行一次,为1就运行两次,总的来说,就是在设置的基础上加一。

注意上面这些一般实现的是单一的属性变化,而实际上一个对象可能不止一种属性变化。这时我们可以使用ViewPropertyAnimator,这个类相比AnimatorSet更加简单,高效。在使用时仅需使用View.animate()就可以得到ViewPropertyAnimator,然后直接使用方法即可,而这些方法几乎都是返回ViewPropertyAnimator的,所以可以同时使用多个方法,并且这里不需要使用start()方法对象也会自行启动,当然start()方法也可以用于启动。可以使用setStartDelay()设置延迟启动。这里ViewPropertyAnimator虽然相比AnimatorSet更加简单高效,但是却需要更高的版本,所以两者在使用上各有好处,坏处,该选择哪个类视具体情况而定。

AnimatorSet可以加载多个Animator,如果所加载的Animator作用的对象一致的话,将使作用叠加,AnimatorSet的play().with()中with()可以使用befoe(),after(),with()进行替换,同时进行亦可。最后使用其他对象执行AnimatorSet.start()。另外还可以使用AnimatorInflator.loadAnimator(this,R.xx.xxx)加载AnimatorSet,在setTarget(),最后在其他对象中执行AnimatorSet.start()启动即可。注意这里·的R.xx.xxx是由于Animator在XML文档中加载所形成的。

而上面的属性动画实现的是Tween Animation的功能。还有与Frame Animation一样的功能可以使用。

Keyframe.ofFloat(0f,float),Keyframe.ofFloat(.xf,float),Keyframe.ofFloat(1f,float),这里所有的Keyframe的的首个参数必须有实现0f到1f。PropertyValuesHolder.ofFloat(property,Keyframe...frame),ObjectAnimator.ofPropertyValuesHolder(Object,PropertyValuesHolder),最后ObjectAnimator.start()在其他对象程序中启动即可。这里可以实现与Frame Animation一样的功能。

另外还有一个ViewPropertyAnimator,他不属于Animator的子类,可以使用View.animate()得到。他有一些方法,如x(),y()可以使用。并且不需要使用start()进行启动,而是直接在其他对象的相关程序中得到ViewPropertyAnimator并进行操作。

还有,RelativeLayout.setLayoutTransition()(实际上源于ViewGroup.setLayoutTransition()),LayoutTransition.setAnimator(animationType,Animator),而这种设置的目标对象是布局,作用上就是为了给布局增加动画。

除此之外,有一个很重要的一点,就是只要涉及到动画,必定会涉及到View,因为View是控件,图片等的父类,并且他有很多实用的方法封装。另外,可将上面的三种方法简单记为Animation,Drawable,Animator。

(View的常见方法有ViewPropertyAnimator anim=animate(),setAnimation(),getAnimation(),startAnimation(),setBackgroundDrawable(),getResources(),findViewById(),measure(),onMeasure(),draw(),onDraw(),getBackground(),等,同时注意,View的属性中,有GONE,VISIBLE,INVISIBLE三种)

(View拥有可以设置的动画,同样的ViewGroup也是,ViewGroup特有的动画设置setLayoutTransition()可以设置LayoutTransition,LayoutTransition在ViewGroup有子控件变化,如添加,删除时,会触发LayoutTransition的动画。LayoutTransition.setAnimator()等可以设置动画。)

(这里注意,属性动画同样可以使用XML文件加载,AnimatorSet=(AnimatorSet)AnimatorInflator.loadAnimator()加载XML文件,同时ValueAnimator对应<animator>标签,ObjectAnimator对应<objectAnimator>标签,AnimatorSet对应<set>标签。然后使用<set android:ordering="sequentially"><objectAnimator android:xx="xxx"></set>生成XML文件。)

总结:Tween animation,Frame animation,Property animation在使用上其实都没有什么限制。Tween animation,Frame animation可以使用XML文件加载,也可以动态加载,关键在于掌握AnimationDrawable,Animation这两个类,但是他们都有一个共同点,那就是需要传递给需要的对象。而Property animation则是将有需要的对象传给自己,而Property animation的关键就在于Animator。这里有用到工具类,AnimationUtils,AnimationSet,AnimatorSet。另外注意,Tween animation,Frame animation所能实现的动画功能,与Property animation的是一样的。这里有一个概念需要注意,android封装的动画类的整个过程几乎都是可控的,这点可查看源代码。

android动画类相关推荐

  1. android 尺寸变化动画,Android ScaleAnimation类:尺寸变化动画类

    ScaleAnimation类是Android系统中的尺寸变化动画类,用于控制View对象的尺寸变化,该类继承于Animation类. ScaleAnimation类中的很多方法都与Animation ...

  2. android做开场动画,Android_Android开场动画类完整实现代码,本文所述实例为在android中开起 - phpStudy...

    Android开场动画类完整实现代码 本文所述实例为在android中开起开场动画类,已封装好,进行android开发的朋友可使用.在这个类中,你可以:设置开场动画的图片资源.返回下一个要启动的Act ...

  3. android动画封装,Android开场动画类完整实现代码

    本文所述实例为在android中开起开场动画类,已封装好,进行android开发的朋友可使用.在这个类中,你可以:设置开场动画的图片资源.返回下一个要启动的Activity.显示开场动画.执行耗时的操 ...

  4. Android ObjectAnimator类:手把手带你自定义属性动画

    前言 属性动画的使用 是 Android 开发中常用的知识 今天,我将讲解属性动画使用中最核心的一个方法类:ObjectAnimator,希望你们会喜欢. Carson带你学Android动画系列文章 ...

  5. Android 之 TranslateAnimation类:位移动画类(转载)

    原文链接:点击打开链接 ======================================================================================== ...

  6. android 尺寸变化动画,android ScaleAnimation类:尺寸变化动画类

    Android JDK为我们提供了4种动画效果,分别是: AlphaAnimation,RotateAnimation, ScaleAnimation, TranslateAnimation.今天我想 ...

  7. Android Animator(动画)类 详解

    Android Animator动画类 详解 动画分为3种 ValueAnimator类 ObjectAnimator类 AnimatorSet类 Animator的addListener()方法(监 ...

  8. Android自定义控件:动画类---逐帧动画AnimationDrawable

    1:概述 Android动画包括View Animation(视图动画)和Property Animator(属性动画),而View Animation包括Tween Animation(补间动画)和 ...

  9. android动画的实现原理,Android动画的实现原理 .

    1.动画运行模式 独行模式 中断模式 2.Animation类 每个动画都重载了父类的applyTransformation方法这个方法的主要作用是把一些属性组装成一个Transformation类, ...

最新文章

  1. 定义__asm块作为C宏
  2. xxljob 配置文件_SpringBoot整合Xxl-Job的完整步骤记录
  3. 为人处事的一些小句子。
  4. win10系统mongodDB安装过程
  5. 轻量NuGet服务—BaGet
  6. thymealf如何实现传单个变量给html_50个关于IPython的奇技淫巧
  7. iap php,PHP语言之华为应用内支付IAP验签
  8. 外部表改为内部表_2、从外部导入数据创建表(ACCESS图解操作系列)
  9. 哨兵卫星及数据下载平台介绍
  10. 2023年天津天狮学院专升本专业课如何线上考试考前准备的要求
  11. 狐狸文│区块链不是用来讲故事的
  12. linux 信号sigabrt,程序运行产生SIGABRT信号的原因---转
  13. python空气质量指数计算_Python入门案例(八):空气质量指数(AQI)计算
  14. 看这篇就够了——ubuntu扩展屏幕及装显卡驱动后黑屏问题
  15. Unity做360度全景预览,效果类似pano2vr导出的效果或720云做的效果
  16. 关于HTML5的新特性
  17. 贡献一下多年珍藏的特效例子
  18. 中国数学家秦九韶算法示例
  19. HDU 3957 Street Fighter(DLX搜索)
  20. 用mysqlbinlog命令查看二进制日志文件提示: -bash:mysqlbinlog:command not found

热门文章

  1. An abnormal horizontal ListView-like pile layout.
  2. 【目标检测·yolo系列】YOLOV1目标检测论文(参考 同济子豪兄的解读)笔记
  3. python爬虫基础爬取猫眼电影
  4. 自动升降压5-40V多串超级电容充电芯片和解决方案
  5. Linux内核源代码获取教程
  6. 通信系统与网络思维导图
  7. 客服ai虚拟数字人技术方案及制作流程
  8. html display
  9. 如何判断一个String字符串不为空或这不为空字符串
  10. 微信小程序使用setData方法修改data中对象或数组的属性值