AI智能
改变未来

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

大家带来ObjectAnimator介绍以及使用

  • 概述
  • 公共代码
  • alpha
  • rotation
  • 补充
  • rotationX
  • rotationY
  • translationX与translationY
  • ScaleX与ScaleY
  • 自定义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

    translationXsetObjectAnimatorOfFloat(\"translationX\",0,180,360,0);translationYsetObjectAnimatorOfFloat(\"translationY\",0,-180,360,0);

    translationX:

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

    translationY:

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

    来康康效果吧:

    ScaleX与ScaleY

    ScaleXsetObjectAnimatorOfFloat(\"scaleX\",0,1,2,1);ScaleYsetObjectAnimatorOfFloat(\"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);}@Overrideprotected 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() {@Overridepublic 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);//刷新onDrawinvalidate();}}`
    • 参数三:可变参数,将值通过参数二对应的值,传给对象的setPointBean()方法

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

    参考问文档链接: 启舰.

    git链接: langyangyang.

    赞(0) 打赏
    未经允许不得转载:爱站程序员基地 » Android动画(四)ObjectAnimator的介绍以及使用