我正在玩Android中的“新”属性动画。 在尝试实现更改TextView文本的ValueAnimator时碰到了一堵墙。
这是我的动画逻辑(text1是TextView)
ValueAnimator textAnim = ObjectAnimator.ofObject(text1, "text",
new TypeEvaluator<CharSequence>() {
public CharSequence evaluate(float fraction,
CharSequence startValue, CharSequence endValue) {
if (startValue.length() < endValue.length())
return endValue.subSequence(0,
(int) (endValue.length() * fraction));
else
return startValue.subSequence(
0,
endValue.length()
+ (int) ((startValue.length() - endValue
.length()) * fraction));
}
}, start, end);
textAnim.setRepeatCount(ValueAnimator.INFINITE);
textAnim.setDuration(6000);
textAnim.start();
这是我得到的错误:11-22 14:37:35.848: E/PropertyValuesHolder(3481): Couldn't find setter/getter for property text with value type class java.lang.String
。
有谁知道我如何强制ObjectAnimator查找带有CharSequence参数的setText?
答案 0 :(得分:4)
我还没有找到使ObjectAnimator能够使用CharSequence值的方法。
然而,我确实设法使用标准的ValueAnimator来实现它。以下示例。
ValueAnimator textAnimator = new ValueAnimator();
textAnimator.setObjectValues(start, end);
textAnimator.addUpdateListener(new AnimatorUpdateListener() {
public void onAnimationUpdate(ValueAnimator animation) {
text1.setText((CharSequence)animation.getAnimatedValue());
}
});
textAnimator.setEvaluator(new TypeEvaluator<CharSequence>() {
public CharSequence evaluate(float fraction,
CharSequence startValue, CharSequence endValue) {
if (startValue.length() < endValue.length())
return endValue.subSequence(0,
(int) (endValue.length() * fraction));
else
return startValue.subSequence(
0,
startValue.length()
- (int) ((startValue.length() - endValue
.length()) * fraction));
}
});
textAnimator.setDuration(6000);
textAnimator.setRepeatCount(ValueAnimator.INFINITE);
textAnimator.start();
答案 1 :(得分:4)
这是一个老问题,我想知道是否有其他人遇到过这个问题。我今天做了。这就是我创作作品的方式。我仍然使用ObjectAnimator
包装类(这是Android文档中的提示)
TextView的包装类:
private class AnimatedTextView {
private final TextView textView;
public AnimatedTextView(TextView textView) {this.textView = textView;}
public String getText() {return textView.getText().toString();}
public void setText(String text) {textView.setText(text);}
}
使用此类,您可以使用ObjectAnimator:
ObjectAnimator.ofObject(new AnimatedTextView((TextView) findViewById(R.id.shortcutLabel)), "Text", new TypeEvaluator<String>() {
@Override
public String evaluate(float fraction, String startValue, String endValue) {
return (fraction < 0.5)? startValue:endValue;
}
}, "3", "2", "1", "0")
.setDuration(3000L)
.start();
此代码段在3秒内完成从3到0的倒计时。