【Android】学习笔记(12)――Animation使用方法(下)

在上一篇学习笔记中,在AnimationSet中的Animation的效果是叠加的,我们对AnimationSet设置执行时间和延迟动画等属性后,整个AnimationSet内的动画都是被设置了这些属性,所以,在AnimationSet中的Animation的效果是叠加的。如果想要这些动画效果不叠加,则需要进一步设置。

这里要使用到LayoutAnimationController。这个类可以用在一个布局文件中的layout内,对该layout内部的控件进行控制,也可以用在Java代码中,实现同样的效果。

1.在XML中使用LayoutAnimationController

首先在res/anim文件夹下创建新的文件list_controller.xml
其内容为:
 
 
  1. <?xmlversion="1.0"encoding="UTF-8"?>

  2. <layoutAnimationxmlns:android="http://schemas.android.com/apk/res/android"

  3. android:delay="0.5"//每个条目之间相隔是0.5秒

  4. android:animationOrder="normal"//条目显示的顺序,有normal,random,reverse,分别表示顺序,随机,反序

  5. android:animation="@anim/alpha"//每个条目使用alpha.xml内的动画效果

  6. />

这个文件用来控制ListView内每个条目动画的顺序和所要执行的效果。
其中的alpha.xml的动画效果为:
 
 
  1. <?xmlversion="1.0"encoding="UTF-8"?>

  2. <setxmlns:android="http://schemas.android.com/apk/res/android"

  3. android:interpolator="@android:anim/accelerate_interpolator"

  4. >

  5. <alpha

  6. android:fromAlpha="0.0"

  7. android:toAlpha="1.0"

  8. android:duration="2000"

  9. ></alpha>

  10. </set>


在main.xml的布局文件中,我们要对ListView的控件进行设置动画,如下:
 
 
  1. <?xmlversion="1.0"encoding="utf-8"?>

  2. <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"

  3. android:orientation="vertical"

  4. android:layout_width="fill_parent"

  5. android:layout_height="fill_parent"

  6. >

  7. <ListView

  8. android:layout_height="wrap_content"

  9. android:layout_width="fill_parent"

  10. android:id="@id/android:list"

  11. android:layoutAnimation="@anim/list_controller"//设置动画效果,引用的是list_controller.xml文件

  12. />

  13. </LinearLayout>

在Java代码中,是一个以前写的ListView的代码,如下:
 
 
  1. package cxt.demo;

  2. import java.util.ArrayList;

  3. import java.util.HashMap;

  4. import android.app.ListActivity;

  5. import android.os.Bundle;

  6. import android.widget.SimpleAdapter;

  7. publicclass AnimationDemo3Activity extends ListActivity {

  8. private ArrayList<HashMap<String,Object>> list = null;

  9. /** Called when the activity is first created. */

  10. @Override

  11. publicvoid onCreate(Bundle savedInstanceState) {

  12. super.onCreate(savedInstanceState);

  13. setContentView(R.layout.main);

  14. list = new ArrayList<HashMap<String,Object>>();

  15. HashMap<String,Object> m1 = new HashMap<String, Object>();

  16. HashMap<String,Object> m2 = new HashMap<String, Object>();

  17. HashMap<String,Object> m3 = new HashMap<String, Object>();

  18. m1.put("image", R.drawable.z11);

  19. m1.put("name", "Jack");

  20. m1.put("age","63");

  21. m2.put("image", R.drawable.z22);

  22. m2.put("name", "Bob");

  23. m2.put("age","15");

  24. m3.put("image", R.drawable.z33);

  25. m3.put("name", "Theron");

  26. m3.put("age","25");

  27. list.add(m1);

  28. list.add(m2);

  29. list.add(m3);

  30. SimpleAdapter adapter = new SimpleAdapter(this, list, R.layout.user, new String[]{"image","name","age"}, newint[]{R.id.image,R.id.name,R.id.age});

  31. setListAdapter(adapter);

  32. }

  33. }

上述的Java代码是使用SimpleAdapter的ListView,在之前的学习笔记中已经提到过了。
看一下运行效果:

232141902.png

上面的图是运行过程中的截图,Jack已经显示,Bob正在渐渐显示,第3个Theron还木有显示出来。这样,就可以实现不同控件的不同顺序的动画显示了。

2.在Java代码中使用LayoutAnimationController

