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

【Android 基础】详解Animation 动画介绍和实现

程序员文章站 2024-02-26 22:15:10
在前面 popupwindow 实现显示仿腾讯新闻底部弹出菜单有用到animation动画效果来实现菜单的显示和隐藏,本文就来介绍下吧。 1.animation 动画类型...

在前面 popupwindow 实现显示仿腾讯新闻底部弹出菜单有用到animation动画效果来实现菜单的显示和隐藏,本文就来介绍下吧。

1.animation 动画类型

android的animation由四种类型组成:

xml中

alph 渐变透明度动画效果
scale 渐变尺寸伸缩动画效果
translate 画面转换位置移动动画效果
rotate 画面转移旋转动画效果

javacode中

alphaanimation 渐变透明度动画效果
scaleanimation 渐变尺寸伸缩动画效果
translateanimation 画面转换位置移动动画效果
rotateanimation 画面转移旋转动画效果

2.android动画模式

animation主要有两种动画模式:

一种是tweened animation(渐变动画)

xml中 javacode
alpha alphaanimation
scale scaleanimation

一种是frame by frame(画面转换动画)

xml中 javacode
translate translateanimation
rotate rotateanimation

3.如何在xml文件中定义动画

步骤如下:

①新建 android 项目

②在res目录中新建anim文件夹

③在anim目录中新建一个my_anim.xml(注意文件名小写)

④在 my_anim.xml 加入动画代码

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" >
  <alpha />
  <scale />
  <translate />
  <rotate />
</set>

4.android动画解析--xml

4.1 alpha 渐变透明度动画效果

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" >
  <alpha
    android:duration="1000"
    android:fromalpha="0.0"
    android:toalpha="1.0" />
  <!--
   透明度控制动画效果 alpha
    浮点型值:
      fromalpha 属性为动画起始时透明度
      toalpha  属性为动画结束时透明度
      说明: 
        0.0表示完全透明
        1.0表示完全不透明
      以上值取0.0-1.0之间的float数据类型的数字
    
    长整型值:
      duration 属性为动画持续时间
      说明:   
        时间以毫秒为单位

  -->
</set>

4.2 scale 渐变尺寸伸缩动画效果

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" >

  <scale
    android:duration="1000"
    android:fillafter="false"
    android:fromxscale="0.0"
    android:fromyscale="0.0"
    android:interpolator="@android:anim/accelerate_decelerate_interpolator"
    android:pivotx="50%"
    android:pivoty="50%"
    android:toxscale="1.4"
    android:toyscale="1.4" />

</set><!--
   尺寸伸缩动画效果 scale
    属性:interpolator 指定一个动画的插入器
    在我试验过程中,使用android.res.anim中的资源时候发现
    有三种动画插入器:
      accelerate_decelerate_interpolator 加速-减速 动画插入器
      accelerate_interpolator    加速-动画插入器
      decelerate_interpolator    减速- 动画插入器
    其他的属于特定的动画效果
   浮点型值:
     
      fromxscale 属性为动画起始时 x坐标上的伸缩尺寸  
      toxscale  属性为动画结束时 x坐标上的伸缩尺寸   
    
      fromyscale 属性为动画起始时y坐标上的伸缩尺寸  
      toyscale  属性为动画结束时y坐标上的伸缩尺寸  
    
      说明:
         以上四种属性值  
  
          0.0表示收缩到没有 
          1.0表示正常无伸缩   
          值小于1.0表示收缩 
          值大于1.0表示放大
    
      pivotx   属性为动画相对于物件的x坐标的开始位置
      pivoty   属性为动画相对于物件的y坐标的开始位置
    
      说明:
          以上两个属性值 从0%-100%中取值
          50%为物件的x或y方向坐标上的中点位置
    
    长整型值:
      duration 属性为动画持续时间
      说明:  时间以毫秒为单位

    布尔型值:
      fillafter 属性 当设置为true ,该动画转化在动画结束后被应用

-->

4.3 translate 画面转换位置移动动画效果

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" >

  <translate
    android:duration="2000"
    android:fromxdelta="30"
    android:fromydelta="30"
    android:toxdelta="-80"
    android:toydelta="300" />
  <!--
   translate 位置转移动画效果
    整型值:
      fromxdelta 属性为动画起始时 x坐标上的位置  
      toxdelta  属性为动画结束时 x坐标上的位置
      fromydelta 属性为动画起始时 y坐标上的位置
      toydelta  属性为动画结束时 y坐标上的位置
      注意:
           没有指定fromxtype toxtype fromytype toytype 时候,
           默认是以自己为相对参照物       
    长整型值:
      duration 属性为动画持续时间
      说明:  时间以毫秒为单位


  -->

</set>

4.4 rotate 画面转移旋转动画效果

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" >

  <rotate
    android:duration="3000"
    android:fromdegrees="0"
    android:interpolator="@android:anim/accelerate_decelerate_interpolator"
    android:pivotx="50%"
    android:pivoty="50%"
    android:todegrees="+350" />
  <!--
   rotate 旋转动画效果
    属性:interpolator 指定一个动画的插入器
       在我试验过程中,使用android.res.anim中的资源时候发现
       有三种动画插入器:
        accelerate_decelerate_interpolator  加速-减速 动画插入器
        accelerate_interpolator        加速-动画插入器
        decelerate_interpolator        减速- 动画插入器
       其他的属于特定的动画效果
              
    浮点数型值:
      fromdegrees 属性为动画起始时物件的角度  
      todegrees  属性为动画结束时物件旋转的角度 可以大于360度 

    
      说明:
           当角度为负数——表示逆时针旋转
           当角度为正数——表示顺时针旋转       
           (负数from——to正数:顺时针旋转)  
           (负数from——to负数:逆时针旋转) 
           (正数from——to正数:顺时针旋转) 
           (正数from——to负数:逆时针旋转)   

      pivotx   属性为动画相对于物件的x坐标的开始位置
      pivoty   属性为动画相对于物件的y坐标的开始位置
        
      说明:    以上两个属性值 从0%-100%中取值
             50%为物件的x或y方向坐标上的中点位置

    长整型值:
      duration 属性为动画持续时间
      说明:    时间以毫秒为单位

  -->

</set>

5.如何使用xml中的动画效果

public static animation loadanimation (context context, int id)

//第一个参数context为程序的上下文  
//第二个参数id为动画xml文件的引用
//例子:
myanimation= animationutils.loadanimation(this,r.anim.my_anim);
//使用animationutils类的静态方法loadanimation()来加载xml中的动画xml文件

6.如何使用xml中的动画效果

//在代码中定义 动画实例对象
private animation myanimation_alpha;
private animation myanimation_scale;
private animation myanimation_translate;
private animation myanimation_rotate;
  
//根据各自的构造方法来初始化一个实例对象
myanimation_alpha=new alphaanimation(0.1f, 1.0f);

myanimation_scale =new scaleanimation(0.0f, 1.4f, 0.0f, 1.4f,
       animation.relative_to_self, 0.5f, animation.relative_to_self, 0.5f);

myanimation_translate=new translateanimation(30.0f, -80.0f, 30.0f, 300.0f);

myanimation_rotate=new rotateanimation(0.0f, +350.0f,
        animation.relative_to_self,0.5f,animation.relative_to_self, 0.5f);

7.android动画解析--javacode

7.1 alphaanimation

① alphaanimation类对象定义

private alphaanimation myanimation_alpha

② alphaanimation类对象构造

//第一个参数fromalpha为 动画开始时候透明度
//第二个参数toalpha为 动画结束时候透明度
alphaanimation(float fromalpha, float toalpha) 
//说明:0.0表示完全透明,1.0表示完全不透明
myanimation_alpha=new alphaanimation(0.1f, 1.0f);

③ 设置动画持续时间

//设置时间持续时间为 5000毫秒
myanimation_alpha.setduration(5000);

7.2 scaleanimation

① scaleanimation类对象定义

private alphaanimation myanimation_alpha;

② scaleanimation类对象构造

scaleanimation(float fromx, float tox, float fromy, float toy,
      int pivotxtype, float pivotxvalue, int pivotytype, float pivotyvalue)

