Успешный вызов onAnimationUpdate, но без изменений в отображении с помощью ValueAnimator в View :: onDraw - PullRequest
0 голосов
/ 29 октября 2018

Я пытаюсь анимировать непрозрачность круга в функции OnDraw класса, расширяющего View, используя ValueAnimator w / setAlpha. Я положил отладочный тост внутрь onAnimationUpdate. Быстрая последовательность всплывающих подсказок отображает альфа-значения (onAnimatetionUpdate имеет правильные значения), но форма не меняется на экране. Я пробовал invalidate() и postInvalidate() в onAnimationUpdate(), но думаю, что это красная сельдь.

С https://developer.android.com/guide/topics/graphics/prop-animation

В зависимости от того, какое свойство или объект вы анимируете, вам может понадобиться вызвать инвалида () ... setAlpha () и setTranslationX () лишают законной силы вид, поэтому вам не нужно аннулировать View при вызове этих методов с новыми значениями.

Пример кода может выглядеть следующим образом:

    Paint CircleFill_dah = new Paint(); // hit of dah duration
    CircleFill_dah.setStyle(Paint.Style.FILL);

    ValueAnimator animator_dah = ValueAnimator.ofInt(0,255);

    CircleFill_dah.setColor(dahColor);
    CircleFill_dah.setAlpha(0);
    animator_dah.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
        @Override
        public void onAnimationUpdate(ValueAnimator animation) {
            int alphval = (int) animation.getAnimatedValue();
            CircleFill_dah.setAlpha(alphval);
            //we are here but are not redrawing!?
            Toast.makeText(c,"setting alpha " + alphval,Toast.LENGTH_SHORT).show();
            //view.postInvalidate(); // clears toast messages, but doesn't show animation
        }
    });
    canvas.drawCircle(50, 50, 50, CircleFill_dah);
    animator_dah.setDuration(100);
    animator_dah.setRepeatMode(ValueAnimator.REVERSE);
    animator_dah.setRepeatCount(-1);
    animator_dah.start();

Фактический код на github . clearView extends View и реализует onDraw, вызывая Touchable.draw(), который использует Touchable.fill()

1 Ответ

0 голосов
/ 30 октября 2018

анимация start() не должна быть в onDraw()!

invalidate() также представляется необходимым.

public class MainActivity extends AppCompatActivity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        View v = new TestView(this);
        setContentView(v);
    }

    private static class TestView extends View {
        Paint CircleFill_dah = new Paint(); // hit of dah duration
        ValueAnimator animator_dah = ValueAnimator.ofInt(100,255);

        public TestView (Context context) {
            super(context);
            setFocusable(true);

            CircleFill_dah.setStyle(Paint.Style.FILL);

            CircleFill_dah.setColor(Color.BLUE);
            CircleFill_dah.setAlpha(50);
            animator_dah.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
                @Override
                public void onAnimationUpdate(ValueAnimator animation) {
                    int alphval = (int) animation.getAnimatedValue();
                    CircleFill_dah.setAlpha(alphval);
                    invalidate();
                }
            });

            animator_dah.setDuration(100);
            animator_dah.setRepeatMode(ValueAnimator.REVERSE);
            animator_dah.setRepeatCount(-1);
            animator_dah.start();

        }
        @Override
        protected void onDraw(Canvas canvas) {
            canvas.drawCircle(50, 50, 50, CircleFill_dah);
        }
    }
}
...