Android--Animation标签介绍
来源:互联网 发布:非线性最优化试题 编辑:程序博客网 时间:2024/04/29 04:53
Drawable讲过三个动画,animation-list定义帧动画,animated-rotate定义旋转动画,animated-selector定义选择状态动画,这三个属于drawable动画(也称Frame-By-Frame Animation)。除了drawable动画,Android框架还提供了另外两种动画体系:视图动画(View Animation 也称Tweened Animations)和属性动画(Property Animation)。视图动画比较简单,只能应用于各种View,可以做一些位置、大小、旋转和透明度的简单转变。属性动画则是在android 3.0引入的动画体系,提供了更多特性和灵活性,也可以应用于任何对象,而不只是View。
1、View Animation
视图动画可以通过xml文件定义,xml文件放于res/anim/目录下,根元素可以为:<alpha>, <scale>, <translate>, <rotate>, 或者<set>。
其中,set 标签定义的是动画集,它可以包含多个其他标签,也可以嵌套标签。默认情况下,所有动画会同时播放;如果想按顺序播放,则需要指定startOffset属性;另外,还可以通过设置interpolator改变动画变化的速率,比如匀速、加速。对 Interpolator 有兴趣的朋友可以看看我的博客Android动画–Interpolator的介绍。
1、alpha
alpha 可以实现透明度渐变的动画效果,也就是淡入淡出的效果,可通过设置下面三个属性来设置淡入或淡出效果:
- android:duration 动画从开始到结束持续的时长,单位为毫秒
- android:fromAlpha 动画开始时的透明度,0.0为全透明,1.0为不透明,默认为1.0
- android:toAlpha 动画结束时的透明度,0.0为全透明,1.0为不透明,默认为1.0
当设置开始时透明度为0.0,结束时为1.0,就能实现淡入效果;相反,当设置开始时透明度为1.0,结束时为0.0,那就能实现淡出效果。示例代码如下:
<!-- res/anim/fade_in.xml --><?xml version="1.0" encoding="utf-8"?><alpha xmlns:android="http://schemas.android.com/apk/res/android" android:duration="1000" android:fromAlpha="0.0" android:toAlpha="1.0" />
将这动画效果添加到View上也只需要一行代码:
view.startAnimation(AnimationUtils.loadAnimation(this, R.anim.fade_in));
如果需要重用这个动画,也可以将其抽离出来。标签对应的动画类为AlphaAnimation,父类为Animation,以上代码将AlphaAnimation抽离后的代码可以如下:
AlphaAnimation fadeInAnimation = (AlphaAnimation) AnimationUtils.loadAnimation(this, R.anim.fade_in);view.startAnimation(fadeInAnimation);
2、scale
可以实现缩放的动画效果,主要的属性如下:
- android:duration 动画从开始到结束持续的时长,单位为毫秒
- android:fromXScale 动画开始时X坐标上的缩放尺寸
- android:toXScale 动画结束时X坐标上的缩放尺寸
- android:fromYScale 动画开始时Y坐标上的缩放尺寸
- android:toYScale 动画结束时Y坐标上的缩放尺寸 这四个属性,0.0表示缩放到没有,1.0表示正常无缩放,小于1.0表示收缩,大于1.0表示放大
- android:pivotX 缩放时的固定不变的X坐标,一般用百分比表示,0%表示左边缘,100%表示右边缘
- android:pivotY 缩放时的固定不变的Y坐标,一般用百分比表示,0%表示顶部边缘,100%表示底部边缘
<?xml version="1.0" encoding="utf-8"?><scale xmlns:android="http://schemas.android.com/apk/res/android" android:duration="1000" android:fromXScale="1.0" android:fromYScale="1.0" android:pivotX="0%" android:pivotY="100%" android:toXScale="1.5" android:toYScale="1.5" />
scale标签对应的类为ScaleAnimation,父类也是Animation,在Java中用法与alpha 是一样的。
3、translate
translate 可以实现位置移动的动画效果,可以是垂直方向的移动,也可以是水平方向的移动。坐标的值可以有三种格式:从-100到100,以”%”结束,表示相对于View本身的百分比位置;如果以”%p”结束,表示相对于View的父View的百分比位置;如果没有任何后缀,表示相对于View本身具体的像素值。主要的属性如下:
- android:duration 动画从开始到结束持续的时长,单位为毫秒
- android:fromXDelta 起始位置的X坐标的偏移量
- android:toXDelta 结束位置的X坐标的偏移量
- android:fromYDelta 起始位置的Y坐标的偏移量
- android:toYDelta 结束位置的Y坐标的偏移量
以下代码实现的是从左到右的移动效果,起始位置为相对于控件本身-100%的位置,即在控件左边,与控件本身宽度一致的位置;结束位置为相对于父控件100%的位置,即会移出父控件右边缘的位置。
<?xml version="1.0" encoding="utf-8"?><translate xmlns:android="http://schemas.android.com/apk/res/android" android:duration="2000" android:fromXDelta="-100%" android:fromYDelta="0" android:toXDelta="100%p" android:toYDelta="0" />
translate标签对应的类为TranslateAnimation,父类也是Animation。
4、rotate
rotate可以实现旋转的动画效果,主要的属性如下:
- android:duration 动画从开始到结束持续的时长,单位为毫秒
- android:fromDegrees 旋转开始的角度
- android:toDegrees 旋转结束的角度
- android:pivotX 旋转中心点的X坐标,纯数字表示相对于View本身左边缘的像素偏移量;带”%”后缀时表示相对于View本身左边缘的百分比偏移量;带”%p”后缀时表示相对于父View左边缘的百分比偏移量
- android:pivotY 旋转中心点的Y坐标,纯数字表示相对于View本身顶部边缘的像素偏移量;带”%”后缀时表示相对于View本身顶部边缘的百分比偏移量;带”%p”后缀时表示相对于父View顶部边缘的百分比偏移量
以下示例代码旋转角度从0到360,即旋转了一圈,旋转的中心点都设为了50%,即是View本身中点的位置。
<?xml version="1.0" encoding="utf-8"?><rotate xmlns:android="http://schemas.android.com/apk/res/android" android:duration="2000" android:fromDegrees="0" android:toDegrees="360" android:pivotX="50%" android:pivotY="50%" />
rotate标签对应的类为RotateAnimation,父类也是Animation。
5、set
set标签可以将多个动画组合起来,变成一个动画集。比如想将一张图片缩放的同时也做移动,这时候就要用 set标签组合缩放动画和移动动画了。示例代码如下:
- android:shareInterpolator属性,设置为true时则可将interpolator应用到所有子元素中
<?xml version="1.0" encoding="utf-8"?><set xmlns:android="http://schemas.android.com/apk/res/android" android:duration="2000"> <translate android:fromXDelta="0" android:fromYDelta="0" android:toXDelta="200%" android:toYDelta="0" /> <scale android:fromXScale="1.0" android:fromYScale="1.0" android:pivotX="0%" android:pivotY="100%" android:toXScale="1.5" android:toYScale="1.5" /></set>
以上代码实现的动画效果为向右移动的同时也同步放大。set标签在视图动画中除了可以组合alpha, scale, translate, rotate这四种标签,也可以嵌套其他set标签。
6、通用属性
上面五个标签都有android:duration属性,这是一个通用的属性,而除了android:duration,还有其他的通用属性:
- android:duration 动画从开始到结束持续的时长,单位为毫秒
- android:detachWallpaper 设置是否在壁纸上运行,只对设置了壁纸背景的窗口动画(window animation)有效。设为true,则动画只在窗口运行,壁纸背景保持不变
- android:fillAfter 设置为true时,动画执行完后,View会停留在动画的最后一帧;默认为false;如果是动画集,需在标签中设置该属性才有效
- android:fillBefore 设置为true时,动画执行完后,View回到动画执行前的状态,默认即为true
- android:fillEnabled 设置为true时,android:fillBefore的值才有效,否则android:fillBefore会被忽略
- android:repeatCount 设置动画重复执行的次数,默认为0,即不重复;可设为-1或infinite,表示无限重复
- android:repeatMode 设置动画重复执行的模式,可设为以下两个值其中之一:
- restart 动画重复执行时从起点开始,默认为该值
- reverse 动画会反方向执行
- android:startOffset 设置动画执行之前的等待时长,毫秒为单位;重复执行时,每次执行前同样也会等待一段时间
- android:zAdjustment 表示被设置动画的内容在动画运行时在Z轴上的位置,取值为以下三个值之一:
- normal 默认值,保持内容在Z轴上的位置不变
- top 保持在Z周最上层
- bottom 保持在Z轴最下层
- android:interpolator 设置动画速率的变化
7、interpolator
关于interpolator的各种属性我在我的博客Android动画–Interpolator的介绍已经有介绍啦,而如果系统提供的 interpolator还不符合你的效果,也可以自定义。自定义的方式有两种,一种是通过继承 Interpolator 父类或其子类;另一种是通过自定义的xml文件,可以更改系统提供的 Interpolator 的属性。自定义的xml文件需存放于res/anim/目录下。第一种自定义的方式我在博客中介绍过,所以就讲讲第二种方式。
Xml的根标签与Interpolator相应的有九种,如下:
<accelerateDecelerateInterpolator>
在动画开始与结束时速率改变比较慢,在中间的时候加速。没有可更改设置的属性,所以设置的效果和系统提供的一样<accelerateInterpolator>
在动画开始时速率改变比较慢,然后开始加速。有一个属性可以设置加速的速率- android:factor 浮点值,加速的速率,默认为1
<anticipateInterpolator>
动画开始的时候向后然后往前抛。有一个属性设置向后拉的值- android:tension 浮点值,向后的拉力,默认为2,当设为0时,则不会有向后的动画了
<anticipateOvershootInterpolator>
动画开始的时候向后然后向前抛,会抛超过目标值后再返回到最后的值。可设置两个属性- android:tension 浮点值,向后的拉力,默认为2,当设为0时,则不会有向后的动画了
- android:extraTension 浮点值,拉力的倍数,默认为1.5(2*1.5),当设为0时,则不会有拉力了
<bounceInterpolator>
动画结束的时候会弹跳。没有可更改设置的属性<cycleInterpolator>
动画循环做周期运动,速率改变沿着正弦曲线。有一个属性设置循环次数- android:cycles 整数值,循环的次数,默认为1
<decelerateInterpolator>
在动画开始时速率改变比较快,然后开始减速。有一个属性设置减速的速率- android:factor 浮点值,减速的速率,默认为1
<linearInterpolator>
动画匀速播放。没有可更改设置的属性<overshootInterpolator>
动画向前抛,会抛超过最后值,然后再返回。有一个属性- android:tension 浮点值,超出终点后的拉力,默认为2
<!-- res/anim/my_interpolator.xml --><?xml version="1.0" encoding="utf-8"?><anticipateOvershootInterpolator xmlns:android="http://schemas.android.com/apk/res/android" android:tension="3" android:extraTension="2" />
将其设置到要应用的动画的android:interpolator属性即可:
android:interpolator="@anim/my_interpolator"
2、Property Animation
对 Property Animation 不了解的朋友可以看我的博客Android–Property Animation介绍,这里就不对Property Animation 的概念和作用做介绍啦,只讲解 Xml 里的知识。
这里要注意的是属性动画的xml文件放于res/animator/目录下,这是不能错的。
1、Animator
animator 标签与对应的ValueAnimator类提供了属性动画的核心功能,包括计算动画值、动画时间细节、是否重复等。执行属性动画分两个步骤:
- 计算动画值
- 将动画值应用到对象和属性上
ValuAnimiator只完成第一步,即只计算值,要实现第二步则需要在值变化的监听器里自行更新对象属性。通过 animator标签可以很方便的对 ValueAnimiator 进行设置,可设置的属性如下:
- android:duration 动画从开始到结束持续的时长,单位为毫秒
- android:startOffset 设置动画执行之前的等待时长,单位为毫秒
- android:repeatCount 设置动画重复执行的次数,默认为0,即不重复;可设为-1或infinite,表示无限重复
- android:repeatMode 设置动画重复执行的模式,可设为以下两个值其中之一:
- restart 动画重复执行时从起点开始,默认为该值
- reverse 动画会反方向执行
- android:valueFrom 动画开始的值,可以为int值、float值或color值
- android:valueTo 动画结束的值,可以为int值、float值或color值
- android:valueType 动画值类型,若为color值,则无需设置该属性
- intType 指定动画值,即以上两个value属性的值为整型
- floatType 指定动画值,即以上两个value属性的值为浮点型,默认值
- android:interpolator 设置动画速率的变化,比如加速、减速、匀速等,需要指定Interpolator资源,这里不再重复说明
接着,用一个实例讲解具体的用法吧。在这个例子里,将一个按钮的宽度进行缩放,从100%缩放到20%。
<!-- res/animator/value_animator.xml --><?xml version="1.0" encoding="utf-8"?><animator xmlns:android="http://schemas.android.com/apk/res/android" android:duration="1000" android:valueFrom="-200" android:valueTo="200" android:valueType="intType" />
imageView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { ValueAnimator animator = (ValueAnimator) AnimatorInflater.loadAnimator( MainActivity.this, R.animator.value_animator); animator.setTarget(imageView); animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator animation) { imageView.setTranslationY((Integer)animation.getAnimatedValue()); } }); animator.start(); }});
AnimatorInflater.loadAnimator( MainActivity.this, R.animator.value_animator);
视图动画是通过AnimationUtils类的loadAnimation()方法获取xml文件相对应的Animation类实例,而属性动画则是通过AnimatorInflater类的loadAnimation()方法获取相应的Animator类实例。
2、ObjectAnimator
objectAnimator 标签对应的类为ObjectAnimator,为ValueAnimator的子类。objectAnimator标签与animator标签不同的是,objectAnimator可以直接指定动画的目标对象的属性。标签可设置的属性除了和animator一样的那些,另外多了一个:
- android:propertyName 目标对象的属性名,要求目标对象必须提供该属性的setter方法,如果动画的时候没有初始值,还需要提供getter方法
<!-- res/animator/object_animator.xml --><?xml version="1.0" encoding="utf-8"?><objectAnimator xmlns:android="http://schemas.android.com/apk/res/android" android:duration="1000" android:propertyName="alpha" android:valueFrom="0.1f" android:valueTo="1.0f" android:valueType="floatType" />
imageView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { ObjectAnimator animator = (ObjectAnimator) AnimatorInflater.loadAnimator(MainActivity.this, R.animator.object_animator); animator.setTarget(v); animator.start(); } });
ObjectAnimator 提供了属性的设置,但相应的需要有该属性的setter 和 getter方法。而 ValueAnimator 则只是定义了值的变化,并不指定目标属性,所以也不需要提供 setter 和 getter方法,但只能在 AnimatorUpdateListener 监听器里手动更新属性。不过,也因为没有指定属性,所以其实更具灵活性了,你可以在监听器里根据值的变化做任何事情,比如更新多个属性,比如在缩放宽度的同时做垂直移动。
为了对View更方便的设置属性动画,Android系统也提供了View的一些属性和相应的setter和getter方法:
- alpha:透明度,默认为1,表示不透明,0表示完全透明
- pivotX 和 pivotY:旋转的轴点和缩放的基准点,默认是View的中心点
- scaleX 和 scaleY:基于pivotX和pivotY的缩放,1表示无缩放,小于1表示收缩,大于1则放大
- rotation、rotationX 和 rotationY:基于轴点(pivotX和pivotY)的旋转,rotation为平面的旋转,rotationX和rotationY为立体的旋转
- translationX 和 translationY:View的屏幕位置坐标变化量,以layout容器的左上角为坐标原点
- x 和 y:View在父容器内的最终位置,是左上角坐标和偏移量(translationX,translationY)的和
3、Set
set 标签对应于 AnimatorSet类,可以将多个动画组合成一个动画集,如上面提到的在缩放宽度的同时做垂直移动,可以将一个缩放宽度的动画和一个垂直移动的动画组合在一起。
set标签有一个属性可以设置动画的时序关系:
- android:ordering 设置动画的时序关系,取值可为以下两个值之一:
- together 动画同时执行,默认值
- sequentially 动画按顺序执行
那如果想有些动画同时执行,有些按顺序执行,该怎么办呢?因为 set标签是可以嵌套其它 set标签的,也就是说可以将同时执行的组合在一个 set标签,再嵌在按顺序执行的 set标签内。
<?xml version="1.0" encoding="utf-8"?><set xmlns:android="http://schemas.android.com/apk/res/android" android:ordering="together"> <objectAnimator android:duration="1000" android:propertyName="scaleY" android:valueFrom="1.0f" android:valueTo="2.0f" android:valueType="floatType" /> <objectAnimator android:duration="1000" android:propertyName="scaleX" android:valueFrom="1.0f" android:valueTo="2.0f" android:valueType="floatType" /></set>
imageView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { AnimatorSet animator = (AnimatorSet) AnimatorInflater.loadAnimator(MainActivity.this, R.animator.test); animator.setTarget(v); animator.start(); }});
结束语:本文仅用来学习记录,参考查阅。
- Android--Animation标签介绍
- android animation 简单介绍
- android Animation 介绍
- android Animation动画介绍
- android Animation介绍
- Android-Frame Animation介绍
- Android--Property Animation介绍
- Android Animation(动画)介绍
- android Animation 动画效果介绍
- android Animation 动画效果介绍
- android中animation效果介绍
- android Animation 动画效果介绍
- android Animation 动画效果介绍
- android Animation 动画效果介绍
- Android Animation 动画效果介绍
- Android之Animation全介绍
- android Animation 动画效果介绍
- android Animation 动画效果介绍
- ,永远不要去比较float和double
- Problem E: STL——灵活的线性表
- mybatis 用户添加,删除,更改 操作
- HDU2102:A计划(BFS)
- 使用shell通过微信公众号发送模板消息
- Android--Animation标签介绍
- UVA
- 再谈mysql中MYISAM索引和INODB索引的区别
- 那个夏天
- Problem F: STL——集合运算
- [BZOJ4152][AMPPZ2014]The Captain(堆优化dijkstra)
- PCA算法的原理以及c++实现(Eigen库实现)源码
- UVA
- AngularJS 浅谈DI-依赖注入 $injector的神奇之处