首先我们不再需要上面的list_controller.xml文件了,因为文件中的内容我们将移至Java代码中,同时,main.xml中的ListView控件上也不用设置android:layoutAnimation属性了。
只需要在Java代码后加上如下代码:
 
 
  1. Animation animation = AnimationUtils.loadAnimation(AnimationDemo4Activity.this, R.anim.alpha);//创建一个Animation对象,设置动画效果

  2. LayoutAnimationController controller = new LayoutAnimationController(animation);//创建LayoutAnimationController对象

  3. controller.setOrder(LayoutAnimationController.ORDER_NORMAL);//设置条目显示的顺序,这里也有3种顺序,ORDER_NORMAL,ORDER_RANDOM,ORDER_REVERSE

  4. listView.setLayoutAnimation(controller);//将LayoutAnimationController对象设置给ListView,就OK了。

运行效果和上面的效果一模一样。
补充:
AnimationListener,我们可以为Animation对象设置监听器。
在上述的所有动画结束后,会回到原来的状态,如果一张图片,我们想要它渐渐消失,然后就不希望它再出现了;或者是某个控件从无到有,想让这个空间就停在结束的地方。那么就要给Animation设置一个监听器,代码如下

 
 
  1. privateclass AnimationImpl implements AnimationListener{

  2. @Override

  3. publicvoid onAnimationEnd(Animation arg0) {

  4. // TODO Auto-generated method stub

  5. //这里是这个动画效果结束后,会运行的方法

  6. //如果想让某个控件消失,可以在这里写代码

  7. }

  8. @Override

  9. publicvoid onAnimationRepeat(Animation arg0) {

  10. // TODO Auto-generated method stub

  11. //这里是这个动画效果重复运行时,会运行的方法

  12. }

  13. @Override

  14. publicvoid onAnimationStart(Animation arg0) {

  15. // TODO Auto-generated method stub

  16. //这里是这个动画效果开始时,会运行的方法

  17. }

  18. }

Frame-By-Frame Animations

Frame-By-Frame Animations是另一类Animations,和Tweened Animations不同。

它其实是多张图片不断切换,形成的动画效果,个人觉得实际应用性不强。
实现方法:
首先需要几张图片,我们要用这些图片组成动画效果,在res/drawable类的文件夹,建立一个xml文件,内容如下:
 
 
  1. <?xmlversion="1.0"encoding="UTF-8"?>

  2. <animation-listxmlns:android="http://schemas.android.com/apk/res/android"

  3. android:oneshot="false">

  4. <itemandroid:drawable="@drawable/p1"android:duration="500"></item>

  5. <itemandroid:drawable="@drawable/p2"android:duration="500"></item>

  6. <itemandroid:drawable="@drawable/p3"android:duration="500"></item>

  7. <itemandroid:drawable="@drawable/p4"android:duration="500"></item>

  8. </animation-list>

很简单,就是创建一个animation-list,内部是我们的图的资源和显示的时间。
Java文件中的代码:
 
 
  1. publicclass AnimationDemo5Activity extends Activity {

  2. /** Called when the activity is first created. */

  3. Button start = null;//布局文件中定义了一个Button控件

  4. ImageView imageView = null;//布局文件中定义了一个ImageView控件

  5. @Override

  6. publicvoid onCreate(Bundle savedInstanceState) {

  7. super.onCreate(savedInstanceState);

  8. setContentView(R.layout.main);

  9. imageView = (ImageView)findViewById(R.id.image);

  10. start = (Button)findViewById(R.id.start);

  11. start.setOnClickListener(new OnClickListener() {

  12. @Override

  13. publicvoid onClick(View arg0) {

  14. // TODO Auto-generated method stub

  15. imageView.setBackgroundResource(R.drawable.move);//为ImageView对象设置图片的资源

  16. AnimationDrawable animationDrawable = (AnimationDrawable)imageView.getBackground();//创建AnimationDrawable对象

  17. animationDrawable.start();//启动动画

  18. }

  19. });

  20. }

  21. }


以上是Frame-By-Frame Animations的简单使用方法。

附件是上面3个例子的示例代码,仅供参考。

如果我的文章给与了你帮助,就不妨请我喝杯咖啡吧,点击-> btn-index.png


你可能感兴趣的:(android,动画,移动开发,animation,frame)