创建视图动画

作者:追风剑情 发布于:2016-6-18 12:54 分类:Android

      在Android3.0之前创建动画的首要方法是视图动画系统。视图动画提供了一系列内置的动画操作,能够在视图之间生成动画。你提供起始值和终止值,动画框架将会改变显示的视图。这个系统很容易实现,但是它也有一些缺点。首先,这只限于在视图对象上操作。如果你想要做成不是视图的动画,你将需要自己完成。第二,它仅在一个默认的属性集上运作,它不会影响其他的属性。最后,视图动画只会影响是如何被绘制的,当视图被定位之后就没有影响了。重要的是,视图的矩形的点击区域在视图动画期间是不会移动的——在动画代码中发现的一个常见错误。当动画结束之后你需要更改视图以更新它的位置。

      这些限制导致视图动画框架在Android3.0及以后的版本中被弃用。然而,现在仍然有大量的3.0之前版本的设备在使用,所以可能的情况下,为了最大的应用兼容性,你应当使用视图动画框架。

定义动画

      与Android中大多数的UI代码类似,动画可以在代码中定义也可以在XML中定义。不过,建议使用XML,因为创建复杂动画更容易并且能够复用。定义在XML中的视图动画被放置于res/anim/文件夹下。一个动画的基础结构与视图的类似。

下面是视图动画的可用选项:

  • Translate,移动视图。
  • Scale,改变视图的尺寸。
  • Rotate,翻转视图。
  • Alpha,改变视图的透明度。

下面是一个移动(translate)视图的示例动画:

动画xml


  1. <?xml version="1.0" encoding="utf-8"?>
  2. <translate xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:duration = "5000"
  4. android:toYDelta="100%"
  5. android:toXDelta="100%">
  6. </translate>


活动xml


  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:layout_width="match_parent"
  4. android:layout_height="match_parent"
  5. android:orientation="vertical" >
  6. <ImageView
  7. android:id="@+id/img"
  8. android:layout_width="wrap_content"
  9. android:layout_height="wrap_content"
  10. android:src="@drawable/ic_launcher"/>
  11. </LinearLayout>


活动代码


  1. package com.test.androidtest;
  2.  
  3. import android.app.Activity;
  4. import android.os.Bundle;
  5. import android.view.animation.Animation;
  6. import android.view.animation.AnimationUtils;
  7. import android.widget.ImageView;
  8.  
  9. public class AnimationActivity extends Activity {
  10. @Override
  11. protected void onCreate(Bundle savedInstanceState) {
  12. super.onCreate(savedInstanceState);
  13. setContentView(R.layout.activity_animation);
  14. //将动画xml绑定到视图
  15. ImageView img = (ImageView) findViewById(R.id.img);
  16. Animation anim_translate = AnimationUtils.loadAnimation(this, R.anim.anim_translate);
  17. img.startAnimation(anim_translate);
  18. }
  19. }


动画XML等价于下面的Java代码


  1. TranslateAnimation anim = new TranslateAnimation(
  2. TranslateAnimation.RELATIVE_TO_SELF, 0.0f,
  3. TranslateAnimation.RELATIVE_TO_SELF, 0.25f,
  4. TranslateAnimation.RELATIVE_TO_SELF, 0.0f,
  5. TranslateAnimation.RELATIVE_TO_SELF, 0.25f);
  6. anim.setDuration(5000);//持续5秒


运行测试

1111.png


      动画可以组成集合,让几个动画同时发生。下面是一个相同的例子,但是这一次与另一个改变视图透明度的动画组成一个集合:

动画XML


  1. <?xml version="1.0" encoding="utf-8"?>
  2. <set xmlns:android="http://schemas.android.com/apk/res/android">
  3. <translate
  4. android:duration = "5000"
  5. android:toYDelta="100%"
  6. android:toXDelta="100%" />
  7. <alpha
  8. android:duration="5000"
  9. android:fromAlpha="1.0"
  10. android:toAlpha="0.0" />
  11. </set>


      这个动画将会让视图移动到右下方,并同时逐渐淡化。在此例中,两个动画同时发生,但是这并不是必须的。你可以通过定义android:startOffset属性让它们顺序发生,或者部分重叠。以ms为单位设置这个值可以让动画等待这个时间间隔再发生。下面是一个同样的例子,不过这一次alpha动画会等到移动动画结束之后才开始:


  1. <?xml version="1.0" encoding="utf-8"?>
  2. <set xmlns:android="http://schemas.android.com/apk/res/android">
  3. <translate
  4. android:duration = "5000"
  5. android:toYDelta="100%"
  6. android:toXDelta="100%" />
  7. <alpha
  8. android:startOffset="5000"
  9. android:duration="5000"
  10. android:fromAlpha="1.0"
  11. android:toAlpha="0.0" />
  12. </set>


      你可以使用这个属性来让几个动画顺序发生。此外,你还可以嵌套动画来创建更加复杂的动画。查看Android文档以得到完整的动画选项列表。

标签: Android

Powered by emlog  蜀ICP备18021003号-1   sitemap

川公网安备 51019002001593号