Android Animations

	星期五下午不太适合上班,完全没有工作动力,加上这环境,太困了,谢谢blog提提神。前几天项目要求弄动画,这儿就总结一下吧

Android动画目前分为三类:

Tweened(补件动画)

效果:对View进行移动、缩放、旋转及透明度。

Frame(帧动画)

效果:在不同时间切换不同图片。

Property(属性动画)

效果:可以实现自由操作。


一、Tweened(补件动画)

创建动画,可以直接用java写,也可以在anim/**.xml中配置好,然后在用java加载xml创建。

Animation animation = AnimationUtils.loadAnimation(this,
				R.anim.tweened_alpha);
	view.startAnimation(animation);

下面是Tweened相关动画说明

1、Translate:移动相关属性及说明





2、scale:放大缩小





3、rotate:旋转






4、alpha:透明度





5、set:动画集




    

    

    

 


二、 Frame(帧动画)

帧动画相对比较简单,先找好需要的图片,然后在xml中配置,或者知己在java中添加即可。

Frame动画java代码

 	View anima=findViewbyId(R.id.animation);
	anima.setBackgroundResource(R.anim.frame_anim);
	AnimationDrawable frameAnimationDrawable = (AnimationDrawable) anima.getBackground();
	frameAnimationDrawable.setOneShot(false);// true:不循环,false:一直循环		
	frameAnimationDrawable.start();

1、anim/**.xml中配置信息



	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	

2、java代码实现

		AnimationDrawable frameAnimationDrawable = new AnimationDrawable();
		for (int j = 0; j < 24; j++) {
			int resourcesId = getResources().getIdentifier(
					j < 9 ? "k_0" + (j + 1) : "k_" + (j + 1),
					"drawable", this.getPackageName());//获取资源ID
			if (resourcesId != 0) {
				Drawable drableTemp = getResources().getDrawable(resourcesId);
				frameAnimationDrawable.addFrame(drableTemp, 100);//100该张图片显示时间
//				Log.i("Evil.Thief", "find resourcesId "+j);
			}else{
				Log.i("Evil.Thief", "not find resourcesId "+j);
			}
		}
		frameAnimationDrawable.setOneShot(true);//是否只执行一次,true只执行一次,false一直重复执行
		view.setBackgroundDrawable(frameAnimationDrawable);
		frameAnimationDrawable.start();



三、Property(属性动画)

属性动画,ObjectAnimator和ValueAnimator

1、ObjectAnimator相对来说比较简单,(但有的复杂动画不好实现)

		view.setPivotX(view.getWidth());//view是动画效果,该处设置的是view最右边为X的旋转中心。Y轴同理
		/**单个动画实现*/
		ObjectAnimator objectAnimator = ObjectAnimator.ofFloat(view,
				"rotationY", 0.0F, 360.0F); // view围绕Y轴旋转360度,旋转中心由view.setPrivotX决定,默认为view中心点
		/**自定义属性修改*/
		objectAnimator.addUpdateListener(new AnimatorUpdateListener() {

			@Override
			public void onAnimationUpdate(ValueAnimator animation) {
				// TODO 自定义修改view属性
				float value = (Float) animation.getAnimatedValue();
				//做你想做的事
			}
		});
		objectAnimator.setDuration(5000).start();

		/**多个动画(动画集)实现*/
		PropertyValuesHolder pvhX = PropertyValuesHolder.ofFloat("alpha", 1f,
				0f);// 不透明到透明,"alpha" 是通过反射机制实现
		PropertyValuesHolder pvhY = PropertyValuesHolder.ofFloat("scaleX", 1f,
				0, 1f);// X缩小后再放在
		PropertyValuesHolder pvhZ = PropertyValuesHolder.ofFloat("scaleY", 1f,
				0, 1f);// Y缩小后再放大
		ObjectAnimator.ofPropertyValuesHolder(view, pvhX, pvhY, pvhZ)
				.setDuration(5000).start();

2、ValueAnimator动画其实个人认为最好用,如果你对动画不太熟悉可以能也是最难用的,它其实也不是动画,它只提供动画相关变化值,动画还需要你自己写。

		ValueAnimator valueAnimator = ValueAnimator.ofFloat(0, 1);
		valueAnimator.addUpdateListener(new AnimatorUpdateListener() {

			@Override
			public void onAnimationUpdate(ValueAnimator animation) {
				// TODO Auto-generated method stub
				int translationWidth = -view.getWidth()
						+ ((View) view.getParent()).getWidth();
				Float baseValue = (Float) animation.getAnimatedValue();
				float translationX = translationWidth * baseValue;

				if (translationX >= translationWidth * 0.7) {
					float k = 0.7f;
					float r = (baseValue - k);// 0-0.3
												// 0-1
					float m = 1 - (r * 1.5f);

					view.setScaleX(m);
					view.setScaleY(m);
					view.setAlpha(m);
				}
				view.setTranslationX(translationX);
			}
		});
		valueAnimator.setDuration(5000);
		valueAnimator.start();
多个属性操作

		/**多个动画(动画集)实现*/
		PropertyValuesHolder pvhX = PropertyValuesHolder.ofFloat("alpha", 1f,
				0f);// 不透明到透明,"alpha" 是通过反射机制实现
		PropertyValuesHolder pvhY = PropertyValuesHolder.ofFloat("scaleX", 1f,
				0, 1f);// X缩小后再放在
		PropertyValuesHolder pvhZ = PropertyValuesHolder.ofFloat("scaleY", 1f,
				0, 1f);// Y缩小后再放大
		ObjectAnimator.ofPropertyValuesHolder(view, pvhX, pvhY, pvhZ)
				.setDuration(5000).start();

3、AnimatorSet:动画集

		// 右一动
		ObjectAnimator animTranslate = ObjectAnimator
				.ofFloat(view, "x", 0, 600);
		animTranslate.setDuration(5000);
		// 缩小
		ObjectAnimator animScaleX = ObjectAnimator.ofFloat(view, "scaleX", 1f,
				0.5f);
		animScaleX.setDuration(2000);
		ObjectAnimator animScaleY = ObjectAnimator.ofFloat(view, "scaleY", 1f,
				0.5f);
		animScaleY.setDuration(2000);
		// 透明度
		ObjectAnimator animApha = ObjectAnimator.ofFloat(view, "alpha", 1f,
				0.5f);
		animApha.setDuration(2000);
		// Set
		AnimatorSet animSet = new AnimatorSet();
		animSet.play(animTranslate);
		animSet.play(animScaleX).after(3000);
		animSet.play(animScaleY).after(3000);
		animSet.play(animApha).after(3000);
		// animSet.play(animTranslate2).after(animTranslate);
		animSet.setDuration(000);
		animSet.start();


你可能感兴趣的:(Android-动画)