【转载】Android属性动画和视图动画的区别

摘要:
动画可以实现各种特效,动画在Android平台的开发过程中也非常重要。您可能认为帧动画不是很常见。事实上,类似的原则可以借鉴。许多类似于Android手机开机的动画效果类似于帧动画。加载一系列图片以实现动画效果。属性动画的最基本特征是通过改变视图或对象的属性来实现动画。

提起动画首先想到的是动画片,童年最爱的黑猫警长,葫芦娃,邋遢大王,大脸猫和蓝皮鼠,四驱兄弟,七龙珠等等,当时觉着好神奇,他们是怎么动的呢。动画其实就是一帧帧的画面顺序播放,只要画面切换的够快,会我们眼中形成视觉残留的效果,人眼不会感觉到突兀也就会认为画面是连续运动的,至于24帧什么的这里就不说了,现在的手机普遍支持60帧每秒,微鲸的vr设备好像87帧每秒,只要游戏本身不卡顿,玩起来还是挺流畅的。动画可以实现各种各样的特效,android平台开发过程中动画也相当重要。
Android平台提供了强大的动画框架,使我们在完成复杂的特效时不用自己改变空间的位置或者设置属性通过简单的动画代码就可以实现,android3.0之前,主要包括两种动画方式:补间动画(Tween Animation)和帧动画(Frame Animation 或者 Drawable Animation),这两种动画统称为view 动画,针对视图动画存在的不足,3.0之后google增加了属性动画(Property Animation)。之后动画就被分成了View Animation 和Property Animation。

关于动画的一道面试题:
在应用中常看到不断变化的数字怎么实现?

视图动画:

1 补间动画(Tween Animation):
  补间动画是视图动画的一种,Tween中文意思是在两者之间,中文翻译成补间还是挺贴合意思的,view从一个位置的特定状态变化到另外一个位置,中间过程我们开发者不需要自己完成,补间动画会根据我们属性的设置自己进行每一帧的补充,最后展现一个变化的过程,就叫做补间动画(自己理解)。

补间动画可以(仅可以)完成view的位置、大小、旋转、透明度等一系列简单的变换,可通过xml文件或者代码实现,通常补件动画都是利用xml文件实现,属性设置简单明了,又可以重复使用。

 基于View的渐变动画,她只改变了View的绘制效果,而实际属性值未变。比如动画移动一个控件的位置,但控件实际位置仍未改变,如果我们此时想选中控件,它的位置仍在动画之前的位置。可以在res/anim/文件夹中定义XML文件实现动画,也可以利用AnimationSet类和Animation的子类完成动画。
  • alpha 渐变透明度动画效果
  • scale 渐变尺寸伸缩动画效果
  • translate 画面转换位置移动动画效果
  • rotate 画面转移旋转动画效果
    举例:放在res/anim/文件夹下:
  <?xml version="1.0" encoding="utf-8"?>  
    <scale xmlns:android="http://schemas.android.com/apk/res/android"  
        android:fromXScale="0.0"  
        android:toXScale="1.1"  
        android:fromYScale="0.0"  
        android:toYScale="1.1"  
        android:pivotX=30"  
        android:pivotY="20"  
        android:duration="500" />  

补间动画使用很方便,但也有很大的局限性,首先动画虽然执行了但是只是我们看到的,控件真实的位置透明度等都没有变化,如果我们想对一个已经移动的控件执行点击事件,如果控件移动的位置比较大点击界面上看到的控件是无法触发事件的。

补间动画只能针对设计好的特定的几种属性执行动画,对于自定义的属性则不太好完成(或者说根本不支持)。

2 帧动画(Frame Animation 或者 Drawable Animation):

帧动画也是view动画的一种,帧动画是通过读取xml文件中设置的一系列Drawable,以类似幻听片的方式展示这些drawable,就形成了动画效果,当然也可以利用代码实现帧动画。可能大家觉着帧动画不太常用,其实类似的原理可以借鉴,类似android手机开机的很多动画效果就是类似帧动画,加载一系列图片,实现开机的动画效果。

 在代码中定义动画帧,使用AnimationDrawable类;XML文件能更简单的组成动画帧,在res/drawable文件夹,使用<animation-list>采用<item>来定义不同的帧。

但是依旧推荐使用xml,具体如下:
<animation-list> 必须是根节点,包含一个或者多个<item>元素,属性有:

· android:oneshot true代表只执行一次,false循环执行。
· <item> 类似一帧的动画资源。
<item> animation-list的子项,包含属性如下:
· android:drawable 一个frame的Drawable资源。
· android:duration 一个frame显示多长时间。
文件放在res/drawable/目录下

<?xml version="1.0" encoding="utf-8"?><animation-list xmlns:android="http://schemas.android.com/apk/res/android"
    android:oneshot=["true" | "false"] >
    <item
        android:drawable="drawable_resource"
        android:duration="integer" /></animation-list>

帧动画是最简单的动画,用的比较少。

3 属性动画(Property Animation):
 属性动画在视图动画之后推出,API 11 以上才能够使用,是为了弥补视图动画存在的问题,从名字可以看出属性动画和视图动画的不同,视图动画主要针对视图起作用,属性动画则是通过改变Object的属性进行动画实现。通过改变view或者object的属性实现动画是属性动画的最根本的特点。

对数值的操作:

ValueAnimator animator = ValueAnimator.ofInt(0,700);  

 animator.setDuration(1000);  

 animator.start(); 

