Менять на ходу анимацию 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