动画持续时间不起作用
Animation duration does not work
我正在创建一个自定义视图,它基本上是一个矩形(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
中的分配和计算
属性 底部需要 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);
动画部分保持不变
我正在创建一个自定义视图,它基本上是一个矩形(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
中的分配和计算
属性 底部需要 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);
动画部分保持不变