属性动画

来源:互联网 发布:apache配置虚拟域名 编辑:程序博客网 时间:2024/06/05 21:18

属性动画(property animation)

为什么要使用属性动画(补间动画的缺陷)?

    1.补间动画是只能够作用在View上。也就是说,我们可以对一个Button、TextView、甚至是LinearLayout、或者其它任何继承自View的组件进行动画操作,但是如果我们想要对一个非View的对象进行动画操作,抱歉,补间动画就帮不上忙了。可能有的朋友会感到不能理解,我怎么会需要对一个非View的对象进行动画操作呢?这里我举一个简单的例子,比如说我们有一个自定义的View,在这个View当中有一个Point对象用于管理坐标,然后在onDraw()方法当中就是根据这个Point对象的坐标值来进行绘制的。也就是说,如果我们可以对Point对象进行动画操作,那么整个自定义View的动画效果就有了。显然,补间动画是不具备这个功能的,这是它的第一个缺陷。    2.然后补间动画还有一个缺陷,就是它只能够实现移动、缩放、旋转和淡入淡出这四种动画操作,那如果我们希望可以对View的背景色进行动态地改变呢?很遗憾,我们只能靠自己去实现了。说白了,之前的补间动画机制就是使用硬编码的方式来完成的,功能限定死就是这些,基本上没有任何扩展性可言。    3.最后,补间动画还有一个致命的缺陷,就是它只是改变了View的显示效果而已,而不会真正去改变View的属性。什么意思呢?比如说,现在屏幕的左上角有一个按钮,然后我们通过补间动画将它移动到了屏幕的右下角,现在你可以去尝试点击一下这个按钮,点击事件是绝对不会触发的,因为实际上这个按钮还是停留在屏幕的左上角,只不过补间动画将这个按钮绘制到了屏幕的右下角而已。

如何使用属性动画?

//1.无实际动画效果ValueAnimator anim = ValueAnimator.ofFloat(0f, 1f);  anim.setDuration(300);  anim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {      @Override      public void onAnimationUpdate(ValueAnimator animation) {          float currentValue = (float) animation.getAnimatedValue();          Log.d("TAG", "cuurent value is " + currentValue);      }  });  anim.start();   //XML的实现-------------------<animator xmlns:android="http://schemas.android.com/apk/res/android"      android:valueFrom="0"      android:valueTo="100"      android:valueType="intType"/>  //2.闪烁ObjectAnimator animator = ObjectAnimator.ofFloat(textview, "alpha", 1f, 0f, 1f);      animator.setDuration(5000);      animator.start(); //XML的实现--------------------------<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"      android:valueFrom="1"      android:valueTo="0"      android:valueType="floatType"      android:propertyName="alpha"/>   //3.旋转ObjectAnimator animator = ObjectAnimator.ofFloat(textview, "rotation", 0f, 360f);  //4.移出移回float curTranslationX = textview.getTranslationX();  ObjectAnimator animator = ObjectAnimator.ofFloat(textview, "translationX", curTranslationX, -500f, curTranslationX);  //5.Y轴缩放ObjectAnimator animator = ObjectAnimator.ofFloat(textview, "scaleY", 1f, 3f, 1f);

属性动画的底层原理

    1.textview对象中没有有alpha属性这个值,不仅textview没有这个属性,连它所有的父类也是没有这个属性的!    2.ObjectAnimator内部的工作机制并不是直接对我们传入的属性名进行操作的,而是会去寻找这个属性名对应的get和set方法,因此alpha属性所对应的get和set方法应该就是:    public void setAlpha(float value);      public float getAlpha();    3.那么textview对象中是否有这两个方法呢?确实有,并且这两个方法是由View对象提供的,也就是说不仅TextView可以使用这个属性来进行淡入淡出动画操作,任何继承自View的对象都可以的。

组合动画实例
实现组合动画功能主要需要借助AnimatorSet这个类,这个类提供了一个play()方法,如果我们向这个方法中传入一个Animator对象(ValueAnimator或ObjectAnimator)将会返回一个AnimatorSet.Builder的实例,AnimatorSet.Builder中包括以下四个方法:

after(Animator anim)   将现有动画插入到传入的动画之后执行after(long delay)   将现有动画延迟指定毫秒后执行before(Animator anim)   将现有动画插入到传入的动画之前执行with(Animator anim)   将现有动画和传入的动画同时执行

//1.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();//XML的实现-----------------------<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>Animator animator = AnimatorInflater.loadAnimator(context, R.animator.anim_file);  animator.setTarget(view);  animator.start();//添加一个监听器的代码如下所示: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) {}  }); //这个类就可以解决掉上面实现接口繁琐的问题anim.addListener(new AnimatorListenerAdapter() {    //一般建议重写监听结束方法    @Override      public void onAnimationEnd(Animator animation) {}    });  
0 0
原创粉丝点击