RecyclerView 항목이 나타날 때 해당 항목을 애니메이션화하는 방법
RecyclerView Items(리사이클러 보기 항목)이 나타날 때 어떻게 애니메이션을 만들 수 있습니까?
기본 항목 애니메이터는 리사이클러 데이터가 설정된 후 데이터가 추가되거나 제거될 때만 애니메이터를 생성합니다.
이것은 어떻게 이루어질 수 있습니까?
편집:
항목 애니메이터 ator에 따르면:
이 클래스는 어댑터를 변경할 때 항목에서 발생하는 애니메이션을 정의합니다.
따라서 당신의 물건들을 하나씩 당신의 물건에 추가하지 않는 한.RecyclerView
그리고 매번 반복할 때마다 뷰를 새로 고친다고는 생각하지 않습니다.ItemAnimator
당신의 필요에 대한 해결책입니다.
여기에 당신이 어떻게 애니메이션을 만들 수 있는지가 있습니다.RecyclerView
Custom Adapter를 사용하여 나타나는 항목:
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;
}
}
}
그리고 custom_item_layout은 다음과 같습니다.
<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>
사용자 지정 및 사용자 지정 어댑터에 은 RecyclerView
, 공식 문서에 대한 이 교육을 참조합니다.
빠른 스크롤의 문제
이 방법을 사용하면 빠른 스크롤에 문제가 발생할 수 있습니다.애니메이션이 진행되는 동안 보기를 재사용할 수 있습니다.이를 방지하려면 분리 시 애니메이션을 지우는 것이 좋습니다.
@Override
public void onViewDetachedFromWindow(final RecyclerView.ViewHolder holder)
{
((CustomViewHolder)holder).clearAnimation();
}
사용자 정의 보기소지자:
public void clearAnimation()
{
mRootLayout.clearAnimation();
}
이전 답변:
가브리엘레 마리오티의 레포를 보세요. 필요한 것을 찾을 수 있을 겁니다.SlideInItem Animator 또는 SlideScaleItem Animator와 같은 간단한 Recycler View용 Item Animator를 제공합니다.
XML로만 단순화
res/anim/layout_animation.xml
<?xml version="1.0" encoding="utf-8"?>
<layoutAnimation xmlns:android="http://schemas.android.com/apk/res/android"
android:animation="@anim/item_animation_fall_down"
android:animationOrder="normal"
android:delay="15%" />
res/anim/항목_ animation_fall_down.xml
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="500">
<translate
android:fromYDelta="-20%"
android:toYDelta="0"
android:interpolator="@android:anim/decelerate_interpolator"
/>
<alpha
android:fromAlpha="0"
android:toAlpha="1"
android:interpolator="@android:anim/decelerate_interpolator"
/>
<scale
android:fromXScale="105%"
android:fromYScale="105%"
android:toXScale="100%"
android:toYScale="100%"
android:pivotX="50%"
android:pivotY="50%"
android:interpolator="@android:anim/decelerate_interpolator"
/>
</set>
다음과 같이 레이아웃 및 리사이클 뷰에 사용합니다.
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recycler_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layoutAnimation="@anim/layout_animation"
app:layout_behavior="@string/appbar_scrolling_view_behavior" />
나는 희미해져 가는 것을 애니메이션으로 만들었습니다.Recyclerview
아래 코드와 같이 처음 등장할 때의 아이템.아마도 이것은 누군가에게 유용할 것입니다.
private final static int FADE_DURATION = 1000; //FADE_DURATION 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);
}
교체할 수도 있습니다.setFadeAnimation()
다음과 같이setScaleAnimation()
항목을 한 점에서 축척하여 항목의 모양을 애니메이션화하려면:
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);
}
위의 코드는 스크롤할 때까지 몇 가지 사마귀가 있습니다.RecyclerView
아이템은 항상 퇴색하거나 축소됩니다.만약 당신이 당신이 코드를 추가할 수 있다면 단지 애니메이션이 발생하도록 허용할 수 있습니다.RecyclerView
먼저 생성됩니다(예: 생성 시 시스템 시간을 가져오고 첫 번째 FADE_DURATION 밀리초 동안만 애니메이션을 허용합니다).
pbm의 답변으로 애니메이션을 만들었지만 거의 없었습니다.modification
애니메이션을 한 번만 방영하게 하다
환언하면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;
}
}
그리고 안에onBindViewHolder
함수를 호출합니다.
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
holder.getTextView().setText("some text");
// call Animation function
setAnimation(holder.itemView, position);
}
추가할 수 있습니다.android:layoutAnimation="@anim/rv_item_animation"
에 귀속시키다RecyclerView
다음과 같이:
<android.support.v7.widget.RecyclerView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layoutAnimation="@anim/layout_animation_fall_down"
/>
여기 훌륭한 기사 감사합니다: https://proandroiddev.com/enter-animation-using-recyclerview-and-layoutanimation-part-1-list-75a874a5d213
시작하기 좋은 방법은 다음과 같습니다. https://github.com/wasabeef/recyclerview-animators/blob/master/animators/src/main/java/jp/wasabeef/recyclerview/adapters/AnimationAdapter.java
도서관 전체도 필요 없어요, 그 수업이면 충분해요.그런 다음 Adapter 클래스를 구현하면 다음과 같은 애니메이터가 제공됩니다.
@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);
}
스크롤할 때 아래에서 나타나는 항목을 볼 수 있으므로 빠른 스크롤 문제도 피할 수 있습니다.
어댑터에서 바인딩된 재활용 보기의 항목을 애니메이션화하는 것은 재활용 보기의 항목을 다른 속도로 애니메이션화할 수 있으므로 가장 좋은 방법은 아닐 수 있습니다.저 같은 경우는 재활용품 보기 끝에 있는 물건이 맨 위에 있는 물건보다 더 빨리 제자리에 도착해서 맨 위에 있는 물건이 더 이동해야 해서 어수선해 보입니다.
각 항목을 재활용 보기로 애니메이션화하는 데 사용한 원본 코드는 다음과 같습니다.
http://frogermcs.github.io/Instagram-with-Material-Design-concept-is-getting-real/
하지만 링크가 끊길 경우를 대비해서 코드를 복사해서 붙여넣겠습니다.
1단계: 애니메이션이 한 번만 실행되도록 onCreate 메서드 내부에 설정합니다.
if (savedInstanceState == null) {
pendingIntroAnimation = true;
}
2단계: 애니메이션을 시작할 방법에 이 코드를 입력해야 합니다.
if (pendingIntroAnimation) {
pendingIntroAnimation = false;
startIntroAnimation();
}
링크에서 작성자는 도구 모음 아이콘을 애니메이션화하고 있으므로 이 방법 안에 입력합니다.
@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;
}
3단계: 이제 시작에 대한 논리를 작성합니다.인트로 애니메이션():
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();
}
내가 선호하는 대안:
저는 리사이클 뷰 안에 있는 아이템 대신 리사이클 뷰 전체를 애니메이션으로 만들고 싶습니다.
1단계와 2단계는 동일하게 유지됩니다.
3단계에서, 당신의 API 호출이 당신의 데이터와 함께 돌아오는 즉시, 나는 애니메이션을 시작할 것입니다.
private void startIntroAnimation() {
recyclerview.setTranslationY(latestPostRecyclerview.getHeight());
recyclerview.setAlpha(0f);
recyclerview.animate()
.translationY(0)
.setDuration(400)
.alpha(1f)
.setInterpolator(new AccelerateDecelerateInterpolator())
.start();
}
이렇게 하면 화면 아래쪽에서 화면이 날아오르게 전체 재활용 보기를 애니메이션화할 수 있습니다.
이 메서드를 재활용 보기 어댑터에 만듭니다.
private void setZoomInAnimation(View view) {
Animation zoomIn = AnimationUtils.loadAnimation(context, R.anim.zoomin);// animation file
view.startAnimation(zoomIn);
}
그리고 마지막으로 BindView에 이 코드 라인을 추가합니다.홀더
setZoomInAnimation(holder.itemView);
2019년에는 모든 아이템 애니메이션을 아이템 애니메이터에 넣을 것을 제안합니다.
먼저 리사이클러 보기에서 애니메이터 선언부터 시작하겠습니다.
with(view.recycler_view) {
adapter = Adapter()
itemAnimator = CustomAnimator()
}
그러면 사용자 지정 애니메이터를 선언합니다.
class CustomAnimator() : DefaultItemAnimator() {
override fun animateAppearance(
holder: RecyclerView.ViewHolder,
preInfo: ItemHolderInfo?,
postInfo: ItemHolderInfo): Boolean{} // declare what happens when a item appears on the recycler view
override fun animatePersistence(
holder: RecyclerView.ViewHolder,
preInfo: ItemHolderInfo,
postInfo: ItemHolderInfo): Boolean {} // declare animation for items that persist in a recycler view even when the items change
}
위에 있는 것들과 비슷한 것이 실종을 위한 것입니다.animateDisappearance
, 추가로animateAdd
, 변변히animateChange
그리고 이동animateMove
.
한 가지 중요한 점은 그 안에 있는 올바른 애니메이션 디스패처를 호출하는 것입니다.
이렇게 사용하는 것이 더 나을 것 같습니다. (RecycleerView 어댑터에서는 한 가지 방법만 재정의함)
override fun onViewAttachedToWindow(holder: ViewHolder) {
super.onViewAttachedToWindow(holder)
setBindAnimation(holder)
}
RV에 있는 모든 첨부 애니메이션을 원하는 경우.
아래와 같이 어댑터를 확장하기만 하면 됩니다.
public class RankingAdapter extends AnimatedRecyclerView<RankingAdapter.ViewHolder>
BindView에 수퍼 메소드를 추가합니다.홀더
@Override
public void onBindViewHolder(ViewHolder holder, final int position) {
super.onBindViewHolder(holder, position);
"Bassheer 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;
}
}
}
언급URL : https://stackoverflow.com/questions/26724964/how-to-animate-recyclerview-items-when-they-appear
'programing' 카테고리의 다른 글
CSS 배경 이미지를 너비에 맞게 조정하고 높이를 비례하여 자동으로 조정해야 함 (0) | 2023.10.26 |
---|---|
jQuery의 $.ajax URL 인코딩 문제 (0) | 2023.10.26 |
WooCommerce 무료배송 라벨 맞춤 기능 (0) | 2023.10.26 |
C 스트링에서 첫 번째 캐릭터를 제거하는 방법? (0) | 2023.10.26 |
Oracle : 날짜를 시간 단위로만 비교합니다. (0) | 2023.10.26 |