我正在创建一个自定义视图,它基本上是一个矩形(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);
动画部分保持不变