Менять на ходу анимацию Android

Хочу привязать поле модели с параметрами анимации к выполняемой анимации, чтобы при изменении например duration при следующем цикле анимации duration была применена без остановки и пересоздании анимации, пока использую такой код, по кнопке к элементу ImageView применяется анимация:

case R.id.btnScale: {
                FragmentContainerView fr = findViewById(R.id.frScale);
                fr.setVisibility(View.VISIBLE);

                imgElementAnimation.clearAnimation();

                // получаем ссылку на фрагмент-приемник
                ScaleFragment fragmentScale = (ScaleFragment) getSupportFragmentManager()
                        .findFragmentById(R.id.frScale);

                //получаем модель настроек выбранной анимации
                assert fragmentScale != null;
                ScaleAnimationModel model = fragmentScale.scaleViewModel.getModel();

                //подготовим анимацию с настройками из модели
                ScaleAnimation scale = new ScaleAnimation(model.getFromXScale() / ScaleAnimationModel.Scalescale, model.getToXScale() / ScaleAnimationModel.Scalescale,
                        model.getFromYScale() / ScaleAnimationModel.Scalescale, model.getToYScale() / ScaleAnimationModel.Scalescale,
                        Animation.RELATIVE_TO_SELF, model.getPivotX() * ScaleAnimationModel.PivotXscale / 100.0f, Animation.RELATIVE_TO_SELF, model.getPivotY() * ScaleAnimationModel.PivotYscale / 100.0f);
                scale.setDuration(model.getDuration());
                scale.setRepeatMode(model.isRepeatMode() ? 2 : 1);
                scale.setRepeatCount(model.getRepeatCount());
                scale.setInterpolator(new LinearInterpolator());

                imgElementAnimation.startAnimation(scale);
            }
            break;

Что нужно сделать чтоб изменения применялись на ходу. Такой себе Проект чтоб поиграться с анимацией, да и лучше понять про взаимодействие параметров в Android.


Ответы (1 шт):

Автор решения: Михаил

Сделай метод, вроде такого

    private void startAnim(ImageView imgElementAnimation) {
    ScaleAnimation scale = new ScaleAnimation(model.getFromXScale() / ScaleAnimationModel.Scalescale, model.getToXScale() / ScaleAnimationModel.Scalescale,
            model.getFromYScale() / ScaleAnimationModel.Scalescale, model.getToYScale() / ScaleAnimationModel.Scalescale,
            Animation.RELATIVE_TO_SELF, model.getPivotX() * ScaleAnimationModel.PivotXscale / 100.0f, Animation.RELATIVE_TO_SELF, model.getPivotY() * ScaleAnimationModel.PivotYscale / 100.0f);
    scale.setDuration(model.getDuration());
    scale.setRepeatMode(model.isRepeatMode() ? 2 : 1);
    scale.setRepeatCount(model.getRepeatCount());
    scale.setInterpolator(new LinearInterpolator());
    scale.setAnimationListener(new Animation.AnimationListener() {
        @Override
        public void onAnimationStart(Animation animation) {

        }

        @Override
        public void onAnimationEnd(Animation animation) {
            if (model.isStopAnim) {
                startAnim(imgElementAnimation);
            }

        }

        @Override
        public void onAnimationRepeat(Animation animation) {

        }
    });
    imgElementAnimation.startAnimation(scale);
}

Вызывай его у себя в onClickListener() Ну и зачем хранить модель внутри фрагмента, непонятно. Вынеси ее отдельно, чтоб всем удобно было обращаться, а лучше использую стандартное решение https://developer.android.com/topic/libraries/architecture/viewmodel

→ Ссылка