Android -animation-Property Animation

          android 的属性动画有几种:View Animation,Property Animation,Drawable Animation。

 因为View Animation的太过简单,只能提供:缩放,平移,旋转,透明度的改变。有一定的局限性(比如如果要实现颜色改变,3d

旋转)。Property Animation  应运而生正好弥补了这一缺憾。它的功能更为强大!

         Property Animation  表示的是动态的改变对象的属性,来达到动画的效果。


  要使用Property Animation必须用到下面几个类:

       ObjectAnimator, 动画执行类。封装一个view的一个动画动作。

      ValueAnimator  动画执行类。封装value的变化。(通过addAnimationListener(AnimationListener   l))来完成动画的效果。

      AnimtorSet    用于控制一组动画的执行,线性、一起、每个动画的先后执行。

      AnimatorInflater   用户加载属性动画 的xml文件。

      TimeInterpalater   定义了动画的变化率。


下面我一个一个介绍:

    一,ObjectAnimator

    1,先看一个简单的应用

  ObjectAnimator.ofFloat(iv_aa,"rotationX",0.0f,360f)//
				.setDuration(2000)//
				.start();
    ObjectAnimator提供了ofFloat,ofInt,ofObject等方法来设置,动画作用对象(View),属性名(rotationX),初始值,结束值,

一系列的中间值!

    对于属性的值,如果只有一个属性值,则默认对象当前的属性值为初始值,设置的属性值为结束值;如果有两个属性值,则第一

个为初始值,最后一个为结束值。

    其实在整个动画的过程中,实际是不断地利用get,set方法改变其属性值,从而达到动画的效果。所以对于该属性(rotationX),

必须有get,set方法。


    2,上面的动画只是实现了一个动画效果。就是以X轴为中心旋转。如果要变选装变缩放呢?

有人可能第一个想到的是AnimatorSet类。很好,说明你可能有比较熟悉Drawable Animation因为,Drawable Animation中set可以

实现多种动画,一起执行的小效果。但是这里我们用ObjectAnimator+AnimtorUpdateListener;

       ObjectAnimator oAnimator=ObjectAnimator
				.ofFloat(iv_aa, "wang", 1.0f,0.0f,1.0f)
				.setDuration(3000);//
		oAnimator.setRepeatCount(ObjectAnimator.INFINITE);
		oAnimator.start();
		oAnimator.addUpdateListener(new AnimatorUpdateListener() {
					
			@Override
			public void onAnimationUpdate(ValueAnimator animation) {
				float val=(Float) animation.getAnimatedValue();
				iv_aa.setRotationX(val*360);
				iv_aa.setScaleX(val);
				iv_aa.setScaleY(val);
			}
		});

这里我用了一个不存在的属性“wang”,然后设定它的属性值。核心在后面,我们利用AnimatorUpdateListener监听器属性的

改变,然后手动的改变它其他多个属性的值。就达到了多种动画的效果。


      3,ObjectAnimator还有一种用法。同样的效果。

  

		PropertyValuesHolder rotationX
				         =PropertyValuesHolder.ofFloat("rotationX", 360.0f,0.0f,360.0f);
		PropertyValuesHolder scaleX
		                 =PropertyValuesHolder.ofFloat("scaleX", 1.0f,0.0f,1.0f);
		PropertyValuesHolder scaleY
		                 =PropertyValuesHolder.ofFloat("scaleY", 1.0f,0.0f,1.0f);
		ObjectAnimator.ofPropertyValuesHolder(iv_aa,rotationX,scaleX,scaleY)
				.setDuration(3000).start();
 

二,ValueAnimator的使用

    1,同样是上面的效果:

	ValueAnimator vAnimator
	                 =ValueAnimator.ofFloat(1.0f,0.0f,1.0f)
				       .setDuration(3000);
	         Animator.addUpdateListener(new AnimatorUpdateListener() {
					
			@Override
			public void onAnimationUpdate(ValueAnimator animation) {
				float val=(Float) animation.getAnimatedValue();
				iv_aa.setRotationX(val*360);
				iv_aa.setScaleX(val);
				iv_aa.setScaleY(val);
			}
		});
		vAnimator.start();


这一段代码与ObjectAnimator的2,中的代码是不是有点神似。没错其实就是少了iv_aa,"wang",其他都一样,所以我们就可以知道

