我正在构建一个包含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中使用数组变量,
由于
答案 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();
}