android动画二·动画之间的关系


动画—属性动画

ValueAnimator

ValueAnimator是整个属性动画机制当中最核心的一个类,实际开发中不常用,ValueAnimator中ofFloat(),ofInt(),ofObject()这三个方法常用

  • ValueAnimator只是对值进行了一个平滑的动画过渡
		ValueAnimator anim = ValueAnimator.ofFloat(0f, 20f);
		anim.setDuration(1000);  
		anim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {  
		   	@Override  
		    public void onAnimationUpdate(ValueAnimator animation) {  
		        float currentValue = (float) animation.getAnimatedValue();  
		    }  
		});  
		anim.start();  
		
		ValueAnimator anim = ValueAnimator.ofInt(0, 10);  
		anim.setDuration(1000);  
		anim.start();  

ObjectAnimator

不过虽说ObjectAnimator会更加常用一些,但是它其实是继承自ValueAnimator的,底层的动画实现机制也是基于ValueAnimator来完成的,因此ValueAnimator仍然是整个属性动画当中最核心的一个类。

  • ObjectAnimator对任意对象的任意属性进行动画的操作,“translationX”、“scaleY”、“alpha”、“rotation”
		float curTranslationX = textview.getTranslationX();  
		ObjectAnimator animator = ObjectAnimator.ofFloat(textview, "translationX", curTranslationX, -300f, curTranslationX);  
		animator.setDuration(5000);  
		animator.start();  

View当中一定也存在着setRotation()、getRotation()、setTranslationX()、getTranslationX()、setScaleY()、getScaleY()这些方法

  • AnimatorSet组合动画

AnimatorSet.Builder中包括以下四个方法:
after(Animator anim) 将现有动画插入到传入的动画之后执行
after(long delay) 将现有动画延迟指定毫秒后执行
before(Animator anim) 将现有动画插入到传入的动画之前执行
with(Animator anim) 将现有动画和传入的动画同时执行

		ObjectAnimator moveIn = ObjectAnimator.ofFloat(textview, "translationX", -500f, 0f);  
		ObjectAnimator rotate = ObjectAnimator.ofFloat(textview, "rotation", 0f, 360f);  
		ObjectAnimator fadeInOut = ObjectAnimator.ofFloat(textview, "alpha", 1f, 0f, 1f);  
		AnimatorSet animSet = new AnimatorSet();  
		animSet.play(rotate).with(fadeInOut).after(moveIn);  
		animSet.setDuration(5000);  
		animSet.start();
  • Animator监听器

ObjectAnimator是继承自ValueAnimator的,而ValueAnimator又是继承自Animator的,因此不管是ValueAnimator还是ObjectAnimator都是可以使用addListener()这个方法的。另外AnimatorSet也是继承自Animator的,因此addListener()这个方法算是个通用的方法。

		anim.addListener(new AnimatorListener() {  
		    @Override  
		    public void onAnimationStart(Animator animation) {  
		    }  
		  
		    @Override  
		    public void onAnimationRepeat(Animator animation) {  
		    }  
		  
		    @Override  
		    public void onAnimationEnd(Animator animation) {  
		    }  
		  
		    @Override  
		    public void onAnimationCancel(Animator animation) {  
		    }  
		});  

为了方便,android提供了一个适配类,叫AnimatorListenerAdapter,使用这个类可以解决实现接口繁琐问题。

		anim.addListener(new AnimatorListenerAdapter() {  
		    @Override  
		    public void onAnimationEnd(Animator animation) {  
		    }  
		});  

使用XML编写动画

通过XML来编写动画可能会比通过代码来编写动画要慢一些,但是在重用方面将会变得非常轻松,比如某个将通用的动画编写到XML里面,我们就可以在各个界面当中轻松去重用它。

  • 如果想要使用XML来编写动画,首先要在res目录下面新建一个animator文件夹,所有属性动画的XML文件都应该存放在这个文件夹当中。然后在XML文件中我们一共可以使用如下三种标签:

    • 对应代码中的ValueAnimator
    • 对应代码中的ObjectAnimator
    • 对应代码中的AnimatorSet

讲一个视图从0过渡到100,就可以这样写:

	<animator xmlns:android="http://schemas.android.com/apk/res/android"  
	    android:valueFrom="0"  
	    android:valueTo="100"  
	    android:valueType="intType"/>  					

将一个视图的alpha属性从1变成0,就可以这样写:

	<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"  
	    android:valueFrom="1"  
	    android:valueTo="0"  
	    android:valueType="floatType"  
	    android:propertyName="alpha"/>   

将一个视图先从屏幕外移动进屏幕,然后开始旋转360度,旋转的同时进行淡入淡出操作,就可以这样写:

	<set xmlns:android="http://schemas.android.com/apk/res/android"  
	    android:ordering="sequentially" >  
	  
	    <objectAnimator  
	        android:duration="2000"  
	        android:propertyName="translationX"  
	        android:valueFrom="-500"  
	        android:valueTo="0"  
	        android:valueType="floatType" >  
	    </objectAnimator>  
	  
	    <set android:ordering="together" >  
	        <objectAnimator  
	            android:duration="3000"  
	            android:propertyName="rotation"  
	            android:valueFrom="0"  
	            android:valueTo="360"  
	            android:valueType="floatType" >  
	        </objectAnimator>  
	  
	        <set android:ordering="sequentially" >  
	            <objectAnimator  
	                android:duration="1500"  
	                android:propertyName="alpha"  
	                android:valueFrom="1"  
	                android:valueTo="0"  
	                android:valueType="floatType" >  
	            </objectAnimator>  
	            <objectAnimator  
	                android:duration="1500"  
	                android:propertyName="alpha"  
	                android:valueFrom="0"  
	                android:valueTo="1"  
	                android:valueType="floatType" >  
	            </objectAnimator>  
	        </set>  
	    </set>  
	  
	</set>  

最后XML文件是编写好了,在代码中把文件加载动画只需调用如下代码即可:

	Animator animator = AnimatorInflater.loadAnimator(context, R.animator.anim_file);  
	animator.setTarget(view);  
	animator.start();  

参考:[http://blog.csdn.net/guolin_blog/article/details/43536355]


猜你喜欢

转载自blog.csdn.net/AliEnCheng/article/details/82836073