且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

Android Property Animation属性动画集:AnimatorSet(5)

更新时间:2022-08-16 14:12:41



Android Property Animation属性动画集:AnimatorSet(5)

在之前我写的附录文章1,2,3,4中,分片段介绍了几种常见的Android属性动画代码实现写法,那是一种把几种关键动画打散分解实现。但实际的开发中,往往是一个动画过程中要同时或者讲求顺序的执行一组(一系列)的动画集,所谓动画集,假设,我需要实现一个动画,但是动画执行的过程比较复杂多变,比如一个Android TextView,我需要该TextView先水平位移若干距离(translation);然后渐变透明(alpha),在渐变透明的同时该TextView还将选择一定的角度(rotation);最后执行缩放动画(scale)。
要实现上述动画,单单某个动画就无法完成,至此需要引入AnimatorSet动画集,AnimatorSet将上述各个动画片段作为一个子集加入到自己的集合中,按照一定的逻辑执行。
AnimatorSet比较关键的控制函数:
with(Animator anim):现有动画和参数中的动画anim同时执行,此方法实现同时执行若干动画。
after(Animator anim):现有动画在传入的参数(动画anim之后)执行,换句话说传入的参数anim将排序在现在动画之前执行。
after(long delay):现有动画延迟delay毫秒后执行。
before(Animator anim):现有播放的动画将在anim之前执行,换句话说,传入的参数anim是随后将得到执行的动画。
我写一个代码例子加以说:

package zhangphil.anim;

import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
import android.animation.AnimatorSet;
import android.animation.ObjectAnimator;
import android.animation.ValueAnimator;
import android.animation.ValueAnimator.AnimatorUpdateListener;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.TextView;

public class MainActivity extends Activity {

	private TextView text;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

		text = (TextView) findViewById(R.id.text);
	}

	// 动画实际执行
	private void startPropertyAnim() {
		// 透明渐变动画:完全不透明 -> 完全透明 -> 完全不透明
		ObjectAnimator anim1_alpha = ObjectAnimator.ofFloat(text, "alpha", 1f, 0f, 1f);

		// 旋转动画:旋转360度
		ObjectAnimator anim2_rotation = ObjectAnimator.ofFloat(text, "rotation", 0f, 360f);

		float translationX = text.getTranslationX();
		// 位移动画:水平左移然后复位
		ObjectAnimator anim3_translationX = ObjectAnimator.ofFloat(text, "translationX", translationX, -500f,
				translationX);

		// 缩放动画:原大小 -> 放大5倍 -> 复原
		ObjectAnimator anim4_scaleY = ObjectAnimator.ofFloat(text, "scaleY", 1f, 5f, 1f);

		AnimatorSet animSet = new AnimatorSet();

		// 动画持续时间为10秒
		animSet.setDuration(10000);

		// 动画执行的监听回调事件
		animSet.addListener(new AnimatorListenerAdapter() {
			@Override
			public void onAnimationEnd(Animator animation) {
				// 动画结束
			}

			@Override
			public void onAnimationStart(Animator animation) {
				// 动画开始
			}
		});

		// 注意播放的顺序!动画一旦开始,
		// 第1先执行的是anim3_translationX
		// 第2顺序执行的是anim1_alpha和anim2_rotation。anim1_alpha和anim2_rotation将同时执行。
		// 最后执行的是anim4_scaleY
		animSet.play(anim1_alpha).with(anim2_rotation).before(anim4_scaleY).after(anim3_translationX);

		// 正式启动动画集
		animSet.start();
	}

	@Override
	public boolean onOptionsItemSelected(MenuItem item) {
		int id = item.getItemId();
		if (id == R.id.action_anim) {

			// 此处正式启动属性动画
			startPropertyAnim();

			return true;
		}
		return super.onOptionsItemSelected(item);
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		getMenuInflater().inflate(R.menu.main, menu);
		return true;
	}
}


附录文章:
1,《Android Property Animation属性动画初识:透明渐变(1)》链接地址:http://blog.csdn.net/zhangphil/article/details/50484224  
2,《Android Property Animation属性动画:rotation旋转(2)》链接地址:http://blog.csdn.net/zhangphil/article/details/50495555 
3,《Android Property Animation属性动画初识:位移translation(3)》链接地址:http://blog.csdn.net/zhangphil/article/details/50495844
4,《Android Property Animation属性动画:scale缩放动画(4)》链接地址:http://blog.csdn.net/zhangphil/article/details/50497404