//第一个参数fromx为动画起始时 x坐标上的伸缩尺寸  
//第二个参数tox为动画结束时 x坐标上的伸缩尺寸   
//第三个参数fromy为动画起始时y坐标上的伸缩尺寸  
//第四个参数toy为动画结束时y坐标上的伸缩尺寸 
/*说明:
          以上四种属性值  
          0.0表示收缩到没有 
          1.0表示正常无伸缩   
          值小于1.0表示收缩 
          值大于1.0表示放大
*/
//第五个参数pivotxtype为动画在x轴相对于物件位置类型 
//第六个参数pivotxvalue为动画相对于物件的x坐标的开始位置
//第七个参数pivotxtype为动画在y轴相对于物件位置类型  
//第八个参数pivotyvalue为动画相对于物件的y坐标的开始位置
myanimation_scale =new scaleanimation(0.0f, 1.4f, 0.0f, 1.4f,
       animation.relative_to_self, 0.5f, animation.relative_to_self, 0.5f);

③ 设置动画持续时间

//设置时间持续时间为 700毫秒
myanimation_scale.setduration(700);

7.3 translateanimation

① translateanimation类对象定义

private alphaanimation myanimation_alpha;

② translateanimation类对象构造

//第一个参数fromxdelta为动画起始时 x坐标上的移动位置  
//第二个参数toxdelta为动画结束时 x坐标上的移动位置   
//第三个参数fromydelta为动画起始时y坐标上的移动位置   
//第四个参数toydelta为动画结束时y坐标上的移动位置
translateanimation(float fromxdelta, float toxdelta,float fromydelta, float toydelta)

③ 设置动画持续时间

//设置时间持续时间为 2000毫秒
myanimation_translate.setduration(2000);

 7.4 rotateanimation

① rotateanimation类对象定义

private alphaanimation myanimation_alpha;

② rotateanimation类对象构造

rotateanimation(float fromdegrees, float todegrees,int pivotxtype, float pivotxvalue, int pivotytype, float pivotyvalue)
      
//第一个参数fromdegrees为动画起始时的旋转角度  
//第二个参数todegrees为动画旋转到的角度  
//第三个参数pivotxtype为动画在x轴相对于物件位置类型 
//第四个参数pivotxvalue为动画相对于物件的x坐标的开始位置
//第五个参数pivotxtype为动画在y轴相对于物件位置类型  
//第六个参数pivotyvalue为动画相对于物件的y坐标的开始位置
myanimation_rotate=new rotateanimation(0.0f, +350.0f,animation.relative_to_self,0.5f,animation.relative_to_self, 0.5f);

③ rotateanimation类对象构造

//设置时间持续时间为 3000毫秒
myanimation_rotate.setduration(3000);

8.如何使用java代码中的动画效果

 使用从view父类继承过来的方法startanimation()来为view或是子类view等等添加一个动画效果

public void startanimation (animation animation)

9.还是来个栗子吧

9.1 使用xml文件方式

①效果图如下:

【Android 基础】详解Animation 动画介绍和实现

②在xml文件中定义动画,前面已提及

③主界面布局,这没啥好说的,很简单 o(∩_∩)o

④主界面逻辑代码,主要就是这个了,控制动画显示

package com.yanis.base;

import android.app.activity;
import android.os.bundle;
import android.view.view;
import android.view.view.onclicklistener;
import android.view.animation.animation;
import android.view.animation.animationutils;
import android.widget.button;
import android.widget.imageview;

public class animationactivity extends activity implements onclicklistener {
  private imageview imgpic;
  private button btnalpha, btnscale, btntranslate, btnrotate;
  private animation myanimation;

  @override
  protected void oncreate(bundle savedinstancestate) {
    super.oncreate(savedinstancestate);
    setcontentview(r.layout.activity_animation);

    intiview();

    initdata();
  }

  /**
   * 初始化组件
   */
  private void intiview() {
    imgpic = (imageview) findviewbyid(r.id.imgpic);
    btnalpha = (button) findviewbyid(r.id.btnalpha);
    btnscale = (button) findviewbyid(r.id.btnscale);
    btntranslate = (button) findviewbyid(r.id.btntranslate);
    btnrotate = (button) findviewbyid(r.id.btnrotate);
  }

