Анимация Android прекращается, когда просмотр не отображается

У меня есть recyclerView с несколькими видами, а один – это анимационный вид, к которому применяется анимация. Когда представление выходит за пределы экрана, анимация больше не активна, хотя анимация все еще существует.

Данные:

rotate_around_center_point.xml

<?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android" android:shareInterpolator="false" > <rotate android:duration="2500" android:interpolator="@android:anim/linear_interpolator" android:pivotX="50%" android:pivotY="50%" android:repeatCount="infinite" android:repeatMode="restart" android:toDegrees="360" /> </set> 

Применение анимации:

  animation = AnimationUtils.loadAnimation(this.getContext(), R.anim.rotate_around_center_point); loadingRotatingCircleIV.startAnimation(animation); 

Я не мог найти способ поймать событие, когда анимация прерывается, поэтому я могу перезапустить анимацию, когда она была вне экрана.

Solutions Collecting From Web of "Анимация Android прекращается, когда просмотр не отображается"

RecyclerView неправильно останавливает анимацию в представлении, когда просмотр выходит из экрана, только если вы примените View Animation к этому представлению. Если вы будете использовать Property Animation, все будет работать правильно. Таким образом, следующее решение будет работать:

 ObjectAnimator animator = ObjectAnimator.ofFloat(loadingRotatingCircleIV, "rotation", 0.0f, 360.0f); animator.setDuration(1000L); animator.setRepeatCount(ObjectAnimator.INFINITE); animator.setInterpolator(new LinearInterpolator()); animator.start(); 

Если вы хотите использовать элемент ViewAnimation для RecyclerView , вам необходимо восстановить анимацию в режиме переопределения RecyclerViewonViewAttachedToWindow (держатель ItemViewHolder) , например:

 @Override public void onViewAttachedToWindow(ItemViewHolder holder) { super.onViewAttachedToWindow(holder); if (holder.animated) { Animation anim = new ScaleAnimation(0.8f, 1.2f, 0.8f, 1.2f, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f); anim.setFillAfter(true); anim.setInterpolator(new BounceInterpolator()); anim.setDuration(1100); anim.setRepeatCount(Animation.INFINITE); anim.setRepeatMode(Animation.REVERSE); holder.animatedView.startAnimation(anim); } } 

Я делаю то же самое прямо сейчас, имея ту же самую проблему. Поэтому вопрос заключается в том, как перезапустить анимацию после просмотра на экране.

Я решил проблему на 99%, просто позвонив «loadingRotatingCircleIV.startAnimation (анимация)»; Внутри onBindViewHolder каждый раз, когда он вызывается для моей позиции анимированного представления.

Но осталась лишь небольшая проблема. Если вы прокрутите вниз немного, так что представление выходит из экрана, но его владелец не возвращается, когда вы прокручиваете резервную копию, onBindViewHolder, очевидно, не вызывается снова, но анимация остановлена. Поэтому я Все еще пытаюсь исправить это.

Итак, мое текущее решение:

 public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { ... if (position=="animated_view_position") view.startAnimation(animation); ... } 

Если у кого-то есть лучшее решение, пожалуйста, помогите.

 create **HashMap<Integer, Boolean>** for saving each items animation loaded status construct (){ for(int c = 0; c < adapterDataList.size(); c++){ //Here is create default status of animation loaded status used Boolean to saving } } //Call Start Animation with onViewAttachedToWindow @Override public void onViewAttachedToWindow(ItemViewHolder holder) { super.onViewAttachedToWindow(holder); // get HashMap of each items Animation status like this if(!HashMap.get(position)){ //FALSE means animation not loaded yet //Here should call start Animation method; } else { //Here call no animation method, like setImageDrawable etc... } //create an AnimationListener for each item, when an animation is End, Listener should call a method to change HashMap above which you just created, like this **HashMap.put(position, Boolean.valueOf(true))** //TRUE means animation loaded } 

// для получения значения позиции в качестве Integer используйте holder.getLayoutPosition ()