ValueAnimator表示的仅仅是值得改变,属性的变化都是在AnimatorUpdateListener中改变的。

     2,ValueAnimator,重写TypeValue

              ValueAnimator vAnim=new ValueAnimator();
			vAnim.setInterpolator(new LinearInterpolator());
			vAnim.setObjectValues(new PointF(0, 0));
			vAnim.setDuration(3000);
			vAnim.setEvaluator(new TypeEvaluator<PointF>() {

				@Override
				public PointF evaluate(float fraction, PointF startValue, PointF endValue) {
					Log.i("wangsongbin",""+fraction);//fraction:0~1;
					Screen screen=null;
					screen=UtilScreen.getWindowScreenPix(DrawableAnimActivity.this);
					PointF pointf=new PointF();
					pointf.x=fraction*screen.width;
					pointf.y=fraction*fraction*screen.height;
					return pointf;
				}
			});
			vAnim.addUpdateListener(new AnimatorUpdateListener() {
					
				@Override
				public void onAnimationUpdate(ValueAnimator animation) {
					PointF pf=(PointF) animation.getAnimatedValue();
					iv_aa.setX(pf.x);
					iv_aa.setY(pf.y);
			        }
			});
			vAnim.start();


三,AnimatorSet,

先看一段代码:

                ObjectAnimator oAnimator1=ObjectAnimator.ofFloat(iv_aa, "scaleX", 1.0f,0.0f,1.0f).setDuration(2000);
		ObjectAnimator oAnimator2=ObjectAnimator.ofFloat(iv_aa, "scaleY", 1.0f,0.0f,1.0f).setDuration(2000);
		ObjectAnimator oAnimator3=ObjectAnimator.ofFloat(iv_aa, "rotationX", 360.0f,0.0f,360.0f).setDuration(2000);
				
			AnimatorSet animSet=new AnimatorSet();
			animSet.play(oAnimator1).with(oAnimator2);
			animSet.play(oAnimator3).after(oAnimator1);
			animSet.start();

相信结合了上面的代码,大家能更直观的了解AnimatorSet的作用,AnimatorSet用于

管理多个动画的执行先后顺序!



四,property Animation(属性动画)的xml方式定义:res/animtor/set.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:ordering="together">//表示一起执行,sequentially,表示顺序执行
    
   <objectAnimator 
          android:propertyName="scaleX"
          android:interpolator="@android:anim/linear_interpolator"
          android:duration="2000"
          android:valueFrom="0.0"
          android:valueTo="1.0"
          android:valueType="floatType">
   </objectAnimator>
   
   <objectAnimator 
          android:propertyName="scaleY"
          android:interpolator="@android:anim/linear_interpolator"
          android:duration="2000"
          android:valueFrom="0.0"
          android:valueTo="1.0"
          android:valueType="floatType">
   </objectAnimator>
   
</set>

利用xml定义的属性动画,要利用AnimatorInflater.loadAnimator(..)方法加载,就像Drawable Animation要用AnimationUtil加载一样。

如下:

      AnimatorSet animSet=(AnimatorSet) AnimatorInflater
					.loadAnimator(DrawableAnimActivity.this, R.animator.set);
			animSet.setTarget(iv_aa);
			animSet.start();

五,LayoutTransition(布局动画)

表示当视图图层的位置发生改变时的过渡动画。

gridLayout=new GridLayout(this);
		gridLayout.setColumnCount(5);
		LayoutTransition lt=new LayoutTransition();
		//ObjectAnimator alpha=ObjectAnimator.ofFloat(target, propertyName, values)
		lt.setAnimator(LayoutTransition.APPEARING, ObjectAnimator.ofFloat(null, "alpha", 0.0f,1.0f));
		lt.setAnimator(LayoutTransition.CHANGE_APPEARING, lt.getAnimator(LayoutTransition.CHANGE_APPEARING));
		lt.setAnimator(LayoutTransition.DISAPPEARING, lt.getAnimator(LayoutTransition.DISAPPEARING));
		lt.setAnimator(LayoutTransition.CHANGE_DISAPPEARING, lt.getAnimator(LayoutTransition.CHANGE_DISAPPEARING));
		gridLayout.setLayoutTransition(lt);
		rl.addView(gridLayout);

如上所示,上面有四种状态:
LayoutTransition.APPEARING  view出现时自身的动画
<pre name="code" class="java">LayoutTransition.CHANGE_APPEARING   view出现时,其他视图的动画
LayoutTransition.DISAPPEARING   view消失时,自身的动画
<pre name="code" class="java">LayoutTransition.CHANGE_DISAPPEARING  view消失时,其他视图的动画

 
 

动画你可以用自定义的:ObjectAnimator.ofFloat(null, "alpha", 0.0f,1.0f)

也可以用系统自带的动画:lt.getAnimator(LayoutTransition.CHANGE_APPEARING);





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值