安卓动画学习(三)
- 在上一篇我们看到了估值器,和ValueAnimator这个类的简单使用方法,可是归根结底还是太麻烦,因为所有的东西都需要我们自己去写
- 这一篇给大家带来ObjectAnimator,他是ValueAnimator的子类,实现了与控件绑定,我们来看看具体用法吧
ObjectAnimator
ObjectAnimator animator = ObjectAnimator.ofFloat(tv,"alpha",1,0,1);
animator.setDuration(2000);
animator.start();
- 大概理解一下,先传进去控件实例,再传要改变的属性,再去传改变的值区间
- 关于第二个参数,我具体解释一下,我们传进去的这个参数,是ObjectAnimator拿去到我们指定的View中去找相关set方法的,比如我们在这里传的是alpha,那么找的就是setAlpha()这个方法,这样就达到了改变透明度属性的效果,然后再去重绘View,就可以实现动画的效果了
- 那么这些set方法是从哪里来的呢,他是从View继承而来的,看一下都继承了哪些方法
public void setAlpha(float alpha)
public void setRotation(float rotation)
public void setRotationX(float rotationX)
public void setRotationY(float rotationY)
public void setTranslationX(float translationX)
public void setTranslationY(float translationY)
public void setScaleX(float scaleX)
public void setScaleY(float scaleY)
- 可见,如果我们要改变控件的属性,这个属性就必须有相关set方法,那么,如果我们自己写的控件,我们要如何去写自己的set方法呢
- 这里,如果是我们自己的set方法,命名必须依照驼峰命名法,也就是单词的第一个字母大写,并且在set方法里除了改变响应的值之外,还需要调用invalidate或者postinvalidate方法去重绘VIew
- 这里看下代码吧
useObjectAnimatorTOChangeMyView view = findViewById(R.id.main_useObjectAnimatorView);
final ObjectAnimator objectAnimator = ObjectAnimator.ofInt(view,"radius",0,100,200,300);
objectAnimator.setDuration(3000);
view.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
objectAnimator.start();
}
});
public useObjectAnimatorTOChangeMyView(Context context) {
super(context);}
public useObjectAnimatorTOChangeMyView(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);}
public useObjectAnimatorTOChangeMyView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);}
int radius = 20;
Paint mPaint = new Paint();
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
mPaint.setColor(Color.GREEN);
canvas.drawCircle(250,500,radius,mPaint);
}
public void setRadius(int radius) {
this.radius = radius;
invalidate();
}
- 代码很简单,只是写了一个set方法而已,不用解释
- 那么,我们平时在写的时候变化的区间值往往都是两个及以上,当是一个参数的时候会发生什么事情呢,也就是说我们没有了动画变化的起点
- 这个时候系统就会去调用相关属性的get方法去得到我们控件的初始值
- 那么,如果是我们自己写控件,就必须在一定的时候写出get方法,比如给我的View加上get方法就是
public int getRadius() {
return 10;
}
- 也就是说,我们需要在get方法中去设置一个初始值才行
- 到这里关于这个类基本就这样了
- ObjectAnimator的其他方法也无非跟valueAnimator一样,用的时候再去看文档呗