Android 动画(View动画,帧动画,属性动画)详细介绍

Android 动画(View动画,帧动画,属性动画)详细介绍,第1张

概述0.前言 Android动画是面试的时候经常被问到的话题。我们都知道Android动画分为三类:View动画、帧动画和属性动画。

0. 前言 

AndroID动画是面试的时候经常被问到的话题。我们都知道AndroID动画分为三类:VIEw动画、帧动画和属性动画。

先对这三种动画做一个概述:

VIEw动画是一种渐进式动画,通过图像的平移、缩放、旋转和透明度等各种渐进式变换完成动画效果。

帧动画是通过不停的切换图片实现动画效果。

属性动画是不停的改变对象的属性来实现动画效果。本文原创,转载请注明出处:

http://blog.csdn.net/seu_calvin/article/details/52724655

1.  VIEw动画 

1.1  系统提供的四种VIEw动画(补间动画)

VIEw动画可以在res/anim/name.xml文件里进行配置,四种VIEw动画的渐变式变换分别对应<translate>、<scale>、<rotate>、<Alpha>四个标签,动画集合可以使用<set>标签。xml的各个动画属性比较简单,这里就不再贴实例代码了。只需要注意如何应用配置好的xml文件来启动动画即可:

vIEw.startAnimation(AnimationUtils.loadAnimation(this,R.anim.myanimation)); 

这些当然也可以在Java代码里进行配置,也比较简单,这里写了一个示例代码:

splash = (relativeLayout)findVIEwByID(R.ID.splash); //旋转动画 RotateAnimation rotateAnimation = new RotateAnimation(0,360,Animation.relative_TO_SELF,0.5f,0.5f); rotateAnimation.setDuration(2000); rotateAnimation.setFillAfter(true); //缩放动画 ScaleAnimation scaleAnimation = new ScaleAnimation(0,1,0.5f); scaleAnimation.setDuration(2000); scaleAnimation.setFillAfter(true); //渐变动画 AlphaAnimation AlphaAnimation = new AlphaAnimation(0.2f,1.0f); AlphaAnimation.setDuration(2000); AlphaAnimation.setFillAfter(true); //平移动画 TranslateAnimation translateAnimation = newTranslateAnimation (0,100,100); translateAnimation.setDuration(2000); translateAnimation.setFillAfter(true); //动画集合 AnimationSet animationSet = new AnimationSet(true); animationSet.addAnimation(rotateAnimation); animationSet.addAnimation(scaleAnimation); animationSet.addAnimation(AlphaAnimation); animationSet.addAnimation(translateAnimation); //启动动画 plash.startAnimation(animationSet); 

1.2   自定义view动画

自定义动画实际应用中比较少见,因此这里只做简单介绍。

完成自定义动画需要继承Animation类,并重写其initialize()以及applytransformation()。

前者用于一些初始化的 *** 作,后者用于进行矩阵变换。

1.3     为VIEwGroup的所有子元素设置动画

上面1.1,1.2都是给VIEw设置动画效果,AndroID同样提供了为VIEwGroup设置

androID:layoutAnimation=”@anim/layout_anim”来达到给VIEwGroup中所有子元素设置动画的目的。下面给出相关代码:

//res/anim/anim/layout_anim.xml <layoutAnimation xmlns:androID=” http://schemas.androID.com/apk/res/androID” androID:delay=”0.1” //动画延迟时间为0.1*T,本例为100ms androID:animationorder=”normal” //子元素的播放动画顺序为顺序,也有reverse以及random androID: animation=” @anim/layout_anim_item”/>  //res/anim/anim/layout_anim_item.xml <?xml version=”1.0” enCoding=”utf-8”?> <set xmlns:androID=”http://schemas.androID.com/apk/res/androID”  animation:duration=”200” //每个子元素的动画周期T  animation:interpolator=”@androID:anim/accelerate_ interpolator” //指定插值器 animation:shareInterpolator=”true”> //表示所有子元素共享该插值器 <Alpha androID:fromAlpha=”0.2” androID: toAlpha =”1.0”/> <translate androID:fromXDelta=”100” androID: toXDelta =”0”/> </set> 

1.4     为Activity切换设置动画

估计大家也都用过,在startActivity()之后使用,使Activity切换时达到一个平移的动画效果:

overrIDePendingTransition(R.anim.tran_in,R.anim.tran_out); 

//res/anim/tran_in <?xml version="1.0" enCoding="utf-8"?> <translate xmlns:androID="http://schemas.androID.com/apk/res/androID" androID:duration="500" //表示从屏幕100%的位置开始,因此tran_out当然是toXDelta="-100%p",其他不变 androID:fromXDelta="100%p" androID:fromYDelta="0"   androID:toXDelta="0"   androID:toYDelta="0" > </translate> 

2.   帧动画

上面也提到了,帧动画就是不停的切换图片实现动画效果。很明显容易OOM,所以使用帧动画要注意图片大小。
帧动画的使用也很简单,使用示例如下:

//res/drawable/myanimation.xml <?xml version=”1.0” enCoding=”utf-8”?> <animation-List xmlns:androID=”http://schemas.androID.com/apk/res/androID”  animation:oneshot=”false” > //false为循环播放,true为类似于VIEw动画的setFillAfter效果 <item androID: drawable =”@ drawable/ drawable 1” androID:duration=” 200”> <item androID: drawable =”@ drawable/ drawable 2” androID:duration=” 200”> </animation-List>  //在代码里加载动画设置并启动动画 vIEw.setBackgroundResource(R.drawable.myanimation.xml); (AnimationDrawable)vIEw.getBackground.start(); 

3.   属性动画

VIEw动画的那四种效果有很明显的缺点,绘制出来的效果其实并没有真正改变VIEw的属性,即left、top、right和bottom的值,只是系统临时绘制的结果。这样VIEw的点击位置并没有发生变化。针对这个问题,从AndroID3.0开始属性动画应运而生。

属性动画本质是通过改变新增的属性(如平移translationX/Y、缩放scaleX/Y、旋转rotationX/Y等)并刷新屏幕来实现动画效果,并且实现点击位置的实时改变。但是属性动画仍然不会修改原始的上下左右四个值。最后需要注意的是,属性动画不止用于VIEw,还可以用于任何对象。

下面介绍与属性动画相关的类和方法:

3.1  setTranslationX方法

该方法直接更改vIEw属性的方法,因为有时候不需要使用动画效果。

vIEw.setTranslationX(x);//3.0以后 VIEwHelper.setTranslationX(vIEw,x);//3.0以前通过NineoldAndroID库实现 

3.2   ValueAnimator类

ValueAnimator只定义和执行动画流程,并没有直接 *** 作属性值的逻辑,需要添加动画更新的监听,并在onAnimationUpdate()中执行自定义的动画逻辑。[java] vIEw plain copy 在CODE上查看代码片派生到我的代码片ValueAnimator animator = ValueAnimator.ofInt(1,100); //定义动画,相当于1秒内数100个数 animator.addUpdateListener(new AnimatorUpdateListener() {   @OverrIDe   public voID onAnimationUpdate(ValueAnimator animation){     float fraction = animation.getAnimatedFraction();//动画进度值0-1     //整型估值器帮我们计算了start+(end-strat)*fraction,并设置给控件的宽度     vIEw.getLayoutParams().wIDth = new IntEvaluator().evaluate(fraction,start,end) //不需要set方法     vIEw.requestLayout();   } }); animator.setDuration(1000).start(); 

3.3    ObjectAnimator类

ObjectAnimator继承自ValueAnimator,它允许直接改变vIEw的属性,下面通过一个例子介绍。

//x轴方向缩放的例子 ObjectAnimator animator = ObjectAnimator.offloat(vIEw,”scaleX”,2.0f); animator.setDuration(1000); animator.setStartDelay(1000); animator.start(); 

大多数的情况使用ObjectAnimator就足够了,因为它不用像ValueAnimator那样自己写动画更新的逻辑,但是ObjectAnimator有一定的限制――它需要目标属性提供指定的处理方法(譬如提供get/set方法),这是因为ObjectAnimator的原理是不停的调用set方法更新属性值,并且如果我们没有传递初始值,系统会直接调用get方法获取值。而上面3.2中介绍过的ValueAnimator则不直接 *** 作属性值,所以要 *** 作对象的属性可以不需要se/get方法,你完全可以通过当前动画的计算去修改任何属性。

