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

Android编程之Animation动画详解

程序员文章站 2023-12-18 10:30:10
本文实例讲述了android编程之animation动画用法。分享给大家供大家参考,具体如下: animations 一、animations介绍 animation...

本文实例讲述了android编程之animation动画用法。分享给大家供大家参考,具体如下:

animations

一、animations介绍

animations是一个实现android ui界面动画效果的api,animations提供了一系列的动画效果,可以进行旋转、缩放、淡入淡出等,这些效果可以应用在绝大多数的控件中。

二、animations的分类

animations从总体上可以分为两大类:

1.tweened animations:该类animations提供了旋转、移动、伸展和淡出等效果。alpha——淡入淡出,scale——缩放效果,rotate——旋转,translate——移动效果。

2.frame-by-frame animations:这一类animations可以创建一个drawable序列,这些drawable可以按照指定的时间间歇一个一个的显示。

三、animations的使用方法(代码中使用)

animations extends object implements cloneable

使用tweenedanimations的步骤:

1.创建一个animationset对象(animation子类);
2.增加需要创建相应的animation对象;
3.更加项目的需求,为animation对象设置相应的数据;
4.将animatin对象添加到animationset对象当中;
5.使用控件对象开始执行animationset。

tweened animations的分类

1、alpha:淡入淡出效果
2、scale:缩放效果
3、rotate:旋转效果
4、translate:移动效果

animation的四个子类:

alphaanimation、translateanimation、scaleanimation、rotateanimation

四、具体实现

1、main.xml

<?xml version="1.0" encoding="utf-8"?>
<linearlayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="fill_parent"
  android:layout_height="fill_parent"
  android:orientation="vertical" >
  <linearlayout
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:orientation="horizontal" >
     <button
      android:id="@+id/rotatebutton"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:text="旋转" />
     <button
      android:id="@+id/scalebutton"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:text="缩放" />
     <button
      android:id="@+id/alphabutton"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:text="淡入淡出" />
     <button
      android:id="@+id/translatebutton"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:text="移动" />
  </linearlayout>
   <linearlayout
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >
     <imageview
      android:id="@+id/image"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:layout_centerinparent="true"
      android:src="@drawable/an" />
  </linearlayout>
 </linearlayout>

2、.java文件

