视图动画包括:
透明度动画:AlphaAnimation
旋转动画:RotateAnimation
位移动画:TranslateAnimation
缩放动画:ScaleAnimation
视图动画执行后,它的点击事件还在动画执行前的地方,所以视图动画通常用来做没有交互的动画效果,因为他不需要考虑点击事件,往往效率比较高。而当我们需要在动画执行后要进行交互的时候就要用到属性动画了。
属性动画:ObjectAnimator
代码示例:
ObjectAnimator animator = ObjectAnimator.ofFloat(
view, //要加载动画的视图view
"translationX", //动画的类型
500); //平移的值
animator.setDuration(1000); //动画执行的时间
animator.start(); //开始执行动画
)
第二个参数是要操作的动画的类型,这个类型必须具有get/set方法,动画才能生效。
常用的可以直接使用的属性有:
rotation,rotationX,rotationY //旋转动画
scaleX,scaleY //缩放动画
pivotX,pivotY //控制view对象的支点的位置,围绕这个支点进行旋转和缩放,默认这个支点就是view的中心点
x,y //这个是动画终点的坐标值,是最初左上角坐标和translationX,translationY值的累计和
alpha //透明度,1为不透明,0为完全透明(这个时候就不可见了)
如果一个属性没有get,set方法,就需要我们手动的添加get,set方法。
示例代码:
private static class WrapperView{
private View mView;
public WrapperView(View view){
mView= view;
}
public int getWidth(){
return mView.getLayoutParams().width;
}
public int setWidth(int width){
mView.getLayoutParams().width = width;
mView.requestLayout();
}
}
通过以上代码就可以给属性外包装一层,手动添加get,set方法。
使用:
WrapperView wrapper = new WrapperView(mButton);
ObjectAnimation.ofInt(wrapper,”width”,500).setDuration(1000).start();
对于视图动画如果要同时执行可以使用AnimationSet
示例代码:
AnimationSet as = new AnimationSet(true);
as.setDuration(1000);
AlphaAnimation a = new AlphaAnimation(0, 1);
a.setDuration(1000);
RotateAnimation b = new RotateAnimation(0, 360, 100, 100);
b.setDuration(1000);
ScaleAnimation c = new ScaleAnimation(0, 2, 0, 2);
c.setDuration(1000);
TranslateAnimation d = new TranslateAnimation(0, 200, 0, 300);
d.setDuration(1000);
as.addAnimation(a);
as.addAnimation(b);
as.addAnimation(c);
as.addAnimation(d);
对于属性动画:
如果需要同时执行多种动画可以使用PropertyValuesHolder
代码示例:
PropertyValuesHolder pvh1 = PropertyValuesHolder.ofFloat("translationX",300f);
PropertyValuesHolder pvh2 = PropertyValuesHolder.ofFloat("scaleX",1f,0,1f);
PropertyValuesHolder pvh3 = PropertyValuesHolder.ofFloat("scaleY",1f,0,1f);
ObjectAnimator.ofPropertyValuesHolder(view, pvh1, pvh2, pvh3)
.setDuration(1000).start();
或者使用AnimatorSet,这个类不仅能实现PropertyValuesHolder那样的同时执行动画的效果,还能进行更加精确的顺序控制。
AnimatorSet的几个重要方法:
playTogether()
playSequentially()
animaSet.play().with()
before()
after()
代码示例:
ObjectAnimator animator1 = ObjectAnimator.ofFloat(view,"translationX",300f);
ObjectAnimator animator2 = ObjectAnimator.ofFloat(view,"scaleX",1f,0f,1f);
ObjectAnimator animator3 = ObjectAnimator.ofFloat(view,"scaleY",1f,0f,1f);
AnimatorSet set = new AnimatorSet();
set.setDuration(1000);
set.playTogether(animator1,animator2,animator3);
set.start();
也可以将动画定义在xml文件中:
<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="1000"
android:propertyName="scaleX"
android:valueFrom="1.0"
android:valueTo="2.0"
android:valueType="floatType">
</objectAnimator>
然后在代码中使用动画:
mImg_animator.animate()
.alpha(0)
.y(500)
.setDuration(1000)
.withStartAction(new Runnable() {
@Override
public void run() {
}
})
.withEndAction(new Runnable() {
@Override
public void run() {
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(AnimatorActivity.this, "动画执行完了",
Toast.LENGTH_SHORT).show();
}
});
}
})
.start();
效果图: