1

私は新しい API 21 (Lollipop) を使用してアプリを作成しています。recyclerview でアニメーション slide_in_left を設定して cardview を 1 つずつアニメーション化していますが、アイテムが表示されるとそれらが一緒になり、1 つずつ Slide_in_left にしたいのですが、2 番目にツールバー バーをアニメーション化しています。作業を非表示/表示しますが、問題は上にスクロールしてrecyclerviewが停止すると非表示になり、下にスクロールすると同じケースになります。前もって感謝します

以下は、リサイクラービュー アニメーションの Myadapter クラスです。

public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder> {

private ArrayList<PersonData> peopleDataSet;
private Context context;
View view;
public static class MyViewHolder extends RecyclerView.ViewHolder {

    TextView textViewName;
    TextView textViewEmail;
    ImageView imageViewIcon;

    public MyViewHolder(View itemView) {
        super(itemView);
        this.textViewName = (TextView) itemView.findViewById(R.id.textViewName);
        this.textViewEmail = (TextView) itemView.findViewById(R.id.textViewEmail);
        this.imageViewIcon = (ImageView) itemView.findViewById(R.id.imageView);
    }
}

public MyAdapter(ArrayList<PersonData> people,Context context) {
    this.peopleDataSet = people;
    this.context=context;
}

@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent,
                                       int viewType) {
    view = LayoutInflater.from(parent.getContext())
            .inflate(R.layout.cards_layout, parent, false);

    view.setOnClickListener(MainActivity.myOnClickListener);
  setAnimation(view);
    MyViewHolder myViewHolder = new MyViewHolder(view);
    return myViewHolder;
}

@Override
public void onBindViewHolder(final MyViewHolder holder, final int listPosition) {

    TextView textViewName = holder.textViewName;
    TextView textViewEmail = holder.textViewEmail;
    ImageView imageView = holder.imageViewIcon;

    textViewName.setText(peopleDataSet.get(listPosition).getName());
    textViewEmail.setText(peopleDataSet.get(listPosition).getEmail());
    imageView.setImageResource(peopleDataSet.get(listPosition).getImage());

}

@Override
public int getItemCount() {
    return peopleDataSet.size();
}
/**
 * Here is the key method to apply the animation
 */
private void setAnimation(View viewToAnimate)
{
    // If the bound view wasn't previously displayed on screen, it's animated
    Animation animation = AnimationUtils.loadAnimation(context, android.R.anim.slide_in_left);
        viewToAnimate.startAnimation(animation);

}

以下はツールバーコードです

@SuppressLint("NewApi") @Override
        public void onScrolled(RecyclerView recyclerView, int dx, int dy) {

            super.onScrolled(recyclerView, dx, dy);

            if (dy > 0) {
                toolbar.animate()
                        .translationY(-toolbar.getBottom())
                        .setInterpolator(new AccelerateInterpolator())
                        .start();



            } else {

                toolbar.animate()
                        .translationY(0)
                        .setInterpolator(new AccelerateInterpolator())
                        .start();


            }
4

1 に答える 1

4

残念ながら、 でRecyclerViewスクロール中のアニメーションはサポートされていませんRecyclerView.ItemAnimator

RecyclerView アイテムのアニメーションを 1 つずつ実現したい場合は、各viewHolder.itemView内部onBindViewメソッドをアニメーション化する必要があります。最後のアニメーション位置を追跡することは、下にスクロールするときにアニメーションを回避するために重要です。

これが私が行った簡単なアルファアニメーションです:

public interface RecyclerViewItemOnScrollAnimator {
    public void onAnimateViewHolder(RecyclerView.ViewHolder viewHolder, int position);
    public void onPrepareToAnimateViewHolder(RecyclerView.ViewHolder viewHolder);
}

これがの実装ですAnimator(一種の、より良い名前を思い付くことができませんでした)

public class RecyclerViewScrollAnimator implements RecyclerViewItemOnScrollAnimator{
    private final LinearLayoutManager mLayoutManager;
    private final RecyclerView mRecyclerView;
    private final Interpolator mInterpolator;
    int mLastAnimatedPosition = RecyclerView.NO_POSITION;

    public RecyclerViewScrollAnimator(RecyclerView recyclerView) {
        mLayoutManager = (LinearLayoutManager) recyclerView.getLayoutManager();
        mRecyclerView = recyclerView;
        mInterpolator = InterpolatorUtil.loadInterpolator(recyclerView.getContext());
    }

    @Override
    public void onAnimateViewHolder(RecyclerView.ViewHolder viewHolder, int position) {
        onPrepareToAnimateViewHolder(viewHolder);
        if(shouldAnimateOrPrepare(position)){
            ViewCompat.animate(viewHolder.itemView)
                    .alpha(1)
                    .setInterpolator(mInterpolator)
                    .setDuration(300).start();
        }
        mLastAnimatedPosition = position;
    }

    private boolean shouldAnimateOrPrepare(int position) {
       return mLastAnimatedPosition == RecyclerView.NO_POSITION || mLastAnimatedPosition < position;
    }

    @Override
    public void onPrepareToAnimateViewHolder(RecyclerView.ViewHolder viewHolder) {
     // do some stuff if needed before animation
     if(shouldAnimateOrPrepare(position)){
        ViewCompat.setAlpha(viewHolder.itemView, 0);
     }
    }
    //clear animation if needed
    private void cancelAnimationAt(int position) {
      RecyclerView.ViewHolder v =  mRecyclerView.findViewHolderForPosition(position);
      if(!isVisible(position) || v != null){
          if(v != null) {
              Log.i("cancelAnimationAt", " canceling "+position);
              //cancelAnimation(v.itemView);
          }
      }

    }

    private void cancelAnimation(View v) {
       if(v != null) {
        v.clearAnimation();
        v.setAnimation(null);
        ViewCompat.animate(v).cancel();
      }
    }

    private boolean isVisible(int position){
        return position >= mLayoutManager.findFirstVisibleItemPosition() && position <= mLayoutManager.findLastVisibleItemPosition();
    }

}

そして、これがあなたの中でそれをどのように使用するかですRecyclerView.Adapter

 @Override
    public void onBindViewHolder(RecyclerView.ViewHolder vh, int position) {
      if(getItemViewType(position) == VIEW_TYPE_ITEM) {
          bindItem(vh, position-1); // position only if no header otherwise position-1
          mRecyclerViewAnimator.onAnimateViewHolder(vh, position);
      }
      else return; // don't bind the header
    }

onAnimateViewHolder()ここで、アニメーション リソースを使用するように内部のコードを変更する必要があります。それは些細なことです。

あなたのToolbarトグルでは、このライブラリを使用することをお勧めします。目的に合わせて非常に便利なスクロール コールバックがあります。

于 2015-01-08T23:36:04.413 に答える