Android动画(四)ObjectAnimator的介绍以及使用

概述

  • ValueAnimator需要通过监听它的方法来改变值,用起来比较麻烦.
  • ObjectAnimator是继承自ValueAnimator的,所以ValueAnimator中的方法,ObjectAnimator都可以使用.
  • ObjectAnimator中重写了ofInt(),ofFloat()等方法

公共代码

因为ObjectAnimator继承自ObjectAnimator所以以下方法都可以使用

  • android:duration setDuration(long) 动画持续时间,以毫秒为单位
  • android:fillAfter setFillAfter(boolean) 如果设置为true,控件动画结束时,将保持动画最后时的状态
  • android:fillBefore setFillBefore(boolean) 如果设置为true,控件动画结束时,还原到开始动画前的状态
  • android:fillEnabled setFillEnabled(boolean) 与android:fillBefore 效果相同,都是在动画结束时,将控件还原到初始化状态
  • android:repeatCount setRepeatCount(int) 重复次数
  • android:repeatMode setRepeatMode(int) 重复类型,有reverse和restart两个值,取值为RESTART或 REVERSE,必须与repeatCount一起使用才能看到效果。因为这里的意义是重复的类型,即回放时的动作。
  • android:interpolator setInterpolator(Interpolator) 设定插值器

alpha

注意:
这里使用到的一定是ObjectAnimator.ofFloat(),而不是ObjectAnimator.ofInt()

ObjectAnimator alpha = ObjectAnimator.ofFloat(tv, "alpha", 1, 0, 1,0.5f,0,1);
alpha.setDuration(3000);
alpha.start();

有参构造
ObjectAnimator.ofFloat(Object target, String propertyName, float… values)

  • 参数一:要改变的控件ID
  • 参数二:指定的动画属性
  • 参数三:这个参数是个可变参数,设置的是动画属性的值(alpha属性只有0~1 ,0代表透明,1代表不透明)

来康康效果吧:
在这里插入图片描述

rotation

这里因为有大量重复代码,我就把他抽取出来了,非常的简单.

private void setObjectAnimatorOfFloat(String propertyName, float... values) {
    ObjectAnimator objectAnimator = ObjectAnimator.ofFloat(tv, propertyName, values);
    objectAnimator.setDuration(3000);
    objectAnimator.start();
}

使用:

setObjectAnimatorOfFloat("rotation",0,180,-360,0);
  • 参数一:指定的动画属性
  • 参数二:可变参数设置的是旋转的角度(正数代表顺时针旋转,负数代表逆时针旋转)

来康康效果吧:
在这里插入图片描述

补充

学过数学的大家都懂,平行的是X轴,垂直的是Y轴
在这里插入图片描述

rotationX

按照X轴旋转,和rotation使用一样只是旋转的方向不一样

setObjectAnimatorOfFloat("rotationX",0,180,360,0);

来康康效果:
在这里插入图片描述

rotationY

按照Y轴旋转,和rotation使用一样只是旋转的方向不一样

setObjectAnimatorOfFloat("rotationY",0,180,360,0)

来康康效果:
在这里插入图片描述

translationX与translationY

translationX
setObjectAnimatorOfFloat("translationX",0,180,360,0);

translationY
setObjectAnimatorOfFloat("translationY",0,-180,360,0);

translationX:

  • 参数一:指定动画属性
  • 参数二:可变参数:正数表示向移动反之负数表示向移动

translationY:

  • 参数一:指定动画属性
  • 参数二:可变参数:正数表示向动反之负数表示向移动

来康康效果吧:
在这里插入图片描述

ScaleX与ScaleY

ScaleX
setObjectAnimatorOfFloat("scaleX",0,1,2,1);

ScaleY
setObjectAnimatorOfFloat("scaleY",0,1,2,1);

scaleX:

  • 参数一:指定动画属性
  • 参数二:可变参数:1代表不缩放,2代表缩放X轴2倍,以此类推

scaleY:

  • 参数一:指定动画属性
  • 参数二:可变参数:1代表不缩放,2代表缩放Y轴2倍,以此类推

康康效果吧:
在这里插入图片描述

自定义ObjectAnimator

先来看看效果:
在这里插入图片描述

定义一个类来记录圆的半径:

public class PointBean {
    private int radio;
    public int getRadio() {
        return radio;
    }
    public void setRadio(int radio) {
        this.radio = radio;
    }
    public PointBean(int radio) {
        this.radio = radio;
    }
}

写一个类继承自View:

public class MyPointView extends View {
//初始化圆
    public PointBean pointBean = new PointBean(100);
    private Paint mPaint;

    public MyPointView(Context context) {
        super(context);
    }

    public MyPointView(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
        mPaint = new Paint();
        mPaint.setColor(Color.YELLOW);
        mPaint.setStyle(Paint.Style.FILL);
        mPaint.setAntiAlias(true);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        if (mPaint != null) {
            canvas.drawCircle(300,300,pointBean.getRadio(),mPaint);
        }
    }

	//需要注意这个set方法
    public void setPointBean(int radio){
        pointBean.setRadio(radio);
        invalidate();
    }
}

在布局中使用:

在这里插入图片描述

点击按钮使用

 //圆形动画开始
        button_start.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                ObjectAnimator pointBean = ObjectAnimator.ofInt(pointView, "PointBean", 0,200, 300, 100);
                pointBean.setDuration(3000);
                pointBean.start();
//                pointView.setPointBean();

            }
        });

注意:

  • 这里调用的是**ObjectAnimator.ofInt()**而不是ofFloat()
  • 参数一:需要改变的动画控件
  • 参数二:获取的是set后面的值.这里需要注意的是,set后面首字母大写!! ,否则会没反应
 //需要注意这个set方法
    public void setPointBean(int radio){
        pointBean.setRadio(radio);
        //刷新onDraw
        invalidate();
    }
}

`
  • 参数三:可变参数,将值通过参数二对应的值,传给对象的setPointBean()方法

可以通过这个流程图看出,最后调用的set方法,通过反射吧当前值作为参数传进去,这里就把最后一位可变参数,当做参数传给setPointBean()方法
在这里插入图片描述

参考问文档链接: 启舰.

git链接: langyangyang.

猜你喜欢

转载自blog.csdn.net/weixin_44819566/article/details/107015406