2011-11-22 74 views
3

我在Android中玩「新」屬性動畫。 當試圖實現改變TextView文本的ValueAnimator時遇到了問題。使用CharSequence設置器的ObjectAnimator

這是我的動畫邏輯(文本是一個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?

回答

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進行倒計時。

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, 
           endValue.length() 
             + (int) ((startValue.length() - endValue 
               .length()) * fraction)); 
       } 
      }); 

textAnimator.setDuration(6000); 
textAnimator.setRepeatCount(ValueAnimator.INFINITE); 
textAnimator.start(); 
相關問題