ObjectAnimator с использованием установщиков CharSequence - PullRequest
3 голосов
/ 22 ноября 2011

Я играю с "новыми" анимациями свойств в Android.И наткнулся на стену при попытке реализовать ValueAnimator, который изменяет текст TextView.

Это моя логика анимации (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();

Это ошибка imполучение: 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 искать setText вместо параметра CharSequence?

Ответы [ 2 ]

4 голосов
/ 02 декабря 2013

Это старый вопрос, и мне интересно, сталкивался ли кто-нибудь еще с этой проблемой.Я сделал сегодня.Вот как я создал обходной путь.Я все еще использую 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 до 0 за 3 секунды.

4 голосов
/ 23 ноября 2011

Я не нашел способа заставить 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();
...