Wie man Recycler animiert, wenn sie erscheinen

Wie kann ich die RecyclerViews animieren, wenn es auftaucht?

Der Default-Element-Animator animiert nur, wenn nach dem Einlegen der Recycler-Daten eine Daten hinzugefügt oder entfernt werden. Ich bin neu entwickelnde Anwendungen und habe keine Ahnung, wo ich anfangen soll.

Irgendwelche Ideen, wie man das erreicht?

  • Slide RecyclerEntwickeln Sie, wie Sie es aufwischen, oder schieben Sie recyclerview unten, während Sie unten rutschen
  • Quadratisches Layout auf GridLayoutManager für RecyclerView
  • Wie programmgesteuert scrollen Sie nach unten auf eine Recycler-Ansicht?
  • Entfernen von RecyclerView Items
  • Android - Hinzufügen von Ansichten zu Bildern nicht aktualisiert - onClick
  • Für dividerItemDecoration zeichnen
  • Android - Wenn WebView sichtbar ein extra, Buggus, View ist auch erstellt wird
  • Mit Espresso klicken Sie auf Ansicht innerhalb RecyclerView item
  • 7 Solutions collect form web for “Wie man Recycler animiert, wenn sie erscheinen”

    EDIT:

    Nach der Dokumentation von ItemAnimator :

    Diese Klasse definiert die Animationen, die auf Items stattfinden, da Änderungen an dem Adapter vorgenommen werden.

    Also, wenn Sie Ihre Artikel eins nach dem anderen zu Ihrem RecyclerView hinzufügen und die Ansicht bei jeder Iteration ItemAnimator glaube ich nicht, dass ItemAnimator die Lösung für Ihre Notwendigkeit ist.

    Hier können Sie die RecyclerView Elemente animieren, wenn sie mit einem CustomAdapter erscheinen:

     public class CustomAdapter extends RecyclerView.Adapter<CustomAdapter.ViewHolder> { private Context context; // The items to display in your RecyclerView private ArrayList<String> items; // Allows to remember the last item shown on screen private int lastPosition = -1; public static class ViewHolder extends RecyclerView.ViewHolder { TextView text; // You need to retrieve the container (ie the root ViewGroup from your custom_item_layout) // It's the view that will be animated FrameLayout container; public ViewHolder(View itemView) { super(itemView); container = (FrameLayout) itemView.findViewById(R.id.item_layout_container); text = (TextView) itemView.findViewById(R.id.item_layout_text); } } public CustomAdapter(ArrayList<String> items, Context context) { this.items = items; this.context = context; } @Override public CustomAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.custom_item_layout, parent, false); return new ViewHolder(v); } @Override public void onBindViewHolder(ViewHolder holder, int position) { holder.text.setText(items.get(position)); // Here you apply the animation when the view is bound setAnimation(holder.itemView, position); } /** * Here is the key method to apply the animation */ private void setAnimation(View viewToAnimate, int position) { // If the bound view wasn't previously displayed on screen, it's animated if (position > lastPosition) { Animation animation = AnimationUtils.loadAnimation(context, android.R.anim.slide_in_left); viewToAnimate.startAnimation(animation); lastPosition = position; } } } 

    Und dein custom_item_layout würde so aussehen:

     <FrameLayout android:id="@+id/item_layout_container" xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content"> <TextView android:id="@+id/item_layout_text" android:layout_width="match_parent" android:layout_height="wrap_content" android:textAppearance="?android:attr/textAppearanceListItemSmall" android:gravity="center_vertical" android:minHeight="?android:attr/listPreferredItemHeightSmall"/> </FrameLayout> 

    Weitere Informationen über CustomAdapters und RecyclerView finden Sie in diesem Training auf der offiziellen Dokumentation .

    Probleme beim schnellen Scrollen

    Die Verwendung dieser Methode kann zu Problemen beim schnellen Scrollen führen. Die Ansicht könnte wiederverwendet werden, während die Animation geschieht. Um zu vermeiden, dass es empfehlenswert ist, die Animation zu löschen, wenn es losgelöst ist.

      @Override public void onViewDetachedFromWindow(final RecyclerView.ViewHolder holder) { ((CustomViewHolder)holder).clearAnimation(); } 

    Auf CustomViewHolder:

      public void clearAnimation() { mRootLayout.clearAnimation(); } 

    Alte Antwort:

    Schauen Sie sich Gabriele Mariottis Repo an , ich bin mir ziemlich sicher, dass Sie finden, was Sie brauchen. Er bietet einfache ItemAnimatoren für die RecyclerView, wie SlideInItemAnimator oder SlideScaleItemAnimator.

    Ich animierte verblassen in Recyclerview Artikel, wenn sie zuerst erscheinen, wie in der Code unten gezeigt. Vielleicht ist das für jemanden von Nutzen.

     private final static int FADE_DURATION = 1000 // in milliseconds @Override public void onBindViewHolder(ViewHolder holder, int position) { holder.getTextView().setText("some text"); // Set the view to fade in setFadeAnimation(holder.itemView); } private void setFadeAnimation(View view) { AlphaAnimation anim = new AlphaAnimation(0.0f, 1.0f); anim.setDuration(FADE_DURATION); view.startAnimation(anim); } 

    Sie können auch setFadeAnimation() mit dem folgenden setScaleAnimation() ersetzen, um das Aussehen von Elementen zu beleben, indem Sie sie von einem Punkt aus skalieren:

     private void setScaleAnimation(View view) { ScaleAnimation anim = new ScaleAnimation(0.0f, 1.0f, 0.0f, 1.0f, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f); anim.setDuration(FADE_DURATION); view.startAnimation(anim); } 

    Der oben genannte Code hat einige Warzen, soweit Sie die RecyclerView Elemente scrollen, die immer verblassen oder skalieren. Wenn Sie möchten, können Sie Code hinzufügen, um nur die Animation zu ermöglichen, wenn das Fragment oder die Aktivität, die die RecyclerView zuerst erstellt wird (zB die Systemzeit auf die Erstellung und nur die Animation für die ersten FADE_DURATION-Millisekunden zulassen).

    Ich habe Animation von pbm's Antwort mit wenig modification , um die Aninmation nur einmal zu machen

    Im anderen Wort die Animation appear with you scroll down only

     private int lastPosition = -1; private void setAnimation(View viewToAnimate, int position) { // If the bound view wasn't previously displayed on screen, it's animated if (position > lastPosition) { ScaleAnimation anim = new ScaleAnimation(0.0f, 1.0f, 0.0f, 1.0f, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f); anim.setDuration(new Random().nextInt(501));//to make duration random number between [0,501) viewToAnimate.startAnimation(anim); lastPosition = position; } } 

    Und in onBindViewHolder die Funktion aufrufen

     @Override public void onBindViewHolder(ViewHolder holder, int position) { holder.getTextView().setText("some text"); // call Animation function setAnimation(holder.itemView, position); } 

    Ein guter Ort zum Starten ist: https://github.com/wasabeef/recyclerview-animatoren/blob/master/animatoren/src/main/java/jp/wasabeef/recyclerview/adapters/AnimationAdapter.java

    Du brauchst nicht einmal die ganze Bibliothek, die Klasse reicht aus. Dann, wenn Sie nur implementieren Ihre Adapter-Klasse geben einen Animator wie folgt:

     @Override protected Animator[] getAnimators(View view) { return new Animator[]{ ObjectAnimator.ofFloat(view, "translationY", view.getMeasuredHeight(), 0) }; } @Override public long getItemId(final int position) { return getWrappedAdapter().getItemId(position); } 

    Sie sehen Elemente, die von unten erscheinen, während sie rollen, auch das Problem mit der schnellen Schriftrolle zu vermeiden.

    Animieren von Gegenständen in der recyclerview, wenn sie in den Adapter gebunden sind, ist vielleicht nicht die beste Idee, da das die Gegenstände im recyclerview mit unterschiedlichen Geschwindigkeiten animieren kann. In meinem Fall, das Element am Ende des recyclerview animieren, um ihre Position schneller als die an der Spitze, wie die an der Spitze haben weiter zu reisen, so dass es machte es unordentlich aussehen.

    Der ursprüngliche Code, den ich verwendet habe, um jeden Gegenstand in den recyclerview zu beleben, finden Sie hier:

    http://frogermcs.github.io/Instagram-with-Material-Design-concept-is-getting-real/

    Aber ich werde den Code kopieren und einfügen, falls der Link bricht.

    SCHRITT 1: Setzen Sie diese in Ihre onCreate-Methode, so dass Sie sicherstellen, dass die Animation nur einmal ausgeführt wird:

     if (savedInstanceState == null) { pendingIntroAnimation = true; } 

    SCHRITT 2: Du musst diesen Code in die Methode setzen, in der du die Animation starten möchtest:

     if (pendingIntroAnimation) { pendingIntroAnimation = false; startIntroAnimation(); } 

    In dem Link, der Schriftsteller ist die Animation der Symbolleisten-Symbole, so legte er es in diese Methode:

     @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.menu_main, menu); inboxMenuItem = menu.findItem(R.id.action_inbox); inboxMenuItem.setActionView(R.layout.menu_item_view); if (pendingIntroAnimation) { pendingIntroAnimation = false; startIntroAnimation(); } return true; } 

    SCHRITT 3: Jetzt schreibe die Logik für die startIntroAnimation ():

     private static final int ANIM_DURATION_TOOLBAR = 300; private void startIntroAnimation() { btnCreate.setTranslationY(2 * getResources().getDimensionPixelOffset(R.dimen.btn_fab_size)); int actionbarSize = Utils.dpToPx(56); toolbar.setTranslationY(-actionbarSize); ivLogo.setTranslationY(-actionbarSize); inboxMenuItem.getActionView().setTranslationY(-actionbarSize); toolbar.animate() .translationY(0) .setDuration(ANIM_DURATION_TOOLBAR) .setStartDelay(300); ivLogo.animate() .translationY(0) .setDuration(ANIM_DURATION_TOOLBAR) .setStartDelay(400); inboxMenuItem.getActionView().animate() .translationY(0) .setDuration(ANIM_DURATION_TOOLBAR) .setStartDelay(500) .setListener(new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { startContentAnimation(); } }) .start(); } 

    Meine bevorzugte Alternative:

    Ich würde lieber das ganze recyclerview anstatt der Gegenstände im Recyclerview animieren.

    SCHRITT 1 und 2 bleibt gleich.

    In SCHRITT 3, sobald Ihr API-Anruf mit Ihren Daten zurückkehrt, würde ich die Animation starten.

     private void startIntroAnimation() { recyclerview.setTranslationY(latestPostRecyclerview.getHeight()); recyclerview.setAlpha(0f); recyclerview.animate() .translationY(0) .setDuration(400) .alpha(1f) .setInterpolator(new AccelerateDecelerateInterpolator()) .start(); } 

    Dies würde Ihr ganzes recyclerview animieren, damit es von der Unterseite des Bildschirms hereinfliegt.

    Einfach verlängert den Adapter wie unten

     public class RankingAdapter extends AnimatedRecyclerView<RankingAdapter.ViewHolder> 

    Und füge Super-Methode zu onBindViewHolder hinzu

     @Override public void onBindViewHolder(ViewHolder holder, final int position) { super.onBindViewHolder(holder, position); 

    Es ist automatisiert Weg, um animierte Adapter wie "Basheer AL-MOMANI"

     import android.support.v7.widget.RecyclerView; import android.view.View; import android.view.ViewGroup; import android.view.animation.Animation; import android.view.animation.ScaleAnimation; import java.util.Random; /** * Created by eliaszkubala on 24.02.2017. */ public class AnimatedRecyclerView<T extends RecyclerView.ViewHolder> extends RecyclerView.Adapter<T> { @Override public T onCreateViewHolder(ViewGroup parent, int viewType) { return null; } @Override public void onBindViewHolder(T holder, int position) { setAnimation(holder.itemView, position); } @Override public int getItemCount() { return 0; } protected int mLastPosition = -1; protected void setAnimation(View viewToAnimate, int position) { if (position > mLastPosition) { ScaleAnimation anim = new ScaleAnimation(0.0f, 1.0f, 0.0f, 1.0f, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f); anim.setDuration(new Random().nextInt(501));//to make duration random number between [0,501) viewToAnimate.startAnimation(anim); mLastPosition = position; } } } 

    Erstellen Sie diese Methode in Ihren recyclerview Adapter

     private void setZoomInAnimation(View view) { Animation zoomIn = AnimationUtils.loadAnimation(context, R.anim.zoomin);// animation file view.startAnimation(zoomIn); } 

    Und füge diese Codezeile in onBindViewHolder hinzu

    setZoomInAnimation(holder.itemView);

    Das Android ist ein Google Android Fan-Website, Alles ├╝ber Android Phones, Android Wear, Android Dev und Android Spiele Apps und so weiter.