Android Animation、ObjectAnimator与ValueAnimator实现视图动画和属性动画

一、视图动画

视图动画比较简单,它提供了AlphaAnimation、RotateAnimation、TranslateAnimation、ScaleAnimation四种动画方式。

视图动画一个非常大的缺陷就是不具有交互性,当一个View发生视图动画后,其相应事件的位置依然在显示动画前的位置。但是优点也非常明显,即效率比较高且使用方便。

1、透明度动画

AlphaAnimation aa = new AlphaAnimation(0f, 1f);
aa.setDuration(1000);
view.startAnimation(aa);

2、旋转动画

RotateAnimation ra = new RotateAnimation(0f, 359f//旋转的角度,负值代表逆时针的
                , Animation.RELATIVE_TO_SELF, 0.5f//自己的X中心
                , Animation.RELATIVE_TO_SELF, 0.5f);//自己的Y中心
ra.setDuration(1000);
view.startAnimation(ra);

3、缩放动画

ScaleAnimation sa = new ScaleAnimation(0f, 2f, 0f, 2f//0倍到2倍
                , Animation.RELATIVE_TO_SELF, 0.5f//中心缩放
                , Animation.RELATIVE_TO_SELF, 0.5f);
sa.setDuration(1000);
view.startAnimation(sa);

4、位移动画

TranslateAnimation ta = new TranslateAnimation(0f, 200f, 0f, 400f);
ta.setDuration(1000);
view.startAnimation(ta);



效果展示
Android Animation、ObjectAnimator与ValueAnimator实现视图动画和属性动画_第1张图片


5、动画集合

AnimationSet as = new AnimationSet(true);
as.setDuration(1000);
//从完全透明到完全不透明
AlphaAnimation aa = new AlphaAnimation(0f, 1f);
aa.setDuration(1000);
as.addAnimation(aa);
//从0到原大小的缩放(放大)效果
ScaleAnimation sa = new ScaleAnimation(0f, 1f, 0f, 1f//
                , Animation.RELATIVE_TO_SELF, 0.5f//
                , Animation.RELATIVE_TO_SELF, 0.5f);
sa.setDuration(1000);
as.addAnimation(sa);

view.startAnimation(as);


6、加载布局中动画

Animation anim = AnimationUtils.loadAnimation(mContext, R.anim.scale_animation);
view.startAnimation(anim);


7、动画的监听事件

监听动画的开始、重复和结束

animation.setAnimationListener(new AnimationListener() {

    @Override
    public void onAnimationStart(Animation animation) {
    }

    @Override
    public void onAnimationRepeat(Animation animation) {
    }

    @Override
    public void onAnimationEnd(Animation animation) {
    }
});


8、实现不间断旋转

RotateAnimation ra = new RotateAnimation(0f, 359f//
                , Animation.RELATIVE_TO_SELF, 0.5f//
                , Animation.RELATIVE_TO_SELF, 0.5f);
ra.setDuration(400);
ra.setInterpolator(new LinearInterpolator());//匀速变化
ra.setRepeatCount(-1);//无限重复
view.startAnimation(ra);



二、属性动画

1、ObjectAnimator

由于Android3.0之前的动画框架Animation存在一些局限——动画改变的只是显示的内容,并不能响应事件。因此,Android3.0之后,Google提出了属性动画这样一个动画框架,帮助开发者实现更加丰富的动画效果。

而在Animator框架中使用最多的是AnimatorSet和ObjectAnimator配和,使用ObjectAnimator进行更精细化的控制,只控制对象的一个属性值,而使用多个ObjectAnimator组合到AnimatorSet形成一个动画。

示例:

ObjectAnimator animator= ObjectAnimator.ofFloat(button, "translationX", 0, 200);
animator.setDuration(1000);
animator.start();

效果:
Android Animation、ObjectAnimator与ValueAnimator实现视图动画和属性动画_第2张图片

与视图动画一样,也可以给属性动画设置时长插值器等属性,这些参数与在视图动画中的设置方法类似。
但是,在设置ObjectAnimator的时候,有一点非常重要,那就是要操纵的属性必须有get、set方法,不然ObjectAnimator就无法起效。下面就是一些常用的可以使用的动画的属性值:

  • translationX,translationY:这两个属性作为一种增量来控制View对象布局的左上角坐标偏移的位置。
  • rotation, rotationX,rotationY:这三个属性控制View对象围绕他的支点进行2D,3D旋转。
  • scaleX,scaleY:这两个属性控制围绕他的支点进行2D缩放。
  • pivotX,pivotY:这两个属性控制View对象的支点位置。默认为该对象的中心。
  • x,y:控制View对象在它的容器的最终的位置,他是最初的左上角的坐标和translateX和translateY的总和。
  • alpha:控制View的透明度,1可见,0不可见。

如果一个属性没有getset方法,那么可通过两种方法来解决。一个是通过自定义一个属性类或者包装类,间接给这个属性设置get和set方法;另一个是通过ValueAnimator来实现。

包装类实现如下:
包装类:

private static class WrapperView{
    private View mTarget;

    public WrapperView(View target) {
        this.mTarget= target;
    }

    public int getWidth() {
        return mTarget.getLayoutParams().width;
    }

    public void setWidth(int width){
        mTarget.getLayoutParams().width = width;
        mTarget.requestLayout();
    }
}

使用方式:

ObjectAnimator animator= ObjectAnimator.ofInt(new WrapperView(button), "width",0, 500);
animator.setDuration(1000);
animator.start();

效果展示:
Android Animation、ObjectAnimator与ValueAnimator实现视图动画和属性动画_第3张图片

2、动画的监听事件

animator.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) {
    }
});

或者使用AnimatorListenerAdapter只对必要的事件进行监听:

animator.addListener(new AnimatorListenerAdapter() {
    @Override
    public void onAnimationEnd(Animator animation) {
    }
});

3、PropertyValuesHolder

类似视图中的AnimationSet,在属性动画中,如果要同时操作同一个对象的多个属性,要同时作用多种动画,可以使用PropertyValuesHolder来实现。如下:

PropertyValuesHolder ovh1 = PropertyValuesHolder.ofFloat("translationX",0,300);
PropertyValuesHolder ovh2 = PropertyValuesHolder.ofFloat("translationY",0,150);
PropertyValuesHolder ovh3 = PropertyValuesHolder.ofFloat("scaleX", 1f, 2f, 1f);
PropertyValuesHolder ovh4 = PropertyValuesHolder.ofFloat("scaleY", 1f, 2f, 1f);
ObjectAnimator.ofPropertyValuesHolder(button, ovh1, ovh2, ovh3, ovh4).setDuration(1000).start();

效果展示:
Android Animation、ObjectAnimator与ValueAnimator实现视图动画和属性动画_第4张图片

4、AnimatorSet

使用AnimatorSet同样可以同时操作一个视图的多个属性,而且,AnimatorSet能够实现更为精确的顺序控制。
使用AnimatorSet实现上面效果的写法为:

ObjectAnimator animator1 = ObjectAnimator.ofFloat(button, "translationX",0f,300f);
ObjectAnimator animator2 = ObjectAnimator.ofFloat(button, "translationY",0f,150f);
ObjectAnimator animator3 = ObjectAnimator.ofFloat(button, "scaleX",1f, 2f, 1f);
ObjectAnimator animator4 = ObjectAnimator.ofFloat(button, "scaleY",1f, 2f, 1f);
AnimatorSet as = new AnimatorSet();
as.setDuration(1000);
as.playTogether(animator1, animator2, animator3, animator4);
as.start();




Thank you for your support.
THE END

你可能感兴趣的:(Android)