动画持续时间不起作用

时间:2016-10-22 12:51:33

标签: android animation android-custom-view ondraw drawrectangle

我正在创建一个自定义视图,它基本上是一个Rectangle(RectF对象)。我希望根据用户的指定值,相应地使用动画更改矩形大小。所以我试过了:

public class ObjectView extends View {

public int mCanvasWidth;
public int mCanvasHeight;

public int mVolumeHeight = 0;

public RectF mObjectHead;
public RectF mObjectBody;
public RectF mObjectBodyVolume;
public Canvas mCanvas;

private boolean mInitDone = false;

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

public ObjectView(Context context, AttributeSet attrs) {
    super(context, attrs);
}

public void init()
{

}

@Override
protected void onDraw(Canvas canvas)
{
    super.onDraw(canvas);
    this.mCanvas = canvas;
    float objectHeadDistanceFromLeft = mCanvasWidth / 3;
    float objectHeadWidth = mCanvasWidth / 3;

    float objectBodyDistanceFromTop = mCanvasHeight / 5;
    float objectHeadHeight = mCanvasHeight / 5;
    mBatteryHead = new RectF(batteryHeadDistanceFromLeft,0,2*objectHeadWidth,objectHeadHeight+5);
    Paint objectHeadPaint = new Paint();
    objectHeadPaint.setColor(ContextCompat.getColor(getContext(), R.color.batifyColor));
    canvas.drawRect(mObjectHead,objectHeadPaint);

    mObjectBody = new RectF(0,(int)objetBodyDistanceFromTop,mCanvasWidth,mCanvasHeight);
    Paint objectBodyPaint = new Paint();
    objectBodyPaint.setStyle(Paint.Style.STROKE);
    objectBodyPaint.setColor(ContextCompat.getColor(getContext(), R.color.batifyColor));
    objectBodyPaint.setStrokeWidth(10);
    canvas.drawRect(mObjectBody,objectBodyPaint);

    mObjectBodyVolume = new RectRectF(12, (int) objectBodyDistanceFromTop + 10, mCanvasWidth - 12, mVolumeHeight);
    Paint volumeBodyPaint = new Paint();
    volumeBodyPaint.setColor(ContextCompat.getColor(getContext(), R.color.batifyColor));
    canvas.drawRect(mObjectBodyVolume, volumeBodyPaint);

}


public void setStateOnObject(){
    this.mVolumeHeight = mCanvasHeight;
    ObjectAnimator animateBottom = ObjectAnimator.ofFloat(mObjectBodyVolume, "bottom", mObjectBodyVolume.bottom, this.mVolumeHeight);
    animateBottom.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
        @Override
        public void onAnimationUpdate(ValueAnimator valueAnimator) {
            postInvalidate();
        }
    });
    AnimatorSet rectAnimation = new AnimatorSet();
    rectAnimation.play(animateBottom);
    rectAnimation.setDuration(10000).start();
}

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    super.onMeasure(widthMeasureSpec,heightMeasureSpec);
    mCanvasWidth = MeasureSpec.getSize(widthMeasureSpec);
    mCanvasHeight = MeasureSpec.getSize(heightMeasureSpec);
}
 }

问题在于,无论动画的持续时间如何,大小都不会按预期逐步更新,而是直接更新到最终值。 知道我做错了什么吗?

提前致谢!

1 个答案:

答案 0 :(得分:1)

为了提高性能,请避免在onDraw中进行分配和计算

属性底部需要一个setter。 RectF没有。有这个

public class AnimatableRectF extends RectF{


    public AnimatableRectF(float left, float top, float right, float bottom) {
        super(left, top, right, bottom);
    }

    public AnimatableRectF(RectF r) {
        super(r);
    }

    public AnimatableRectF(Rect r) {
        super(r);
    }

    public void setTop(float top){
        this.top = top;
    }
    public void setBottom(float bottom){

        this.bottom = bottom;
    }
    public void setRight(float right){
        this.right = right;
    }
    public void setLeft(float left){
        this.left = left;
    }

}

然后

 mObjectBodyVolume = new AnimatableRectF(12, (int) objectBodyDistanceFromTop + 10, mCanvasWidth - 12, mVolumeHeight);

动画部分保持不变