importandroid.app.activity;
importandroid.os.bundle;
importandroid.view.view;
importandroid.view.view.onclicklistener;
import android.view.animation.alphaanimation;
import android.view.animation.animation;
importandroid.view.animation.animationset;
importandroid.view.animation.rotateanimation;
importandroid.view.animation.scaleanimation;
import android.view.animation.translateanimation;
importandroid.widget.button;
importandroid.widget.imageview;
public class animation1activity extends activity {
  private button rotatebutton = null;
  private button scalebutton = null;
  private button alphabutton = null;
  private button translatebutton = null;
  private imageview image = null;
  @override
  public void oncreate(bundle savedinstancestate) {
    super.oncreate(savedinstancestate);
    setcontentview(r.layout.main);
    rotatebutton = (button)findviewbyid(r.id.rotatebutton);
    scalebutton = (button)findviewbyid(r.id.scalebutton);
    alphabutton = (button)findviewbyid(r.id.alphabutton);
    translatebutton = (button)findviewbyid(r.id.translatebutton);
    image = (imageview)findviewbyid(r.id.image);
    rotatebutton.setonclicklistener(newrotatebuttonlistener());
    scalebutton.setonclicklistener(newscalebuttonlistener());
    alphabutton.setonclicklistener(newalphabuttonlistener());
    translatebutton.setonclicklistener(
      new translatebuttonlistener());
  }
  class alphabuttonlistener implementsonclicklistener{
    public void onclick(view v) {
      //创建一个animationset对象,参数为boolean型,
      //true表示使用animation的interpolator,false则是使用自己的
      animationset animationset = new animationset(true);
      //创建一个alphaanimation对象,参数从完全的透明度,到完全的不透明
      alphaanimation alphaanimation = new alphaanimation(1, 0);
      //设置动画执行的时间
      alphaanimation.setduration(500);
      //将alphaanimation对象添加到animationset当中
      animationset.addanimation(alphaanimation);
      //使用imageview的startanimation方法执行动画
      image.startanimation(animationset);
    }
  }
  class rotatebuttonlistener implementsonclicklistener{
    public void onclick(view v) {
      animationset animationset = new animationset(true);
      //参数1:从哪个旋转角度开始
      //参数2:转到什么角度
      //后4个参数用于设置围绕着旋转的圆的圆心在哪里
      //参数3:确定x轴坐标的类型,有absolut绝对坐标、relative_to_self相对于自身坐标、relative_to_parent相对于父控件的坐标
      //参数4:x轴的值,0.5f表明是以自身这个控件的一半长度为x轴
      //参数5:确定y轴坐标的类型
      //参数6:y轴的值,0.5f表明是以自身这个控件的一半长度为x轴
      rotateanimation rotateanimation = new rotateanimation(0, 360,
         animation.relative_to_self,0.5f,
         animation.relative_to_self,0.5f);
      rotateanimation.setduration(1000);
      animationset.addanimation(rotateanimation);
      image.startanimation(animationset);
    }
  }
  class scalebuttonlistener implementsonclicklistener{
    public void onclick(view v) {
      animationset animationset = new animationset(true);
      //参数1:x轴的初始值
      //参数2:x轴收缩后的值
      //参数3:y轴的初始值
      //参数4:y轴收缩后的值
      //参数5:确定x轴坐标的类型
      //参数6:x轴的值,0.5f表明是以自身这个控件的一半长度为x轴
      //参数7:确定y轴坐标的类型
      //参数8:y轴的值,0.5f表明是以自身这个控件的一半长度为x轴
      scaleanimation scaleanimation = new scaleanimation(
         0, 0.1f,0,0.1f,
         animation.relative_to_self,0.5f,
         animation.relative_to_self,0.5f);
      scaleanimation.setduration(1000);
      animationset.addanimation(scaleanimation);
      image.startanimation(animationset);
    }
  }
  class translatebuttonlistener implementsonclicklistener{
    public void onclick(view v) {
      animationset animationset = new animationset(true);
      //参数1~2:x轴的开始位置
      //参数3~4:y轴的开始位置
      //参数5~6:x轴的结束位置
      //参数7~8:x轴的结束位置
      translateanimation translateanimation =
       new translateanimation(
         animation.relative_to_self,0f,
         animation.relative_to_self,0.5f,
         animation.relative_to_self,0f,
         animation.relative_to_self,0.5f);
      translateanimation.setduration(1000);
      animationset.addanimation(translateanimation);
      image.startanimation(animationset);
    }
  }
}

tween animations的通用方法

1、setduration(long durationmills)
设置动画持续时间(单位:毫秒)

2、setfillafter(boolean fillafter)
如果fillafter的值为true,则动画执行后,控件将停留在执行结束的状态

3、setfillbefore(boolean fillbefore)
如果fillbefore的值为true,则动画执行后,控件将回到动画执行之前的状态

4、setstartoffset(long startoffset)
设置动画执行之前的等待时间

5、setrepeatcount(int repeatcount)
设置动画重复执行的次数

在代码中使用animations可以很方便的调试、运行,但是代码的可重用性差,重复代码多。同样可以在xml文件中配置animations,这样做可维护性变高了,只不过不容易进行调试。

一、在xml中使用animations步骤

1.在res文件夹下建立一个anim文件夹;

2.创建xml文件,并首先加入set标签,更改标签如下:

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

3.在该标签当中加入rotate,alpha,scale或者translate标签;

<alpha
    android:fromalpha="1.0"
    android:toalpha="0.0"
    android:startoffset="500"
    android:duration="500"/>

