当前位置: 移动技术网 > IT编程>移动开发>Android > Android 动画(View动画,帧动画,属性动画)详细介绍

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

2019年07月24日  | 移动技术网IT编程  | 我要评论

牛王争霸,洛阳个人二手房网,凯豪棋牌

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,animation.relative_to_self,0.5f); 
rotateanimation.setduration(2000); 
rotateanimation.setfillafter(true); 
//缩放动画 
scaleanimation scaleanimation = new scaleanimation(0,1,0,1, 
        animation.relative_to_self,0.5f,animation.relative_to_self,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,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", 0f, 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动画的知识总结完毕。

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

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网