带有数组变量的ObjetctAnimator

时间:2016-11-29 12:43:43

标签: android animation objectanimator

我正在构建一个包含3个进度条的自定义视图,因此我有一个数组变量,如下所示:

float[] progress = new float[3];

我想使用'ObjectAnimator'更新特定的进度条目;以下是相关方法:

public void setProgress(int index, float progress) {
    this.progress[index] = (progress<=100) ? progress : 100;
    invalidate();
}

public void setProgressWithAnimation(int index, float progress, int duration) {
    PropertyValuesHolder indexValue = PropertyValuesHolder.ofInt("progress", index);
    PropertyValuesHolder progressValue = PropertyValuesHolder.ofFloat("progress", progress);

    ObjectAnimator objectAnimator = ObjectAnimator.ofPropertyValuesHolder(this, indexValue, progressValue);
    objectAnimator.setDuration(duration);
    objectAnimator.setInterpolator(new DecelerateInterpolator());
    objectAnimator.start();
}

但是我收到了这个警告:Method setProgress() with type int not found on target class

我也试过使用setter包含一个数组(setProgress (float[] progress)),但仍然出错:Method setProgress() with type float not found on target class

所以我很高兴知道如何在ObjectAnimator中使用数组变量,

由于

1 个答案:

答案 0 :(得分:0)

经过多次尝试,看起来可以使用ObjectAnimator执行此操作。我也在doc中找到了这个:

  

您要设置动画的对象属性必须具有setter函数   (在驼峰的情况下)以set()的形式。因为   ObjectAnimator会在动画期间自动更新属性   必须能够使用此setter方法访问该属性。对于   例如,如果属性名称为foo,则需要具有setFoo()   方法。如果此setter方法不存在,则有三个选项:

     
      
  • 如果您有权这样做,请将setter方法添加到课程中。

  •   
  • 使用您有权更改并具有该权限的包装类   wrapper使用有效的setter方法接收值并将其转发给   原始对象。

  •   
  • 请改用ValueAnimator。

  •   

作为Google的建议,我尝试使用ValueAnimator并且它的工作正常:

public void setProgressWithAnimation(float progress, int duration, final int index) {
    ValueAnimator valueAnimator = ValueAnimator.ofFloat(progress);
    valueAnimator.setDuration(duration);
    valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
        @Override
        public void onAnimationUpdate(ValueAnimator valueAnimator) {
            setProgress((Float) valueAnimator.getAnimatedValue(), index);
        }
    });
    valueAnimator.start();
}