Es allí cualquier manera de animar a los elementos de un RecyclerView cuando me desplazarse?

Eché un vistazo a DefaultItemAnimator y RecyclerView.ItemAnimator, pero que las animaciones parece ser llamado sólo si el conjunto de datos ha cambiado, por favor me corrija si estoy equivocado.

Estoy un poco confundido acerca de RecyclerView.ItemAnimator.animateMove() cuando se llama? Pongo algunos puntos de interrupción en esa clase, pero ninguno de ellos se detiene la aplicación.

Sin embargo, volviendo a mi pregunta ¿cómo puedo animar la RecyclerView? Quiero que algunos de los elementos a tener otro opacidad, dependía de algunas reglas personalizadas.


Me hizo más reaseach parece que la animación de movimiento es exactamente lo que estoy buscando. Que se llama a los métodos de dispatchLayout(). Aquí está el javadoc de ese método:

Envoltura alrededor de layoutChildren() que se encarga de la animación de los cambios provocados por el diseño.
Animaciones de trabajo en el supuesto de que hay cinco tipos diferentes de elementos
en juego:

PERSISTENTE: los elementos son visibles antes y después de diseño

ELIMINADO: elementos eran visibles antes de la disposición y fueron retirados por la aplicación

AGREGADO: los elementos que no existían antes de la disposición y fueron añadidas por la aplicación

DESAPARICIÓN: existen elementos en el conjunto de datos antes/después, pero cambió de
visible no visible en el proceso de diseño (por lo que fueron trasladados fuera de
la pantalla como un efecto secundario de otros cambios)

APARECEN: existen elementos en el conjunto de datos antes/después, pero cambió de
no visible visible en el proceso de diseño (por lo que fueron trasladados en
la pantalla como un efecto secundario de otros cambios)

El enfoque general de las cifras de lo que existen elementos antes/después de la disposición y
se deduce uno de los cinco estados anteriores para cada uno de los elementos. A continuación, las animaciones
se configuran de acuerdo a:

PERSISTENTE vistas son movidos ({@link ItemAnimator#animateMove(ViewHolder, int, int, int, int)})
QUITA las vistas son removidos ({@link ItemAnimator#animateRemove(ViewHolder)})

AÑADIDO vistas añadido ({@link ItemAnimator#animateAdd(ViewHolder)})

DESAPARICIÓN de puntos de vista se mueve fuera de la pantalla

APARECEN opiniones se mueven en la pantalla

Hasta ahora estoy buscando PERSISTENTE, DESAPARECIENDO y APARECIENDO, sino que los métodos no son nunca de llamar, porque de esta línea aquí:

boolean animateChangesSimple = mItemAnimator != null && mItemsAddedOrRemoved
            && !mItemsChanged;

mItemsAddedOrRemoved simplemente es siempre falsa por lo que ninguno de devolución de llamada que nunca llegó. Alguna idea de cómo ajustar la bandera correctamente?

  • usted puede utilizar objectanimtor introducido en api11 para animar cualquier objeto
  • Bien bien, pero ¿cómo puedo saber cuando tengo que iniciar la animación?
InformationsquelleAutor rekire | 2014-08-19

3 Comentarios

  1. 9

    Terminé en el uso de un OnScrollListener y animación en una costumbre animate() método. En mi caso que el código que se toma sólo 2ms así que no es problema para la 60fps.

    recyclerView.setOnScrollListener(new RecyclerView.OnScrollListener() {
        @Override
        public void onScrollStateChanged(int newState) {
            if(newState == RecyclerView.SCROLL_STATE_IDLE) {
                //special handler to avoid displaying half elements
                scrollToNext();
            }
            animate();
        }
    
        @Override
        public void onScrolled(int dx, int dy) {
            animate();
        }
    });
    • se puede añadir un poco más de código como scrollToNext por ejemplo?
    • Este enlace meight ayudarle.
    • Que está fuera del alcance de mi pregunta. Usted debe preguntar a una pregunta sobre la independencia de pan que. Mantenga en mente para mostrar su progreso actual, mientras que la aplicación que 🙂
    • puede usted por favor me ayude con mi pregunta:stackoverflow.com/questions/45858059/…
  2. 6

    Me hizo de esta manera. Podría ayudar a alguien. No sé si es la mejor manera de hacerlo, pero funciona muy bien para mí.

    ACTUALIZACIÓN:
    Para solucionar desplazamiento rápido de comportamiento, anular onViewDetachedFromWindow método del adaptador y de la llamada clearAnimation en la animación del punto de vista (en este caso, holder.itemView.clearAnimation() ).

    up_from_bottom.xml

    <?xml version="1.0" encoding="utf-8"?>
    <set xmlns:android="http://schemas.android.com/apk/res/android"
     android:shareInterpolator="@android:anim/decelerate_interpolator">
    <translate
        android:fromXDelta="0%" android:toXDelta="0%"
        android:fromYDelta="100%" android:toYDelta="0%"
        android:duration="400" />
    </set>

    down_from_top.xml

    <?xml version="1.0" encoding="utf-8"?>
    <set xmlns:android="http://schemas.android.com/apk/res/android"
     android:shareInterpolator="@android:anim/decelerate_interpolator">
    <translate
        android:fromXDelta="0%" android:toXDelta="0%"
        android:fromYDelta="-100%" android:toYDelta="0%"
        android:duration="400" />
    </set>

    Y, finalmente, poner este código en onBindViewHolder de recyclerView. Crear un campo llamado lastPosition y se inicializa a -1.

    Animation animation = AnimationUtils.loadAnimation(context,
                (position > lastPosition) ? R.anim.up_from_bottom
                        : R.anim.down_from_top);
        holder.itemView.startAnimation(animation);
        lastPosition = position;
    • el espectáculo de animación de nuevo cuando notifiydatasetchange. Alguna manera de arreglarlo?
  3. 0

    La buena solución es para animar titular en el adaptador en onBindViewHolder método.
    Fragmento tomado de Ensayo de Materiales del proyecto Slidenerd:

    @Override 
    public void onBindViewHolder(ViewHolderBoxOffice holder, int position) {
        Movie currentMovie = mListMovies.get(position);
        //one or more fields of the Movie object may be null since they are fetched from the web 
        holder.movieTitle.setText(currentMovie.getTitle());
    
    
        //retrieved date may be null 
        Date movieReleaseDate = currentMovie.getReleaseDateTheater();
        if (movieReleaseDate != null) {
            String formattedDate = mFormatter.format(movieReleaseDate);
            holder.movieReleaseDate.setText(formattedDate);
        } else { 
            holder.movieReleaseDate.setText(Constants.NA);
        } 
    
    
        int audienceScore = currentMovie.getAudienceScore();
        if (audienceScore == -1) {
            holder.movieAudienceScore.setRating(0.0F);
            holder.movieAudienceScore.setAlpha(0.5F);
        } else { 
            holder.movieAudienceScore.setRating(audienceScore / 20.0F);
            holder.movieAudienceScore.setAlpha(1.0F);
        } 
    
    
        if (position > mPreviousPosition) {
            AnimationUtils.animateSunblind(holder, true);         
        } else { 
            AnimationUtils.animateSunblind(holder, false);
    
        } 
        mPreviousPosition = position;

    aquí es un enlace

    • Esta solución para una determinada biblioteca no para todos.

Dejar respuesta

Please enter your comment!
Please enter your name here