簡體   English   中英

在ViewHolder的RecyclerView項目中清除動畫

[英]Clear Animation in ViewHolder's item RecyclerView

我正在使用RecyclerView並具有一些動畫,在其中我放大了ViewHolder項目中RelativeLayout之一。

注意:它不是添加/刪除/插入動畫。 當用戶在ViewHolder項目中進行交互時開始。 因此,我在這里不使用ItemAnimator。

動畫效果很好,但它會在某些隨機的View項目中重新出現(最終狀態)。 我知道這是由於項目的重復使用造成的,我也正在清除動畫,但這並沒有幫助。

@Override
public void onBindViewHolder(ViewHolder viewHolder, int position) {
    Model model = getModelObject(position);
    ((Model) viewHolder.itemView).showItem(position);   
}

我在showItem中這樣做

        relativeLayout.clearAnimation();
        relativeLayout.setAnimation(null);

在onViewDetachedFromWindow中

@Override
public void onViewDetachedFromWindow(ViewHolder holder) {
    ((ItemView) holder.itemView).clearAllAnimations();
    super.onViewDetachedFromWindow(holder);

}

ClearAllAnimations

    public void clearAllAnimations() {
    for (RelativeLayout layout : layoutArray) {
        optionLayout.clearAnimation();
        optionLayout.setAnimation(null);
    }

這是我如何為視圖設置動畫

public AnimatorSet onDragStartAnimation(RelativeLayout group[]) {

    AnimatorSet big = new AnimatorSet();
    for (RelativeLayout relativeLayout : group) {
        ObjectAnimator scaleXSmall = ObjectAnimator.ofFloat(relativeLayout, "scaleX", 1.0f, 0.85f);
        ObjectAnimator scaleYSmall = ObjectAnimator.ofFloat(relativeLayout, "scaleY", 1.0f, 0.85f);

        big.playTogether(scaleXSmall, scaleYSmall);
    }

    return big;
}

它不起作用。 RelativeLayout不會重置,並且在某些隨機的View Item中顯示為放大狀態。

更新

我做了一個小實驗:像這樣在ViewHolder項目的ImageView上設置alpha動畫

Animation fadeInAnimation = AnimationUtils.loadAnimation(mContext, R.anim.fadein);
imageView.startAnimation(fadeInAnimation);

並使用了清晰的動畫。 imageView.clearAnimation(); 它起作用了,當ViewItem下次出現在屏幕上時,ImageView正常可見。

但是如果我這樣做同樣行不通

alphaAnimator = ObjectAnimator.ofFloat(centerImageView, "alpha", 1.0f, 0.5f);
        alphaAnimator.start();

並清除這個

        alphaAnimator.removeAllListeners();
        alphaAnimator.cancel();
        alphaAnimator.end();

這沒有用。 Alpha動畫保留在ViewHolder圖像項中。

我通過在onViewDetachedFromWindow中對所有動畫制作者進行反向動畫來解決它。

@Override
public void onViewDetachedFromWindow(ViewHolder holder) {
    if (holder.getItemViewType() == 1) ((MyItemView) holder.itemView).reverseAllAnimations();
}

我以這種方式解決了問題。 一切正常。

GroupsViewHolder-這是自定義RecyclerView.ViewHolder

@Override
    public void onViewAttachedToWindow(GroupsViewHolder holder) {
        super.onViewAttachedToWindow(holder);
        //here add animation
    }

    @Override
    public void onViewDetachedFromWindow(GroupsViewHolder holder) {
        //here clear animation
        super.onViewDetachedFromWindow(holder);
    }

通過從Crymson的答案的 crymson的答案中得到啟發,我使用View的標記方法,而不是在自定義適配器的復雜邏輯中設置了布爾值,從而使解決方案變得簡單而實用。

@Override
public void onViewDetachedFromWindow(RecyclerView.ViewHolder holder) {
    super.onViewDetachedFromWindow(holder);
    if (holder.getItemViewType() == TYPE_AD)
        ((ViewHolderForAd) holder).ivStory.setTag(false);
}


public class ViewHolderForAd extends RecyclerView.ViewHolder {
        private ImageView ivStory;
        TextView tvName;

    public ViewHolderForAd(View view) {
        super(view);
        ivStory = (ImageView) view.findViewById(R.id.ivStoryImage);
        tvName = (TextView) view.findViewById(R.id.tvAppName);
        view.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                int pos = getAdapterPosition();
                if (pos < 0) {
                    pos = (int) v.getTag();
                }
                customItemClickListener.onItemClicked(v, pos);
            }
        });

       //ivStory.startAnimation(AnimationUtils.loadAnimation(context, R.anim.pulse_story));
        ivStory.setTag(false); //Set default tag false to decrease risk of null
    }
}

 @Override
    public void onBindViewHolder(RecyclerView.ViewHolder viewHolder, int i) {
//...Your code...
if (!(boolean) holder1.ivStory.getTag()) {
     holder1.ivStory.setTag(true);
     holder1.ivStory.startAnimation(AnimationUtils.loadAnimation(context, R.anim.pulse_story));
}
//...Your code...//
}

如果已經在imageView中標記了某些東西(例如位置),則可以使用setTag(key,object)代替setTag(object)。 希望這對某人有幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM