2014-11-17 5 views
7

Ho una vista Recycler con diverse viste e una è la vista dell'animazione a cui è applicata un'animazione. Una volta che la vista è fuori dallo schermo, l'animazione non è più attiva, anche se l'animazione esiste ancora.L'animazione della vista Android si interrompe quando si guarda fuori dallo schermo

I dati:

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> 

L'applicazione di animazione:

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

non riuscivo a trovare un modo per catturare un evento quando l'animazione si interrompe quindi sono in grado di riavviare l'animazione una volta fuori dallo schermo.

risposta

0

Sto facendo esattamente la stessa cosa adesso e ho lo stesso identico problema. Quindi la domanda è come riavviare l'animazione una volta che la vista è tornata sullo schermo.

Ho risolto il problema del 99% solo chiamando "loadingRotatingCircleIV.startAnimation (animation);" all'interno di onBindViewHolder ogni volta che viene richiamata la posizione della mia vista animata.

Ma rimane solo un piccolo problema. Se scorri verso il basso di poco, in modo che la vista scenda dallo schermo, ma il proprietario della vista non viene riciclato, quando si esegue il backup, OnBindViewHolder non viene ovviamente richiamato, ma l'animazione viene interrotta. ancora cercando di risolvere il problema che uno ..

Quindi, la mia soluzione attuale:

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

Se qualcuno ha una soluzione migliore, si prega di aiuto.

3

RecyclerView interrompe in modo errato l'animazione sulla vista quando la vista esce dallo schermo solo se si applica Visualizza animazione a quella vista. Se si utilizzerà l'animazione di proprietà, tutto funziona correttamente. Così la seguente soluzione funzionerà:

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

Se si desidera utilizzare un ViewAnimation per un elemento RecyclerView, è necessario ripristinare l'animazione in modo sovresposta di RecyclerView - onViewAttachedToWindow (titolare ItemViewHolder), come:

@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); 
    } 
} 
0
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 
} 

// per ottenere valore di posizione come usare Integer holder.getLayoutPosition()

+0

Utilizzare il metodo holder.setTag può anche risolvere questo problema, basta scegliere quello che si ritiene più semplice. – chundk