当前位置: 移动技术网 > 移动技术>移动开发>Android > 解析Android中Animation动画的编写要点

解析Android中Animation动画的编写要点

2019年07月24日  | 移动技术网移动技术  | 我要评论
在api demo的view->animation下可以找到四个animation的demo,第一个3d translate比较复杂,最后再讲,先讲第2个interp

在api demo的view->animation下可以找到四个animation的demo,第一个3d translate比较复杂,最后再讲,先讲第2个interpolator。该activity对应的是view包内的animation3.java,和layout的animation_3.xml。

界面的布局不加解释了,就一个spinner和一个textview。不是本文内容。

主要解释下几个重点语句。

初始化animation,从类的名字可以看出是一个变换view的位置的动画,参数起点横坐标,终点横坐标,起点纵坐标,终点纵坐标。

animation a = new translateanimation(0.0f, 
        targetparent.getwidth() - target.getwidth() - targetparent.getpaddingleft() - 
        targetparent.getpaddingright(), 0.0f, 0.0f); 

 

下面是动画的参数设置,我加上了注释

a.setduration(1000);//设置动画所用的时间 
    a.setstartoffset(300);//设置动画启动的延时 
    //设置重复模式,restart为结束后重新开始,reverse为按原来的轨迹逆向返回 
    a.setrepeatmode(animation.restart); 
    //设置重复次数,infinite为无限 
    a.setrepeatcount(animation.infinite); 
    //根据用户在spinner的选择设置target的进入的方式 
    switch (position) { 
      case 0: 
        //加速进入 
        a.setinterpolator(animationutils.loadinterpolator(this.r.anim.accelerate_interpolator)); 
        break; 
      case 1: 
        //减速进入 
        a.setinterpolator(animationutils.loadinterpolator(this, 
            android.r.anim.decelerate_interpolator)); 
        break; 
      case 2: 
        //加速进入.与第一个的区别为当repeatmode为reverse时,仍为加速返回原点 
        a.setinterpolator(animationutils.loadinterpolator(this, 
            android.r.anim.accelerate_decelerate_interpolator)); 
        break; 
      case 3: 
        //先往后退一点再加速前进 
        a.setinterpolator(animationutils.loadinterpolator(this, 
            android.r.anim.anticipate_interpolator)); 
        break; 
      case 4: 
        //减速前进,冲过终点前再后退 
        a.setinterpolator(animationutils.loadinterpolator(this, 
            android.r.anim.overshoot_interpolator)); 
        break; 
      case 5: 
        //case 3,4的结合体 
        a.setinterpolator(animationutils.loadinterpolator(this, 
            android.r.anim.anticipate_overshoot_interpolator)); 
        break; 
      case 6: 
        //停止前来回振几下 
        a.setinterpolator(animationutils.loadinterpolator(this, 
            android.r.anim.bounce_interpolator)); 
        break; 
    } 
    //让target开始执行这个动画 
    target.startanimation(a); 
  } 

这里使用的是android已预设的一些动作,我们也可以自定义xml来实现更好看的动画效果的,这个下一篇再讲。

除了translationanimation,还有alphaanimation、rotateanimation、scaleanimation,使用这几个基体动作的组合,可以形成一系列复杂的动画效果。具体用法请查看sdk。

整个都比较简单,就一个函数的调用,还不懂的看一下api的注释和sdk文档,没什么难理解的。

现在开始看第三个push,从view->animation->push可以启动这个activity

push这个demo主要是展示了view之间的切换效果。

push对应的java文件为view包内的animation2.java,对应的xml布局文件为layout/animation_2.xml。

先看布局文件,这个页面内最主要用到的是一个viewflipper。使用viewflipper可以实现多个view之间的动态切换,并且可以自定义切换动画,本例中所展示的就是如何定义切换动画。

下面只挑重点语句来讲了。

让viewflipper开始自动切换。

mflipper.startflipping(); 

 

当点击时spinner内的选项时,更改进入和退出的动画效果。

public void onitemselected(adapterview parent, view v, int position, long id) { 
    switch (position) { 
    case 0: 
      mflipper.setinanimation(animationutils.loadanimation(this, 
          r.anim.push_up_in)); 
      mflipper.setoutanimation(animationutils.loadanimation(this, 
          r.anim.push_up_out)); 
      break; 
    case 1: 
      mflipper.setinanimation(animationutils.loadanimation(this, 
          r.anim.push_left_in)); 
      mflipper.setoutanimation(animationutils.loadanimation(this, 
          r.anim.push_left_out)); 
      break; 
    case 2: 
      mflipper.setinanimation(animationutils.loadanimation(this.r.anim.fade_in)); 
      mflipper.setoutanimation(animationutils.loadanimation(this, 
          android.r.anim.fade_out)); 
      break; 
    default: 
      mflipper.setinanimation(animationutils.loadanimation(this, 
          r.anim.hyperspace_in)); 
      mflipper.setoutanimation(animationutils.loadanimation(this, 
          r.anim.hyperspace_out)); 
      break; 
    } 
  } 

