CardView 滑动操作 - Material - Android Java

CardView swipe action - Material - Android Java

Material.IO 文档中是否有任何演示或示例可以实现滑动行为? https://material.io/components/cards#behavior

我找不到真正的移动感和彩色动画的方法。基本上我不知道如何制作这个例子。

谢谢!

如果您使用的是 RecyclerView,则可以使用代码实验室中的此文档实现滑动功能。希望这可以帮助。

https://codelabs.developers.google.com/codelabs/android-training-cards-and-colors/index.html?index=..%2F..android-training#4

更新:

如果您的目标是已发布的内容,此 可能会对您有所帮助。

我得到了这个工作:

ItemTouchHelper.Callback itemTouchCallback = new ItemTouchHelper.Callback() {
            private boolean swipeBack = false;
            private boolean hitMax = false;
            @Override
            public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
                if (viewHolder instanceof LocationsDetailAdapter.LocationsDetailViewHolder) {
                    int swipeFlags = ItemTouchHelper.END;
                    return makeMovementFlags(0, swipeFlags);
                } else
                    return 0;
            }

            @Override
            public boolean onMove(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder, @NonNull RecyclerView.ViewHolder target) {
                return true;
            }

            @Override
            public void onSwiped(@NonNull RecyclerView.ViewHolder viewHolder, int direction) {

            }

            @Override
            public void clearView(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
                hitMax = false;
                getDefaultUIUtil().clearView(((LocationsDetailAdapter.LocationsDetailViewHolder) viewHolder).getForeground());
            }

            @Override
            public void onSelectedChanged(RecyclerView.ViewHolder viewHolder, int actionState) {
                if (viewHolder != null) {
                    getDefaultUIUtil().onSelected(((LocationsDetailAdapter.LocationsDetailViewHolder) viewHolder).getForeground());
                }
            }

            @SuppressLint("ClickableViewAccessibility")
            @Override
            public void onChildDraw(Canvas c, RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, float dX, float dY, int actionState, boolean isCurrentlyActive) {
                recyclerView.setOnTouchListener(new View.OnTouchListener() {
                    @Override
                    public boolean onTouch(View v, MotionEvent event) {
                        if(event.getAction() == MotionEvent.ACTION_UP || event.getAction() == MotionEvent.ACTION_CANCEL) {
                            swipeBack = true;
                        } else {
                            swipeBack = false;
                        }
                        return false;
                    }
                });
                if(dX >= 150f) {
                    dX = 150f;
                    if (!hitMax) {
                        setCardFavorite(arrayLockers.get(viewHolder.getAdapterPosition()), (LocationsDetailAdapter.LocationsDetailViewHolder) viewHolder);
                    }
                    hitMax = true;
                }
                getDefaultUIUtil().onDraw(c, recyclerView, ((LocationsDetailAdapter.LocationsDetailViewHolder) viewHolder).getForeground(), dX, dY, actionState, isCurrentlyActive);
            }

            @Override
            public int convertToAbsoluteDirection(int flags, int layoutDirection) {
                return swipeBack ? 0 : super.convertToAbsoluteDirection(flags, layoutDirection);
            }
        };

        ItemTouchHelper itemTouchHelper = new ItemTouchHelper(itemTouchCallback);
        itemTouchHelper.attachToRecyclerView(recyclerView);


        return view;
    }
public void setCardFavorite(Locker locker, LocationsDetailAdapter.LocationsDetailViewHolder holder){
        final RelativeLayout background_selected = holder.getBackground_selected();
        final CardView card = holder.getLocationDetailCard();

        Animator anim;
        if(!locker.isFavorite()){
            anim = ViewAnimationUtils.createCircularReveal(background_selected, 75, 75, 0, (float) Math.hypot(background_selected.getWidth(), background_selected.getHeight()));
            background_selected.setVisibility(View.VISIBLE);
            final float scale = getResources().getDisplayMetrics().density;
            int pixels = (int) (getResources().getDimension(R.dimen.spacing_small) * scale + 0.5f);
            ViewGroup.MarginLayoutParams layoutParams =
                    (ViewGroup.MarginLayoutParams) card.getLayoutParams();
            layoutParams.setMargins(pixels, 0, 0, 0);
            card.requestLayout();
            locker.setFavorite(true);
            Toast.makeText(getContext(), "Adicionou a fechadura aos favoritos!", Toast.LENGTH_SHORT).show();
            anim.setDuration(1000);
        } else {
            anim = ViewAnimationUtils.createCircularReveal(background_selected, 75, 75, (float) Math.hypot(background_selected.getWidth(), background_selected.getHeight()), 0);
            anim.addListener(new AnimatorListenerAdapter() {
                @Override
                public void onAnimationEnd(Animator animation) {
                    super.onAnimationEnd(animation);
                    background_selected.setVisibility(View.INVISIBLE);
                }
            });
            ViewGroup.MarginLayoutParams layoutParams =
                    (ViewGroup.MarginLayoutParams) card.getLayoutParams();
            layoutParams.setMargins(0, 0, 0, 0);
            card.requestLayout();
            locker.setFavorite(false);
            Toast.makeText(getContext(), "Removeu a fechadura dos favoritos!", Toast.LENGTH_SHORT).show();
            anim.setDuration(300);

        }
        anim.start();
    }