  /**
   * 初始化数据
   */
  private void initdata() {
    btnalpha.setonclicklistener(this);
    btnscale.setonclicklistener(this);
    btntranslate.setonclicklistener(this);
    btnrotate.setonclicklistener(this);
  }

  @override
  public void onclick(view v) {
    switch (v.getid()) {
    case r.id.btnalpha:
      /**
       * 使用xml中的动画效果 第一个参数context为程序的上下文 第二个参数id为动画xml文件的引用
       */
      myanimation = animationutils.loadanimation(this, r.anim.alpha_anim);
      imgpic.startanimation(myanimation);
      break;

    case r.id.btnscale:
      myanimation = animationutils.loadanimation(this, r.anim.scale_anim);
      imgpic.startanimation(myanimation);
      break;

    case r.id.btntranslate:
      myanimation = animationutils.loadanimation(this,
          r.anim.translate_anim);
      imgpic.startanimation(myanimation);
      break;

    case r.id.btnrotate:
      myanimation = animationutils
          .loadanimation(this, r.anim.rotate_anim);
      imgpic.startanimation(myanimation);
      break;

    }
  }
}

 10. 用animation-list实现逐帧动画

栗子效果图如下:

【Android 基础】详解Animation 动画介绍和实现

步骤如下:

①在res/drawable目录添加图片素材

【Android 基础】详解Animation 动画介绍和实现

②在drawable文件夹中添加动画animation-list帧布局文件

<?xml version="1.0" encoding="utf-8"?>
<!--
  根标签为animation-list,其中oneshot代表着是否只展示一遍,设置为false会不停的循环播放动画 
  根标签下,通过item标签对动画中的每一个图片进行声明 
  android:duration 表示展示所用的该图片的时间长度 

-->
<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
  android:oneshot="false" >
  <item
    android:drawable="@drawable/cmmusic_progress_1"
    android:duration="150">
  </item>
  <item
    android:drawable="@drawable/cmmusic_progress_2"
    android:duration="150">
  </item>
  <item
    android:drawable="@drawable/cmmusic_progress_3"
    android:duration="150">
  </item>
  <item
    android:drawable="@drawable/cmmusic_progress_4"
    android:duration="150">
  </item>
  <item
    android:drawable="@drawable/cmmusic_progress_5"
    android:duration="150">
  </item>
  <item
    android:drawable="@drawable/cmmusic_progress_6"
    android:duration="150">
  </item>
  <item
    android:drawable="@drawable/cmmusic_progress_7"
    android:duration="150">
  </item>
  <item
    android:drawable="@drawable/cmmusic_progress_8"
    android:duration="150">
  </item>
</animation-list>

③主界面页面布局设置,太简单,不赘述了

④主界面代码如下:

package com.yanis.base;

import android.app.activity;
import android.graphics.drawable.animationdrawable;
import android.os.bundle;
import android.view.view;
import android.view.view.onclicklistener;
import android.widget.button;
import android.widget.imageview;

public class animationactivity extends activity implements onclicklistener {
  private imageview imgpic;
  private button btnstart, btnstop;
  private animationdrawable animationdrawable;

  @override
  protected void oncreate(bundle savedinstancestate) {
    super.oncreate(savedinstancestate);
    setcontentview(r.layout.activity_animation);

    intiview();

    initdata();
  }

  /**
   * 初始化组件
   */
  private void intiview() {
    imgpic = (imageview) findviewbyid(r.id.imgpic);
    btnstart = (button) findviewbyid(r.id.btnstart);
    btnstop = (button) findviewbyid(r.id.btnstop);
  }

  /**
   * 初始化数据
   */
  private void initdata() {
    btnstart.setonclicklistener(this);
    btnstop.setonclicklistener(this);
    //sets a drawable as the content of this imageview.
    imgpic.setimageresource(r.drawable.loading_anim);
    //给动画资源赋值
    animationdrawable = (animationdrawable) imgpic.getdrawable();
  }

  @override
  public void onclick(view v) {
    switch (v.getid()) {
    case r.id.btnstart:
      animationdrawable.start();//开始
      break;

    case r.id.btnstop: 
       animationdrawable.stop(); //停止
      break;

    }
  }
}

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