大家带来ObjectAnimator介绍以及使用
- 概述
- 公共代码
- alpha
- rotation
- 补充
- rotationX
- rotationY
概述
- 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.