这里的animation都是自定义的动画效果,可以在res/anim内找到对应的xml文件,下面用push_up_in.xml来说明定义的大概用法。

因为这个动画是由几个动画复合组成的,所以外围就用一个set标签括起来,组成一个animationset。

translate标签内主要定义位置的变化情况,fromydelta="100%p",是指从viewflipper的正下方刚好一个view的高度的距离的地方开始出现,100%p是一个相对值,大于0为下方,小于0为上方。toydelta="0",是指刚好达到布局文件的原始位置停止。android:duration="300",是指整个动作的时间用时为300毫秒,系统会根据这个时间自动调整速度。

alpha标签内定义的是透明度,0为全透明,1.0为不透明,过程为300毫秒,让view为逐渐出现的过程

<set xmlns:android="http://schemas.android.com/apk/res/android"> 
  <translate android:fromydelta="100%p" android:toydelta="0" android:duration="300"/> 
  <alpha android:fromalpha="0.0" android:toalpha="1.0" android:duration="300" /> 
</set> 

push_up_out.xml,和push_left的两个标签都几乎一样的,应该很好理解。

hyperspace_in.xml更简单,只有一个alpha,所以外层没有set标签。startoffset是设置延迟。

hyperspace_out.xml相对复杂一点,set里面还包括有set,但仍然是由几个小动作一起组成的,可以一点点拆成来理解。

最外层是一个set,里面嵌套一个scale和一个set。

第一个scale标签可以理解为,以当前view的正中间位置为轴点,在700毫秒时间内,以加速放大的方式,将view的横长变为1.4倍,高度变为0.6倍。至于fillafter这个标签我一直搞不懂这个功能,照sdk里的解释,是在连续动画中让view保持在动画的最后一帧,但照我的实验似乎没有什么效果,这个求高手指教。(查网上一些资料是说必须在代码里设置,这个是不是属于android的bug?)一个animationset可以做为另一个animationset的子集,这个很容易理解。rotate标签内的照字面意思应该很容易理解了,不再赘述了。

<set xmlns:android="http://schemas.android.com/apk/res/android" android:shareinterpolator="false"> 
  <scale  
    android:interpolator="@android:anim/accelerate_decelerate_interpolator" 
    android:fromxscale="1.0"  
    android:toxscale="1.4"  
    android:fromyscale="1.0"  
    android:toyscale="0.6"  
    android:pivotx="50%" 
    android:pivoty="50%" 
    android:fillafter="false" 
    android:duration="700" /> 
  <set  
    android:interpolator="@android:anim/accelerate_interpolator" 
        android:startoffset="700"> 
     
    <scale 
      android:fromxscale="1.4"  
      android:toxscale="0.0" 
        android:fromyscale="0.6" 
      android:toyscale="0.0"  
      android:pivotx="50%"  
      android:pivoty="50%"  
      android:duration="400" /> 
     
    <rotate  
      android:fromdegrees="0"  
      android:todegrees="-45" 
      android:toyscale="0.0"  
      android:pivotx="50%"  
      android:pivoty="50%" 
      android:duration="400" /> 
  </set> 
</set> 

很多动画其实都是通过alpha, scale, rotate, translate这几个基本动作组成的。这些都属于tween animation。另外还有一种frame animation,类似放电影的效果,一帧帧播放动画,以后再说。

所有在xml内的设置的属性都可以在java里找到对应的api函数,在android sdk文档里可以查得到。

其实我觉得我这样写得都有点啰嗦了,android的api的名字定义都很规范,从名字都已经可以判断出这个函数的功能了。

3d transition的主要定义在animation包内,里面只有两个java文件。

3d翻转其实并不是很复杂,最主要的是一个函数rotation.setanimationlistener(new displaynextview(position));在transition3d的第99行。这个函数的主要作用是通过一个listener,设置动画开始前、结束后,和重复动作时要触发的事件。

3d翻转效果主要由两个rotato动作构成,第二个动作在第一个动作完成后,由listener来启动。这两个animation连起来,看的时候就像3d旋转的效果了。

同时,在rotate3danimation.java中,重新定义了一个animation,覆写了initialize和applytransformation方法。initialize是初始化动作,applytransformation就定义动画效果的,这个是最主要的部分,传进来的是当前时间为总时间的百分比和动作,这里利用了转换矩阵。发现我的线性代数都忘了t_t,以后要重新看一遍。主要这个camara不太理解,注释里也没写有这个类有什么用,从代码里猜测这个是保存当前的界面。

这样说来是简单,但做起来难啊。。

如您对本文有疑问或者有任何想说的,请点击进行留言回复,万千网友为您解惑!

相关文章:

验证码:
移动技术网