创建视图动画

作者:追风剑情 发布于: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


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


活动xml


<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >
    
	<ImageView 
	    android:id="@+id/img"
	    android:layout_width="wrap_content"
	    android:layout_height="wrap_content"
	    android:src="@drawable/ic_launcher"/>
</LinearLayout>


活动代码


package com.test.androidtest;

import android.app.Activity;
import android.os.Bundle;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.widget.ImageView;

public class AnimationActivity extends Activity {
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_animation);
		
		//将动画xml绑定到视图
		ImageView img = (ImageView) findViewById(R.id.img);
		Animation anim_translate = AnimationUtils.loadAnimation(this, R.anim.anim_translate);
		img.startAnimation(anim_translate);
	}
}


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


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


运行测试

1111.png


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

动画XML


<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate 
        android:duration = "5000"
    	android:toYDelta="100%"
    	android:toXDelta="100%" />
    
    <alpha 
        android:duration="5000"
        android:fromAlpha="1.0"
        android:toAlpha="0.0" />
</set>


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


<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate 
        android:duration = "5000"
    	android:toYDelta="100%"
    	android:toXDelta="100%" />
    
    <alpha 
        android:startOffset="5000"
        android:duration="5000"
        android:fromAlpha="1.0"
        android:toAlpha="0.0" />
</set>


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

标签: Android

Powered by emlog  蜀ICP备18021003号-1   sitemap

川公网安备 51019002001593号