4.在代码当中使用animationutils当中装载xml文件,并生成animation对象。因为animation是animationset的子类,所以向上转型,用animation对象接收。

animation animation = animationutils.loadanimation(
 animation1activity.this, r.anim.alpha);
// 启动动画
image.startanimation(animation);

二、具体实现

1、 alpha.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
  android:interpolator="@android:anim/accelerate_interpolator">
  <!-- fromalpha和toalpha是起始透明度和结束时透明度 -->
  <alpha
    android:fromalpha="1.0"
    android:toalpha="0.0"
    android:startoffset="500"
    android:duration="500"/>
</set>

2、 rotate.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
  android:interpolator="@android:anim/accelerate_interpolator">
  <!--
    fromdegrees:开始的角度
    todegrees:结束的角度,+表示是正的
    pivotx:用于设置旋转时的x轴坐标
    例
      1)当值为"50",表示使用绝对位置定位
      2)当值为"50%",表示使用相对于控件本身定位
      3)当值为"50%p",表示使用相对于控件的父控件定位
    pivoty:用于设置旋转时的y轴坐标
   -->
  <rotate
    android:fromdegrees="0"
    android:todegrees="+360"
    android:pivotx="50%"
    android:pivoty="50%"
    android:duration="1000"/>
</set>

3、 scale.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
  android:interpolator="@android:anim/accelerate_interpolator">
  <!--
    起始x轴坐标
      止x轴坐标
      始y轴坐标
      止y轴坐标
      轴的坐标
      轴的坐标
   -->
  <scale
    android:fromxscale="1.0"
    android:toxscale="0.0"
    android:fromyscale="1.0"
    android:toyscale="0.0"
    android:pivotx="50%"
    android:pivoty="50%"
    android:duration="1000"/>
</set>

4、 translate.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
  android:interpolator="@android:anim/accelerate_interpolator">
  <!--
      始x轴坐标
      止x轴坐标
      始y轴坐标
      止y轴坐标
   -->
  <translate
    android:fromxdelta="0%"
    android:toxdelta="100%"
    android:fromydelta="0%"
    android:toydelta="100%"
    android:duration="2000"/>
</set>

5、 .java文件

importandroid.app.activity;
importandroid.os.bundle;
importandroid.view.view;
importandroid.view.view.onclicklistener;
import android.view.animation.animation;
importandroid.view.animation.animationutils;
import android.widget.button;
import android.widget.imageview;
public class animation1activity extends activity {
  private button rotatebutton = null;
  private button scalebutton = null;
  private button alphabutton = null;
  private button translatebutton = null;
  private imageview image = null;
  @override
  public void oncreate(bundle savedinstancestate) {
    super.oncreate(savedinstancestate);
    setcontentview(r.layout.main);
    rotatebutton = (button) findviewbyid(r.id.rotatebutton);
    scalebutton = (button) findviewbyid(r.id.scalebutton);
    alphabutton = (button) findviewbyid(r.id.alphabutton);
    translatebutton = (button) findviewbyid(r.id.translatebutton);
    image = (imageview) findviewbyid(r.id.image);
    rotatebutton.setonclicklistener(newrotatebuttonlistener());
    scalebutton.setonclicklistener(newscalebuttonlistener());
    alphabutton.setonclicklistener(newalphabuttonlistener());
    translatebutton.setonclicklistener(newtranslatebuttonlistener());
  }
  class alphabuttonlistener implementsonclicklistener {
    public void onclick(view v) {
      // 使用animationutils装载动画配置文件
      animation animation = animationutils.loadanimation(
         animation1activity.this, r.anim.alpha);
      // 启动动画
      image.startanimation(animation);
    }
  }
  class rotatebuttonlistener implementsonclicklistener {
    public void onclick(view v) {
      animation animation = animationutils.loadanimation(
         animation1activity.this, r.anim.rotate);
      image.startanimation(animation);
    }
  }
  class scalebuttonlistener implementsonclicklistener {
    public void onclick(view v) {
      animation animation = animationutils.loadanimation(
         animation1activity.this, r.anim.scale);
      image.startanimation(animation);
    }
  }
  class translatebuttonlistener implementsonclicklistener {
    public void onclick(view v) {
      animation animation = animationutils.loadanimation(animation1activity.this, r.anim.translate);
      image.startanimation(animation);
    }
  }
}

