欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android帧动画、补间动画、属性动画用法详解

程序员文章站 2024-03-02 08:27:22
在安卓开发中,经常会使用到一些动画,那么在开发中,如何使用这些动画呢? 帧动画:不是针对view做出一些形状上的变化,而是用于播放一张张的图片,例如一些开机动画,类似于电...

在安卓开发中,经常会使用到一些动画,那么在开发中,如何使用这些动画呢?

帧动画:不是针对view做出一些形状上的变化,而是用于播放一张张的图片,例如一些开机动画,类似于电影播放,使用的是animationdrawable来播放帧动画
res/drawable 

<?xml version="1.0" encoding="utf-8"?> 
<animation-list xmlns:android="http://schemas.android.com/apk/res/android"  
  android:oneshot="true" 
  > 
   
  <item android:drawable="@drawable/g1" android:duration="200"></item> 
  <item android:drawable="@drawable/g2" android:duration="200"></item> 
  <item android:drawable="@drawable/g3" android:duration="200"></item> 
  <item android:drawable="@drawable/g4" android:duration="200"></item> 
  <item android:drawable="@drawable/g5" android:duration="200"></item> 
 
</animation-list> 
imageview iv = (imageview) findviewbyid(r.id.iv); 
iv.setbackgrounddrawable(getresources().getdrawable(r.drawable.frame_anim)); 
     
animationdrawable animationdrawable = (animationdrawable) iv.getbackground(); 
     
//设置是否只执行一次 
//animationdrawable.setoneshot(false); 
     
animationdrawable.start(); 

补间动画(view动画):如果view只做一些动画,并不对view做点击或触控的一些操作,可以使用补间动画,因为view动画,并不会改变view的位置,只是做一些渲染。view动画的四种变换效果对应着animation的四个子类:translateanimation、scaleanimation、rotateanimation、alphaanimation.

// 以view中心为缩放点,由初始状态缩小到看不间在返回到看见 
    scaleanimation animation = new scaleanimation( 
        1.0f, 0.0f,//一点点变小直到看不见为止 
        1.0f, 0.0f, 
        animation.relative_to_self, 0.5f, animation.relative_to_self, 0.5f//中间缩放 
    ); 
    animation.setduration(bubble_enter_center_scale_time); 
    animation.setrepeatmode(animation.reverse); 
    animation.setrepeatcount(1); 
    animation.setanimationlistener(new animation.animationlistener() { 
      @override 
      public void onanimationstart(animation animation) { 
      } 
 
      @override 
      public void onanimationend(animation animation) { 
 
        homingbubbleview(true,position,view, current, endratioframe); 
      } 
 
      @override 
      public void onanimationrepeat(animation animation) { 
      } 
    }); 
    view.startanimation(animation); 

属性动画:api11新特性,如果对view不仅做一些动画操作,也对view做一些点击触摸的操作,可以使用属性动画,因为属性动画会改变view的位置。属性动画类有valueanimator、objectanimator、animatorset。

下面就来介绍一下两个属性动画

valueanimator值动画,它并不是用于对view做一些动画,它仅仅是用于两个值之间的一个过度的动画(按照时间将两个差值平分,然后根据时间来一点点的往上加),系统提供了一些valueanimator.ofint()、valueanimator.offloat()用于整型和浮点型的两只之间的过度动画,如果两个值是自己自定义的类型该怎么办呢?安卓提供了一个valueanimator.ofobject()方法,其中一个参数是typeevaluator类型(类型估算器),typeevaluator是一个接口,给开发者的一个扩展,接口中有一个public object evaluate(float fraction, object startvalue, object endvalue) 方法,该方法会在valueanimator动画期间不断的调用,fraction是0-1之间的变化率,startvalue是(自定义类型的)开始值,endvalue是(自定义类型的)结束值,返回类型就是自定义的类型,可以根据自己的需求来自行计算期间的值该如何变化(如可以是运行轨迹)

public class floatevaluator implements typeevaluator {  
  public object evaluate(float fraction, object startvalue, object endvalue) {  
    float startfloat = ((number) startvalue).floatvalue();  
    return startfloat + fraction * (((number) endvalue).floatvalue() - startfloat);  
  }    

使用

valueanimator manimatorenetr = valueanimator.ofobject(new floatevaluator(getcontext()), 0,10); 
      manimatorenetr.addupdatelistener(new valueanimator.animatorupdatelistener() { 
        @override 
        public void onanimationupdate(valueanimator animation) { 
          (float) animation.getanimatedvalue();//这里就是返回不断变化的值 
           
        } 
      }); 
      manimatorenetr.setduration(1000); 
      manimatorenetr.addlistener(new animator.animatorlistener() { 
        @override 
        public void onanimationstart(animator animation) { 
 
        } 
 
        @override 
        public void onanimationend(animator animation) { 
           
        } 
 
        @override 
        public void onanimationcancel(animator animation) { 
 
        } 
 
        @override 
        public void onanimationrepeat(animator animation) { 
 
        } 
      }); 
      manimatorenetr.start(); 

objectanimator动画,它是针对view来做一些属性上值得变化,它不仅在值上有一个过度的变化,而且还会将变化的值设置到所要改变的属性上,让其产生动画的效果
objectanimator.ofint(view,"translationx",10,20).setduration(100).start(); 参数view是要产生动画的view,"translationx"属性,后面的参数是变化的区间
objectanimator做属性动画的时候,并不会改变view的left,top,right,bottom值,它改变的只是translationx和translationy的值,这些参数值的关系是 x = left + translationx  , y = top + translationy。在平移过程中,只会改变x 和translationx ,y和translatioiny的值。其中x和y是view左上角的坐标。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。