大家带来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.