РецицлерВиев користи ИтемТоуцхХелпер за постизање интерактивне анимације

Recyclerview Use Itemtouchhelper Achieve Interactive Animation



Горе наведено је повукло ставку горе-доле и клизајући ефекат лево и десно, али само ефекат анимације тренутне ставке, следеће наставља да употпуњује ефекат интеракције са другим ставкама.

1. Размените позицију са другим ставкама приликом повлачења горе-доле

1) Начело

У ствари, ИтемТоуцхХелпер.Цаллбацк сам по себи нема функцију замене две ставке, али РецицлерВиев може, можемо разменити тренутну ставку са положајем података друге ставке када се ставка превуче, а затим позвати методу нотифиИтемМовед () РецицлерВиев за освежавање. Изглед, истовремено, јер РецицлерВиев долази са анимацијом предмета, можете довршити горњу интеракцију.



2) Имплементација

Превлачење ставке ће се преслушати у ИтемТоуцхХелпер.Цаллбацк, а обрада података врши се у адаптеру. Да бисте смањили спрегу, прво напишите интерфејс:



public interface ItemMoveListener { boolean onItemMove(int fromPosition, int toPosition) }Copy code

Интерфејс имплементира Адаптер



public class ItemTouchHelperAdapter extends RecyclerView.Adapter<ItemTouchHelperAdapter.ItemTouchHelperViewHolder> implements ItemMoveListener{ ... @Override public boolean onItemMove(int fromPosition, int toPosition) { //1, exchange data Collections.swap(mData, fromPosition, toPosition) //2, refresh notifyItemMoved(fromPosition, toPosition) return true } }Copy code

Интерфејс се предаје када се креира ИтемТоуцхХелпер.Цаллбацк, позван у онМове ()

public class MyItemTouchHelperCallback extends ItemTouchHelper.Callback { ItemMoveListener mItemMoveListener public MyItemTouchHelperCallback(ItemMoveListener itemMoveListener) { mItemMoveListener = itemMoveListener } ... /** * Triggered when item drags and moves * * @param recyclerView * @param viewHolder viewHolder of the currently dragged item * @param targetViewHolder The viewHolder of another item below the currently dragged item * @return */ @Override public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder targetViewHolder) { return mItemMoveListener.onItemMove(viewHolder.getAdapterPosition(), targetViewHolder.getAdapterPosition()) } }Copy code

3) Ефекат:

2, када извучете екран лево и десно, додају се друге ставке.

1) Начело

Исто, све док ставка клизи са екрана, бришите одговарајуће податке, а затим позовите РецицлерВиев методу нотифиИтемРемовед () да бисте освежили изглед.

2) Имплементација

Слајд ставке ће се преслушати у ИтемТоуцхХелпер.Цаллбацк, а поступак брисања података врши се у адаптеру, па је потребно додати методу у горњи интерфејс:



public interface ItemMoveListener { ... boolean onItemRemove(int position) }Copy code

Интерфејс имплементира Адаптер

public class ItemTouchHelperAdapter extends RecyclerView.Adapter<ItemTouchHelperAdapter.ItemTouchHelperViewHolder> implements ItemMoveListener{ ... @Override public boolean onItemRemove(int position) { //1, delete data mData.remove(position) //2, refresh notifyItemRemoved(position) return true } }Copy code

Интерфејс се позива у ИтемТоуцхХелпер.Цаллбацк у онСвипед ()

/** * Triggered when the item slides out (the vertical list is sideways and the horizontal list is vertical) * * @param viewHolder * @param direction direction of sliding */ @Override public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) { mItemMoveListener.onItemRemove(viewHolder.getAdapterPosition()) }Copy code

3) Ефекат:

Већина ефеката је сада имплементирана, након чега следи детаљна обрада.

3. Промене позадине током интеракције

1) Начело

Боја позадине се мења када се ставка превуче или прескочи, а боја позадине се обнавља када се радња заврши. ИтемТоуцхХелпер.Цаллбацк има тачно две методе које одговарају та два стања: онСелецтедЦхангед () и цлеарВиев ().

2) Имплементација

/** * Triggered when item is dragged or skided * * @param viewHolder * @param actionState The current state of the item */ @Override public void onSelectedChanged(RecyclerView.ViewHolder viewHolder, int actionState) { super.onSelectedChanged(viewHolder, actionState) / / Whether it is dragging or sliding, the background color will change if (actionState != ItemTouchHelper.ACTION_STATE_IDLE) viewHolder.itemView.setBackgroundColor(viewHolder.itemView.getContext().getResources().getColor(android.R.color.darker_gray)) } /** * Triggered when the item's interactive animation ends * * @param recyclerView * @param viewHolder */ @Override public void clearView(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) { super.clearView(recyclerView, viewHolder) viewHolder.itemView.setBackgroundColor(viewHolder.itemView.getContext().getResources().getColor(android.R.color.white)) }Copy code

3) Ефекат

4, градијент предмета при клизању лево и десно

1) Анализа и примена

На првој слици, када се предмет избаци, можете видети да је прозирност предмета постепено лакша и да се висина постепено смањује. У ствари, нека ставка изводи две врсте анимација атрибута, у ИтемТоуцхХелпер.Цаллбацк. Постоји начин да се добије промена померања када се ставка повуче или превуче, то је метода онЦхилдДрав (), па је то врло лако учинити, погледајте следећу примену кода:

@Override public void onChildDraw(Canvas c, RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, float dX, float dY, int actionState, boolean isCurrentlyActive) { / / This code is the implementation of item drag and slide effects, so this sentence can not be omitted super.onChildDraw(c, recyclerView, viewHolder, dX, dY, actionState, isCurrentlyActive) //We only need to reduce the value of transparency and height when sliding left and right (1 --> 0) if (actionState == ItemTouchHelper.ACTION_STATE_SWIPE) { float value = 1 - Math.abs(dX) / viewHolder.itemView.getWidth() viewHolder.itemView.setAlpha(value) viewHolder.itemView.setScaleY(value) } }Copy code

2) Ефекат (са недостацима)

Може се видети да предмет током поступка клизања постепено постаје прозиран и смањује се. Међутим, очигледно сам обрисао два и колико су два празна податка на листи резултата! Зато?

3) Поправак

У ствари, на горњој слици нема више од два празна податка, то су нормални подаци, једноставно их не могу видети. То је зато што је ставка РецицлерВиев (итемВиев) замењена, а итемВиев је провидан у методи онЦхилдДрав (). И умањите, а само неколико ставки је фиксирано на листи. Када се поново користе два прозирна и смањена итемВиевс, претходно постављени однос транспарентности и висине је већ 0, па се то догађа и решење је врло једноставно, све док је ставка уклоњена, вратите однос транспарентности и висине итемВиев , код је следећи:

/** * Triggered when the item's interactive animation ends * * @param recyclerView * @param viewHolder */ @Override public void clearView(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) { super.clearView(recyclerView, viewHolder) ... viewHolder.itemView.setAlpha(1) viewHolder.itemView.setScaleY(1) }Copy code

4) Ефекат (савршен)

У овом тренутку су имплементиране све почетне интеракције.

На крају, приложите демо везу.

гитхуб.цом/ГитЛкр/Мате…