Android перетаскивание возвышения на карточку с помощью itemTouchHelper в Recyclerview - PullRequest
0 голосов
/ 18 октября 2018

У меня проблема с выяснением того, как дать cardViews временное повышение при перетаскивании.Я использую представление переработчика с cardViews, и это мой itemtouchhelper:

class ListTouchHelper extends ItemTouchHelper.Callback {

    private final ActionCompletionContract contract;

    public ListTouchHelper(ActionCompletionContract contract) {
        this.contract = contract;
    }
    @Override
    public int getMovementFlags(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder) {
        int dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN;
        int swipeFlags = ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT;
        return makeMovementFlags(dragFlags, swipeFlags);
    }

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

    @Override
    public void onSwiped(@NonNull RecyclerView.ViewHolder viewHolder, int direction) {
        if (direction == ItemTouchHelper.LEFT) {
            contract.onViewSwipedLeft(viewHolder.getAdapterPosition());
        } else if (direction == ItemTouchHelper.RIGHT) {
            contract.onViewSwipedRight(viewHolder.getAdapterPosition());
        }
    }

    public interface ActionCompletionContract {
        void onViewMoved(int oldPosition, int newPosition);
        void onViewSwipedLeft(int position);
        void onViewSwipedRight(int position);
    }
}

Мне удалось временно повысить его:enter image description here

Что привело к: (тени как-то обрезаны?)enter image description here

Однако, как только вид немного переместится, высота исчезнет:enter image description here

У меня вопрос: как мне получить возвышение (включая тени) при перетаскивании карт?

Заранее спасибо!

1 Ответ

0 голосов
/ 28 октября 2018

Хорошо, так что я решил, вроде.Я думаю, что по какой-то другой причине он не работает по умолчанию, однако мне удалось написать обходной путь.

private boolean first = true; //first draw of cardView?
private boolean last = false; //last draw of cardView?

@Override
public void onChildDraw(@NonNull Canvas c, @NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder, float dX, float dY, int actionState, boolean isCurrentlyActive) {
    //add elevation on first draw
    if (first) {
        ViewPropertyAnimator animator = viewHolder.itemView.animate();
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { //consider SDK version
            viewHolder.itemView.setTranslationZ(7);
            animator.start();
        }
        first = false;
    }
    //remove translationZ in last edit
    if (last) {
        ViewPropertyAnimator animator = viewHolder.itemView.animate();
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { //consider SDK version
            viewHolder.itemView.setTranslationZ(0);
            animator.start();
        }
        //reset values
        last=false;
        first=true;
    }
    super.onChildDraw(c, recyclerView, viewHolder, dX, dY, actionState, isCurrentlyActive);
}

@Override
public void clearView(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder) {
    super.clearView(recyclerView, viewHolder);
    last = true; //only one more OnChildDrawWillBeCalled
}

Приведенный выше код добавлен в ваш ItemTouchHelper.Callback, и все должно работать.Основная идея состоит в том, чтобы вручную контролировать рисование перевода.Для этого я выясняю, когда рисуется первый холст, а когда последний, тогда как канкас будет показывать тень.

Еще один комментарий: ViewPropertyAnimator в сочетании с файлом макета xml невероятноне интуитивно понятный и глючный, поэтому, если вы можете избежать этого, я бы порекомендовал сделать это, и вместо этого попытался бы программно анимировать изменения и эффекты представления.

Надеюсь, это кому-нибудь поможет.

...