对view的操作:

ObjectAnimator animator = ObjectAnimator.ofFloat(view,"alpha",1,0,1);  

animator.setDuration(1000);  

animator.start();  
  • 第一个参数用于指定这个动画要操作的是哪个控件
  • 第二个参数用于指定这个动画要操作这个控件的哪个属性
  • 第三个参数是可变长参数,这个就跟ValueAnimator中的可变长参数的意义一样了,就是指这个属性值是从哪变到哪

添加监听:

ValueAnimator animator = ValueAnimator.ofInt(0,400);  

animator.setDuration(1000);  

animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {  

    @Override  

   public void onAnimationUpdate(ValueAnimator animation) {  

       int valcur = (int)animation.getAnimatedValue();  

    }  

});  

animator.start();  
4 视图动画和属性动画的区别:

由于出现的时间不同,视图动画和属性动画有几个显而易见的不同:

视图动画早于属性动画,视图动画在API 1里面就已经存在,属性动画直到API3.0才出现,视图动画所在的包名为android.view.animation,属性动画为android.animation,可见视图动画只针对view起作用;试图动画中用到的类一般以Animation结尾,而属性动画则以Animator结尾。

为什么引入视图动画:

帧动画可以通过顺序播放资源来实现动画的,补间动画可以实现控件的渐入渐出、移动、旋转和缩放效果。但类似利用动画改变View的背景或者改变一个数值或者改变一个对象的属性视图动画就无法完成此类工作了,所以视图动画存在局限性。属性动画还支持监听动画过程,在动画过程中自己操作控件进行改变。

视图动画的文件在android.view.animation下,通过学习也可以知道,视图动画只能作用于视图,实现类似缩放、旋转功能,动画效果比较固定;而属性动画可以通过改变View的属性完成动画,利用setxxx()和getxxx()函数可以对Object的任意属性改变,从而可以实现视图动画实现不了的功能。可以通过在object中添加属性的set函数,在ondraw方法中操作属性就可以完成动画

属性动画通过改变view属性实现动画,而视图动画虽然利用动画改变了view的位置和大小,但view真正的属性没有改变,这就会导致许多问题,视图动画过后我们再去操作view则得不到响应,这就是为什么自定义控件利用动画改变控件位置后还有调用layout()设置view位置的原因,这样才能真正的改变view的位置,而属性动画就可以一步到位的完成。

总结如下:

(1)属性动画比视图动画更强大,不但可以实现缩放、平移等操作,还可以自己定义动画效果,监听动画的过程,在动画过程中或完成后做响应的动作。
(2)属性动画不但可以作用于View,还能作用于Object。
(3)属性动画利用属性的改变实现动画,而视图动画仅仅改变了view的大小位置,但view真正的属性没有改变。

完!后续会对属性动画,视图动画,插值器,自定义属性动画等进行系列介绍。



作者:sliencexiu
链接:https://www.jianshu.com/p/25efc9f3a8f0
来源:简书

免责声明:文章转载自《【转载】Android属性动画和视图动画的区别》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇FTP服务2种工作方式详解,PORT方式和PASV方式,(即主动模式和被动模式)linux内核驱动中对文件的读写 【转】下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

微信小程序-自定义下拉刷新

要实现微信小程序上拉刷新与下拉加载更多 微信给出的接口不怎么友好,最终想实现效果类似QQ手机版 ,一共3种下拉刷新状态变化,文字+图片+背景颜色 最终实现后的效果(这里提示有个不同点就是,自定义了导航条,并且下拉的时候,自定义导航条必须固定) 小程序实现下拉加载2种方式: 1. 简单粗暴,直接开启enablePullDownRefresh,开启全局下...

vue项目加载前空白的动画过渡效果

参考:https://github.com/mgbq/nx-admin 复制以下html内容到项目的index.html中即可: <style> html, body, #app { height: 100%; margin: 0px; padding: 0px; }...

android 调试 native 程序的方法

一、背景 首先说需求,这个需求非常常见,就是android上需要的一个功能,linux已经有开源代码而且非常稳定,希望能直接porting过去使用,这个程序是pure c 的代码,也就是说,跟android framework, java 没关系,也跟jni没有关系,我们希望的就是能编译成一个可执行工具,push到android后能直接跑起来使用。 既然是...

第86章、系统服务之TELEPHONY_SERVICE(从零开始学Android)

TelephonyManager类主要提供了一系列用于访问与手机通讯相关的状态和信息的get方法。其中包括手机SIM的状态和信息、电信网络的状态及手机用户的信息。在应用程序中可以使用这些get方法获取相关数据。     TelephonyManager类的对象可以通过Context.getSystemService(Context.TELEPHONY_S...

【WPF学习】第五十五章 基于路径的动画

  基于路径的动画使用PathGeometry对象设置属性。尽管原则上基于路径的动画也能用于修改任何适当数据类型的属性,但当动态改变与位置相关的属性时最有用。实际上,基于路径的动画类主要用于帮助沿着一条路径移动可视化对象。   正如在“【WPF学习】第四十三章 路径和几何图形”学过的,PathGeometry对象描述可包含直线、弧线以及曲线的图形。下图显示...

[微信小程序]实现一个自定义遮罩层

正文: 先上效果图: 点击按钮Show显示遮罩层,再次点击屏幕任何地方隐藏遮罩层; <button bindtap="showview">Show</button> <view class="bg" bindtap='hideview' style='display:{{display}}'></view>...