Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/227.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 动画持续时间不起作用_Android_Animation_Android Custom View_Ondraw_Drawrectangle - Fatal编程技术网

Android 动画持续时间不起作用

Android 动画持续时间不起作用,android,animation,android-custom-view,ondraw,drawrectangle,Android,Animation,Android Custom View,Ondraw,Drawrectangle,我正在创建一个自定义视图,它基本上是一个矩形(RectF对象)。我想根据用户指定的值,用动画相应地改变矩形的大小。所以我试过: public class ObjectView extends View { public int mCanvasWidth; public int mCanvasHeight; public int mVolumeHeight = 0; public RectF mObjectHead; public RectF mObjectBody; public Rect

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

}
然后


动画部分保持不变

我创建了一个示例,并尝试了相同的方法,效果与预期一致。它正在逐步更新?是的。我可以看到动画更新缓慢。我从来没有在onDraw中进行分配。只剩下画的部分了。其余的都一样。您不希望在每次刷新时都进行分配和初始化。
 mObjectBodyVolume = new AnimatableRectF(12, (int) objectBodyDistanceFromTop + 10, mCanvasWidth - 12, mVolumeHeight);