补间动画 :
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() {
@Override
public void onAnimationStart(Animator animation) {
}
@Override
public void onAnimationRepeat(Animator animation) {
}
@Override
public void onAnimationEnd(Animator animation) {
}
@Override
public 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();