animationset的具体使用方法

1.animationset是animation的子类;

2.一个animationset包含了一系列的animation;

3.针对animationset设置一些animation的常见属性(如startoffset,duration等),可以被包含在animationset当中的animation集成;

例:一个animationset中有两个animation,效果叠加

第一种方法:

doubleani.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
  android:interpolator="@android:anim/accelerate_interpolator"
  android:shareinterpolator="true">
  <!-- fromalpha和toalpha是起始透明度和结束时透明度 -->
  <alpha
    android:fromalpha="1.0"
    android:toalpha="0.0"
    android:startoffset="500"
    android:duration="500"/>
  <translate
    android:fromxdelta="0%"
    android:toxdelta="100%"
    android:fromydelta="0%"
    android:toydelta="100%"
    android:duration="2000"/>
</set>

.java文件中

classdoublebuttonlistener implements onclicklistener {
    public void onclick(view v) {
      // 使用animationutils装载动画配置文件
      animation animation = animationutils.loadanimation(
         animation2activity.this, r.anim. doubleani);
      // 启动动画
      image.startanimation(animation);
    }
  }

第二种方法:

.java文件中

classdoublebuttonlistener implements onclicklistener {
    public void onclick(view v) {
      animationset animationset = new animationset(true);
      alphaanimation alphaanimation = new alphaanimation(1, 0);
      rotateanimation rotateanimation = new rotateanimation(0, 360,
         animation.relative_to_self,0.5f,
         animation.relative_to_self,0.5f);
      rotateanimation.setduration(1000);
      animationset.addanimation(rotateanimation);
      animationset.addanimation(alphaanimation);
      image.startanimation(animationset);
    }
  }

interpolator的具体使用方法

interpolator定义了动画变化的速率,在animations框架当中定义了以下几种interpolator

?  acceleratedecelerateinterpolator:在动画开始与结束的地方速率改变比较慢,在中间的时候速率快。
?  accelerateinterpolator:在动画开始的地方速率改变比较慢,然后开始加速
?  cycleinterpolator:动画循环播放特定的次数,速率改变沿着正弦曲线
?  decelerateinterpolator:在动画开始的地方速率改变比较慢,然后开始减速
?  linearinterpolator:动画以均匀的速率改变

分为以下几种情况:

1、在set标签中

<set xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@android:anim/accelerate_interpolator"/>

2、如果在一个set标签中包含多个动画效果,如果想让这些动画效果共享一个interpolator。

复制代码 代码如下:
android:shareinterpolator="true"

3、如果不想共享一个interpolator,则设置android:shareinterpolator="true",并且需要在每一个动画效果处添加interpolator。
<alpha
    android:interpolator="@android:anim/accelerate_decelerate_interpolator"
    android:fromalpha="1.0"
    android:toalpha="0.0"
    android:startoffset="500"
    android:duration="500"/>

4、如果是在代码上设置共享一个interpolator,则可以在animationset设置interpolator。

animationset animationset = newanimationset(true);
animationset.setinterpolator(new accelerateinterpolator());

5、如果不设置共享一个interpolator则可以在每一个animation对象上面设置interpolator。

animationset animationset = newanimationset(false);
alphaanimation.setinterpolator(new accelerateinterpolator());
rotateanimation.setinterpolator(new decelerateinterpolator());

frame-by-frame animations的使用方法

frame-by-frame animations是一帧一帧的格式显示动画效果。类似于电影胶片拍摄的手法。

main.xml

