视图动画包括:

透明度动画: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();

效果图:

Android 取消界面切换的默认动画方法_视图动画

Android 取消界面切换的默认动画方法_视图动画_02