动画持续时间不工作



我正在创建一个自定义视图,它基本上是一个矩形(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);
}
 }

问题是大小没有像预期的那样逐步更新,而是直接到最终值,无论动画的持续时间如何。知道我哪里做错了吗?

提前感谢!

为了性能考虑,避免在onDraw中分配和计算

属性bottom需要一个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);

动画部分保持不变

相关内容

  • 没有找到相关文章

最新更新