属性动画

来源:互联网 发布:淘宝眼镜店推荐知乎 编辑:程序博客网 时间:2024/06/06 19:44

补间动画 :

   1.只作用于View,不能作用于对象    比如:在这个View当中有一个Point对象用于管理坐标,然后在onDraw()方法当中就是根据这个Point对象的坐标值来进行绘制的。也就是说,如果我们可以对Point对象进行动画操作,那么整个自定义View的动画效果就有了。显然,补间动画是不具备这个功能的,这是它的第一个缺陷

  2.就是它只能够实现移动、缩放、旋转和淡入淡出这四种动画操作,都是硬编码,拓展性差。(改变背景色就不可以)

  3.就是它只是改变了View的显示效果而已,而不会真正去改变View的属性:比如按钮的位置改变,但是点击事件的位置不能改变

属性动画: 无限制,在对象也可以。扩展性强


ValueAnimator

  1.我们只需要将初始值和结束值提供给ValueAnimator,并且告诉它动画所需运行的时长,那么ValueAnimator就会自动帮我们完成从初始值平滑地过渡到结束值这样的效果。

                                除此之外,ValueAnimator还负责管理动画的播放次数、播放模式、以及对动画  设置监听器等,确实是一个非常重要的类。

      在监听中对view绑定设置

  例子:

ValueAnimator anim = ValueAnimator.<span>ofFloat(<span></span><span class="number">0</span><span>.0F, </span><span class="number">360</span><span>.0F)</span><span class="comment">//</span><span> </span></span>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);        view.setTranslationY((Float) animation.getAnimatedValue()); }});anim.start();

  也可以用ofInte()这个方法针对int,还有ofObject();在下边说

  除了anim.start();调用setStartDelay()方法来设置动画延迟播放的时间,调用setRepeatCount()和setRepeatMode()方法来设置动画循环播放的次数以及循环播放的模式,循环模式包括ObjectAnimator.RESTART和ObjectAnimator.REVERSE两种,分别表示重新播放和倒序播放的意思。

ObjectAnimator

 

ObjectAnimator animator = ObjectAnimator.ofFloat(textview, "alpha", 1f, 0f, 1f);animator.setDuration(5000);animator.start();

组合动画AnimatorSet

多个集合在一起

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();

实现动画的监听:注意 是动画执行的监听

addListener
,而不是执行属性的监听
addUpdateListener

anim.addListener(new AnimatorListener() {@Overridepublic void onAnimationStart(Animator animation) {}@Overridepublic void onAnimationRepeat(Animator animation) {}@Overridepublic void onAnimationEnd(Animator animation) {}@Overridepublic void onAnimationCancel(Animator animation) {}});
如果不想监听那么多 可以用adapter 用哪个 写那个就可以了,不写也不报错

anim.addListener(new AnimatorListenerAdapter() {});
在xml中实现属性动画    新建一个animator文件夹

  • <animator> 对应代码中的ValueAnimator
  • <objectAnimator> 对应代码中的ObjectAnimator
  • <set> 对应代码中的AnimatorSet
<animator xmlns:android="http://schemas.android.com/apk/res/android"    android:valueFrom="0"    android:valueTo="100"    android:valueType="intType"/>


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

<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>

在java中引用的代码

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



0 0