Android动画教程之属性动画详解

  


  

  

Android开发中,总是需要一些动画来优化用户的交互体验,提高用户满意度。因此,谷歌为我们提供了一些用于处理动画效果的动画框架.Android的动画框架分为两类:

  
      <李>传统动画(动画):通过系统不断调用onDraw方法重绘界面,来达到动画的效果。   <李>属性动画(动画):通过操纵一个属性的获?设置方法,真实地改变目标的某些属性。   
  


  

  

既然有了传统动画框架,谷歌为什么还要创造一个属性动画框架呢?
  

  

我们下面举个例子来说明一下传统动画的局限性。
  

  

在布局中加入一个ImageView和一个按钮,点击ImageView后弹出一个吐司,点击按钮后使ImageView展现一个向右平移的动画效果。
  

  

下面是使用传统动画实现的代码:
  

        TranslateAnimation动画=new TranslateAnimation (0200, 0, 0);//平移动画x轴移动200 y轴不动   animation.setDuration (1000);//动画时长   animation.setFillAfter(真正的);//使动画结束后停留在结束的位置    mIvPicture.startAnimation(动画);      

运行后,ImageView确实进行了我们预期的平移的效果。可是当我们尝试点击ImageView当前的位置时,却没有面包弹出。我们再尝试去点击ImageView开始动画前的位置,却成功弹出了面包。
  

  

这就是传统动画很大的局限性:

  
      <李>它仅仅是重绘了控件,改变了其显示的位置。但真正事件响应的位置,却并没有发生改变。因此传统动画不适合做具有交互的动画效果。仅仅能做一些显示的动画效果。   <李>传统动画是不断通过>   ObjectAnimator.ofFloat (mIvPicture translationX“0 f 200 f)   .setDuration (1000)    .start ();      

    我们来分析一下这一句代码。我们调用了ofFloat代码,并传入三个参数。
      

      

    & # 8203;第一个参数是动画需要操纵的目标,在这里是我们的ImageView。
      

      

    & # 8203;第二个参数是所需要操纵的目标所具备的属性名称。
      

      

    & # 8203;第三个参数是这个动画变化的取值范围。
      

      

    最后设置一下它的动画的属性,便可以开始了。
      

      

    这次我们再次点击ImageView目前的位置,成功地弹出了面包。这证实了属性动画是通过改变物体的属性来达到动画效果的理论。
      

      

    当我们需要改变y坐标时,只需要把“translationX变”为“translationY”即可。
      

      

    其实,只要谷歌对一个对象的某个属性提供了获取和设置方法,我们就可以使用这个属性来实现动画效果。
      

      

    其实我们还能用X Y两个属性实现之前的动画效果,那么对象属性中X的Y与translationX translationY有什么区别呢?

      

    translationX translationY指的是物体的偏移量,而X Y则表示它最终到达的绝对位置。

      

    <>强旋转
      

      

    旋转属性使用的是“旋转”属性,后面的变换范围的单位是角度。
      

      

    比如想让ImageView旋转90度,只需要
      

            ObjectAnimator.ofFloat (f mIvPicture,“旋转”,0,90 f)   .setDuration (1000)    .start ();      

    <强>其他
      

      

    其实属性动画能操纵的属性,只要具有集,得到方法,都可以进行操纵。如scaleX,写入scaleY等等……
      

      

    <>强插值器
      

      

    Android为我们内置了插值器,使我们的动画更为自然。比如可以让我们的平移动画像物体的重力加速度由快到慢的加速等等
      

      

    Android中内置了七种插值器,分别是

      
        <李> 加速   <李> 减速   <李> 加速/减速   <李>预测李   <李>过度李   <李>预测/过度李   <李> 反弹   
      

    要应用插值器,可以调用ObjectAnimator的setInterpolator方法,新出的对应的插值器作为参数(xxxInterpolator)。比如下面这段代码:
      

            动画师。setInterpolator(新AccelerateInterpolator ());      

    通过插值器,我们可以让动画的效果更佳自然。
      

      

    <强>多种属性动画同时作用
      

      

    当我们把几种动画按顺序写下时,运行程序,会发现效果是三种属性动画的叠加,由此可以发现,属性动画在调用开始方法后,实际上是一个异步的过程,因此我们就可以看到三个属性动画同时作用的效果。通过这样的方法,其实就可以实现多种属性动画同时作用的效果:

    Android动画教程之属性动画详解