针对这个问题,官方推荐我们用一个类包装原始对象,间接为其提供get/set方法,实现起来很简单,实例如下:

VIEwWrapper wrapper = new VIEwWrapper(vIEw); ObjectAnimator.ofInt(vIEw,”wIDth”,200).setDuration(1000).start();  private static class VIEwWrapper{   private VIEw myVIEw;  public VIEwWrapper(VIEw vIEw){   myVIEw = vIEw;  }  public int getWIDth(){   return myVIEw.getLayoutParams().wIDth;  }  public int setWIDth(int wIDth){  myVIEw.getLayoutParams().wIDth = wIDth;  myVIEw.requestLayout();  } } 

3.4  VIEwPropertyAnimation类

VIEwPropertyAnimation是NineoldAndroID库中的类,简化了ObjectAnimator类的 *** 作,并且NineoldAndroID库兼容了3.0以前的AndroID版本。下面经过一个例子介绍。

//x轴方向缩放的例子,效果同3.3 VIEwPropertyAnimation.animate(vIEw).scaleX(2.0f).setDuration(1000) .setInterpolator(new OvershootInterpolator()) .setStartDelay(1000).start(); 

3.5  AnimationSet类

动画集合,提供把多个动画组合成一个组合的机制,并可设置动画的时序关系,如同时播放、顺序播放或延迟播放。具体使用方法比较简单,如下所示:

ObjectAnimator objectAnimator1= ObjectAnimator.offloat(vIEw,"Alpha",1.0f,0f);  ObjectAnimator objectAnimator2= ObjectAnimator.offloat(vIEw,"translationY",0f,30f);  ObjectAnimator objectAnimator3= ObjectAnimator.offloat(vIEw,"translationX",30f);  AnimatorSet animatorSet = new AnimatorSet();  animatorSet.setDuration(5000);  animatorSet.setInterpolator(new linearInterpolator());   // animatorSet.playTogether(objectAnimator1,objectAnimator2. objectAnimator3); //三个动画同时执行  // 12同时执行,3接着执行  animatorSet.play(objectAnimator1).with(objectAnimator2);  animatorSet.play(objectAnimator3).after(objectAnimator2);  animatorSet.start(); 

4.  插值器总结

4.1  系统已经提供给我们的插值器
各种插值器都是实现了Interpolator接口,下面来看一下系统已经提供给我们直接使用的插值器。

 4.2  自定义插值器

Interpolator都实现了Interpolator接口,而Interpolator接口又继承自TimeInterpolator,TimeInterpolator接口定义了一个由系统调用的getInterpolation(float input)方法,其中参数input代表动画完成进度,在0和1之间。我们自定义插值器只需要实现Interpolator接口并覆写getInterpolation()方法即可实现自定义的动画效果。 

如下就是一个动画始末速率较慢、中间加速的AccelerateDecelerateInterpolator插值器:

public class AccelerateDecelerateInterpolator extends BaseInterpolator     implements NativeInterpolatorFactory {   ......   public float getInterpolation(float input) {     return (float)(Math.cos((input + 1) * Math.PI) / 2.0f) + 0.5f;   }   ...... } 

5.  动画监听器

我们在平时开发过程中,经常要监听动画完成的时机以继续业务逻辑,那么我们可以通过给动画集合设置AnimationListener监听器来实现。分别可以监听动画开始、结束、取消以及重复播放。

//监听动画完成 animationSet.setAnimationListener(new Animation.AnimationListener() {   @OverrIDe   public voID onAnimationStart(Animation animation) {}   @OverrIDe   public voID onAnimationEnd(Animation animation) {}   @OverrIDe public voID onAnimationRepeat(Animation animation) {} @OverrIDe   public voID onAnimationCancel(Animation animation) {} }); 

最后若想监听动画中每一帧的回调,我们可以设置AnimatorUpdateListener监听器并重写其onAnimationUpdate()方法即可。

至此关于AndroID动画的知识总结完毕。

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

总结

以上是内存溢出为你收集整理的Android 动画(View动画,帧动画,属性动画)详细介绍全部内容,希望文章能够帮你解决Android 动画(View动画,帧动画,属性动画)详细介绍所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1148003.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-31
下一篇 2022-05-31

发表评论

登录后才能评论

评论列表(0条)

保存