<?xml version="1.0" encoding="utf-8"?>
<linearlayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:orientation="vertical"
  android:layout_width="fill_parent"
  android:layout_height="fill_parent">
  <linearlayout
    android:orientation="horizontal"
    android:layout_height="wrap_content"
    android:layout_width="wrap_content">
    <button
      android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="运动"/>
  </linearlayout>
  <linearlayout
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">
    <imageview
      android:id="@+id/image"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:layout_centerinparent="true"/>
  </linearlayout>
</linearlayout>

3、anim.xml

<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
  android:oneshot="false">
  <item android:drawable="@drawable/a_01" android:duration="50"/>
  <item android:drawable="@drawable/a_02" android:duration="50"/>
  <item android:drawable="@drawable/a_03" android:duration="50"/>
  <item android:drawable="@drawable/a_04" android:duration="50"/>
  <item android:drawable="@drawable/a_05" android:duration="50"/>
  <item android:drawable="@drawable/a_06" android:duration="50"/>
</animation-list>

4、.java文件

importandroid.app.activity;
importandroid.graphics.drawable.animationdrawable;
importandroid.os.bundle;
importandroid.view.view;
importandroid.view.view.onclicklistener;
importandroid.widget.button;
importandroid.widget.imageview;
public class animationsactivity extends activity {
  private button button = null;
  private imageview imageview = null;
  @override
  public void oncreate(bundle savedinstancestate) {
    super.oncreate(savedinstancestate);
    setcontentview(r.layout.main);
    button = (button)findviewbyid(r.id.button);
    imageview = (imageview)findviewbyid(r.id.image);
    button.setonclicklistener(newbuttonlistener());
  }
  class buttonlistener implementsonclicklistener{
    public void onclick(view v) {
      imageview.setbackgroundresource(r.anim.anim);
      animationdrawable animationdrawable = (animationdrawable)
       imageview.getbackground();
      animationdrawable.start();
    }
  }
}

layoutanimationscontroller

1、什么是layoutanimationscontroller
layoutanimationscontroller可以用于实现使多个控件按顺序一个一个的显示。

1)layoutanimationscontroller用于为一个layout里面的控件,或者是一个viewgroup里面的控件设置统一的动画效果。

2)每一个控件都有相同的动画效果。

3)控件的动画效果可以在不同的时间显示出来。

4)layoutanimationscontroller可以在xml文件当中设置,以可以在代码当中进行设置。

2、在xml当中使用layoutanimationcontroller

1)在res/anim文件夹下创建一个名为list_anim_layout.xml文件:

android:delay - 动画间隔时间;子类动画时间间隔 (延迟)   70% 也可以是一个浮点数 如“1.2”等

android:animationorder - 动画执行的循序(normal:顺序,random:随机,reverse:反向显示)

android:animation – 引用动画效果文件

<layoutanimation
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:delay="0.5"
  android:animationorder="normal"
  android:animation="@anim/list_anim"/>

2)创建list_anim.xml文件,设置动画效果

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
  android:interpolator="@android:anim/accelerate_interpolator"
  android:shareinterpolator="true">
  <alpha
    android:fromalpha="0.0"
    android:toalpha="1.0"
    android:duration="1000"/>
</set>

3)在布局文件main.xml当中为listview添加如下配置

<listview
    android:id="@id/android:list"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:scrollbars="vertical"
    android:layoutanimation="@anim/list_anim_layout"/>

4)程序结构

Android编程之Animation动画详解

5)list_anim_layout.xml

<layoutanimation
xmlns:android="http://schemas.android.com/apk/res/android"
  android:delay="0.5"
  android:animationorder="normal"
  android:animation="@anim/list_anim"/>

6)list_anim.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
  android:interpolator="@android:anim/accelerate_interpolator"
  android:shareinterpolator="true">
  <alpha
    android:fromalpha="0.0"
    android:toalpha="1.0"
    android:duration="1000"/>
</set>

7)main.xml

