滚动时 Recyclerview 图像动画

Recyclerview image animation when scrolled

我有一个从 firestore 获取数据的 recyclerview。它有图像和文字。滚动 recyclerview 时我需要旋转图像。我添加了参考视频。我需要做的完全一样。

CategoriesAdapter.java

package com.blackevil.zipuser;

import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.widget.TextView;

import androidx.annotation.NonNull;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import com.bumptech.glide.Glide;
import com.firebase.ui.firestore.FirestoreRecyclerAdapter;
import com.firebase.ui.firestore.FirestoreRecyclerOptions;
import com.google.android.material.snackbar.Snackbar;
import com.google.firebase.firestore.FirebaseFirestore;

import de.hdodenhof.circleimageview.CircleImageView;

public class CategoriesAdapter extends FirestoreRecyclerAdapter<Cuisines, CategoriesAdapter.ViewHolder> {


    FirebaseFirestore db = FirebaseFirestore.getInstance();

    /**
     * Create a new RecyclerView adapter that listens to a Firestore Query.  See {@link
     * FirestoreRecyclerOptions} for configuration options.
     *
     * @param options
     */
    public CategoriesAdapter(@NonNull FirestoreRecyclerOptions<Cuisines> options) {
        super(options);
    }

    @Override
    protected void onBindViewHolder(@NonNull ViewHolder holder, int position, @NonNull Cuisines model) {
        holder.textView.setText(model.getName());
        Glide.with(holder.itemView.getContext())
                .load(model.getCover())
                .into(holder.imageView);
    }

    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.categories_rv_item, parent, false);

        return new ViewHolder(view);
    }

    public class ViewHolder extends RecyclerView.ViewHolder {

        TextView textView;
        CircleImageView imageView;

        public ViewHolder(@NonNull View itemView) {
            super(itemView);

            textView = itemView.findViewById(R.id.cat_name);
            imageView = itemView.findViewById(R.id.cat_image);

        }
    }

}

这是我的片段

DiscoverFragment.java
public class DiscoverFragment extends Fragment {

    private static final String TAG = "Discover Fragment" ;
    FirebaseFirestore db = FirebaseFirestore.getInstance();
    LinearLayoutManager linearLayoutManager;
    private RecyclerView recyclerView;
    private CategoriesAdapter adapter;

    public DiscoverFragment() {
    }


    public static DiscoverFragment newInstance(String param1, String param2) {
        DiscoverFragment fragment = new DiscoverFragment();
        return fragment;
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }

    public void getListItems() {
        Query query = db.collection("cuisines");

        FirestoreRecyclerOptions<Cuisines> options = new FirestoreRecyclerOptions.Builder<Cuisines>()
                .setQuery(query, Cuisines.class)
                .build();

        adapter = new CategoriesAdapter(options);
        adapter.registerAdapterDataObserver(new RecyclerView.AdapterDataObserver() {
            @Override
            public void onChanged() {
                super.onChanged();
            }
        });
        adapter.startListening();
        adapter.notifyDataSetChanged();
        recyclerView.setAdapter(adapter);
    }




    @Override
    public void onStart() {
        super.onStart();
        getListItems();
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        ViewGroup root = (ViewGroup) inflater.inflate(R.layout.fragment_discover, container, false);
        linearLayoutManager = new LinearLayoutManager(getActivity(), LinearLayoutManager.HORIZONTAL, false);
        recyclerView = (RecyclerView) root.findViewById(R.id.categories_rv);
        recyclerView.setHasFixedSize(true);
        recyclerView.setLayoutManager(linearLayoutManager);
        return root;
    }

需要这样的东西

https://drive.google.com/file/d/1dLIFYfx1DN-FO_7J7zfnvHxjdR8rN6F6/view

DiscreteScrollView discreteScrollView = findViewById(R.id.listview_images);

discreteScrollView.setOrientation(DSVOrientation.HORIZONTAL); //Sets an orientation of the view
discreteScrollView.setOffscreenItems(1); //Reserve extra space equal to (childSize * count) on each side of the view
discreteScrollView.setOverScrollEnabled(true);
discreteScrollView.setSlideOnFling(true);


MyAdapter adapter = new MyAdapter();
discreteScrollView.setAdapter(adapter);

discreteScrollView.setItemTransformer((item, position) -> {
    ImageView imageView = item.findViewById(R.id.imageView);
    imageView.setRotation(position * 180f);


    item.setPivotX(item.getWidth() / 2.0f);
    item.setPivotY(item.getHeight() / 2.0f);
    float scale = 1 - 0.3f * Math.abs(position);
    item.setScaleX(scale);
    item.setScaleY(scale);
});

这是它的样子: https://www.dropbox.com/s/vwf4vpvrsk89ewy/2020-11-05%2016-22-28.mp4?dl=0

为此我使用了这个库: https://github.com/yarolegovich/DiscreteScrollView

但您也可以使用另一个 (https://github.com/BCsl/GalleryLayoutManager),它的工作原理几乎相同。