<?xml version="1.0" encoding="utf-8"?>
<linearlayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:orientation="vertical"
  android:layout_width="fill_parent"
  android:layout_height="fill_parent"
  >
  <listview
    android:id="@id/android:list"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:scrollbars="vertical"
    android:layoutanimation="@anim/list_anim_layout"/>
  <button
    android:id="@+id/button"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:text="测试"/>
</linearlayout>

8)item.xml

<?xml version="1.0" encoding="utf-8"?>
<linearlayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="fill_parent"
  android:layout_height="fill_parent"
  android:orientation="horizontal"
  android:paddingleft="10dip"
  android:paddingright="10dip"
  android:paddingtop="1dip"
  android:paddingbottom="1dip">
  <textview android:id="@+id/name"
    android:layout_width="180dip"
    android:layout_height="30dip"
    android:textsize="5pt"
    android:singleline="true" />
  <textview android:id="@+id/sex"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:textsize="5pt"
    android:singleline="true"/>
</linearlayout>

9)java文件

public class animation2activity extendslistactivity {
  private button button = null;
  private listview listview = null;
  @override
  public void oncreate(bundle savedinstancestate) {
    super.oncreate(savedinstancestate);
    setcontentview(r.layout.main);
    listview = getlistview();
    button = (button)findviewbyid(r.id.button);
    button.setonclicklistener(newbuttonlistener());
  }
  private listadapter createlistadapter() {
    list<hashmap<string,string>> list =
      new arraylist<hashmap<string,string>>();
    hashmap<string,string> m1 = new hashmap<string,string>();
    m1.put("name", "bauble");
    m1.put("sex", "male");
    hashmap<string,string> m2 = new hashmap<string,string>();
    m2.put("name", "allorry");
    m2.put("sex", "male");
    hashmap<string,string> m3 = new hashmap<string,string>();
    m3.put("name", "allotory");
    m3.put("sex", "male");
    hashmap<string,string> m4 = new hashmap<string,string>();
    m4.put("name", "boolbe");
    m4.put("sex", "male");
    list.add(m1);
    list.add(m2);
    list.add(m3);
    list.add(m4);
    simpleadapter simpleadapter = new simpleadapter(
       this,list,r.layout.item,new string[]{"name","sex"},
       new int[]{r.id.name,r.id.sex});
    return simpleadapter;
  }
  private class buttonlistener implementsonclicklistener{
    public void onclick(view v) {
      listview.setadapter(createlistadapter());
    }
  }
}

备注:要将整个动画效果设置到linerlayout中,可以这样设置:

<linearlayoutxmlns:android="http://schemas.android.com/apk/res/android"
  android:orientation="vertical"
  android:layout_width="fill_parent"
  android:layout_height="fill_parent"
  android:layoutanimation="@anim/list_anim_layout"
>

3、在代码当中使用layoutanimationcontroller

1)去掉main.xml中的android:layoutanimation="@anim/list_anim_layout"/>

2)创建一个animation对象:可以通过装载xml文件,或者是直接使用animation的构造方法创建animation对象;

animation animation = (animation) animationutils.loadanimation(
 animation2activity.this, r.anim.list_anim);

3)创建layoutanimationcontroller对象: 

复制代码 代码如下:
layoutanimationcontroller controller = new layoutanimationcontroller(animation);

4)设置控件的显示顺序以及延迟时间
controller.setorder(layoutanimationcontroller.order_normal);
controller.setdelay(0.5f);

5)为listview设置layoutanimationcontroller属性:

复制代码 代码如下:
listview.setlayoutanimation(controller);

完整代码:
private class buttonlistener implementsonclicklistener {
    public void onclick(view v) {
      listview.setadapter(createlistadapter());
      animation animation = (animation) animationutils.loadanimation(
         animation2activity.this, r.anim.list_anim);
      layoutanimationcontroller controller = new layoutanimationcontroller(animation); 
      controller.setorder(layoutanimationcontroller.order_normal); 
      controller.setdelay(0.5f);
      listview.setlayoutanimation(controller); 
    }
  }

animationlistener

1、什么是animationlistener

1).animationlistener是一个监听器,该监听器在动画执行的各个阶段会得到通知,从而调用相应的方法;

2).animationlistener主要包括如下三个方法:

① onanimationend(animation animation) - 当动画结束时调用
② onanimationrepeat(animation animation) - 当动画重复时调用
③ onaniamtionstart(animation animation) - 当动画启动时调用

2、具体实现

1)main.xml

<?xml version="1.0" encoding="utf-8"?>
<relativelayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:id="@+id/layout"
  android:orientation="vertical"
  android:layout_width="fill_parent"
  android:layout_height="fill_parent">
  <button android:id="@+id/addbutton"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_alignparentbottom="true"
    android:text="添加图片" />
  <button android:id="@+id/deletebutton"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_above="@id/addbutton"
    android:text="删除图片" />
  <imageview android:id="@+id/image"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_centerinparent="true"
    android:layout_margintop="100dip"
    android:src="@drawable/an" />
</relativelayout>

2).java文件

public class animation2activity extends activity {
  private button addbutton = null;
  private button deletebutton = null;
  private imageview imageview = null;
  private viewgroup viewgroup = null;
  @override
  public void oncreate(bundle savedinstancestate) {
    super.oncreate(savedinstancestate);
    setcontentview(r.layout.main);
    addbutton = (button)findviewbyid(r.id.addbutton);
    deletebutton = (button)findviewbyid(r.id.deletebutton);
    imageview = (imageview)findviewbyid(r.id.image);
    //linearlayout下的一组控件
    viewgroup = (viewgroup)findviewbyid(r.id.layout);
    addbutton.setonclicklistener(newaddbuttonlistener());
    deletebutton.setonclicklistener(newdeletebuttonlistener());
  }
  private class addbuttonlistener implements onclicklistener{
    public void onclick(view v) {
      //淡入
      alphaanimation animation = new alphaanimation(0.0f, 1.0f);
      animation.setduration(1000);
      animation.setstartoffset(500);
      //创建一个新的imageview
      imageview newimageview = new imageview(
       animation2activity.this);
      newimageview.setimageresource(r.drawable.an);
      viewgroup.addview(newimageview,
       new layoutparams(
         layoutparams.fill_parent,
         layoutparams.wrap_content));
      newimageview.startanimation(animation);
    }
  }
  private class deletebuttonlistener implements onclicklistener{
    public void onclick(view v) {
      //淡出
      alphaanimation animation = new alphaanimation(1.0f, 0.0f);
      animation.setduration(1000);
      animation.setstartoffset(500);
      //为aniamtion对象设置监听器
      animation.setanimationlistener(
       new removeanimationlistener());
      imageview.startanimation(animation);
    }
  }
  private class removeanimationlistener implements animationlistener{
    //动画效果执行完时remove
    public void onanimationend(animation animation) {
      system.out.println("onanimationend");
      viewgroup.removeview(imageview);
    }
    public void onanimationrepeat(animation animation) {
      system.out.println("onanimationrepeat");
    }
    public void onanimationstart(animation animation) {
      system.out.println("onanimationstart");
    }
  }
}

3、总结一下

可以在activity中动态添加和删除控件,方法是:

1)取到那个layout

复制代码 代码如下:
viewgroup = (viewgroup)findviewbyid(r.id.layout);

2)添加时,先创建对象,然后添加
imageview newimageview = new imageview(
  animation2activity.this);
newimageview.setimageresource(r.drawable.an);
viewgroup.addview(newimageview,
       new layoutparams(
         layoutparams.fill_parent,
         layoutparams.wrap_content));

3)删除时,直接删除。

复制代码 代码如下:
viewgroup.removeview(imageview);

希望本文所述对大家android程序设计有所帮助。

上一篇:

下一篇: