Как использовать анимацию поворота при перетаскивании вида, чтобы центральное положение постоянно менялось?Решить вопрос от степени к степени - PullRequest
2 голосов
/ 13 апреля 2019

В моем окне повторного просмотра я хочу, чтобы все элементы перемешивались / колебались / покачивались, когда пользователь удерживает элемент и перемещает его.Проблема, с которой я сталкиваюсь, заключается в том, что когда пользователь удерживает элемент и перемещает его в том же типе представления, покачивание в порядке, но когда кто-то перетаскивает его в верхнюю часть просмотра реселлера (который представляет собой заголовок, созданный как вид представления в представлении рециркулятора),покачивание сильно увеличивается.

Поиграв со значениями, я понял, что это потому, что, хотя угол поворота один и тот же, чем дальше он удалялся от центра предмета, тем раньше вращение увеличивалось.

Я пытался сделатьэто также и с аниматором объектов, но это не помогло, поскольку у этого тоже была та же проблема угла поворота.

Вот мой код покачивания

<rotate xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="100"
    android:fromDegrees="-5"
    android:pivotX="50%"
    android:pivotY="50%"
    android:repeatCount="infinite"
    android:repeatMode="reverse"
    android:toDegrees="5" />

Вот видео о том, какэто выглядит - ссылка

В логике bindView для начала анимации

((VHItem) holder).rlContainer.setOnLongClickListener(new View.OnLongClickListener()
                {
                    @Override
                    public boolean onLongClick(View view)
                    {
                        if (buPostModelList != null)
                        {
                            startAnimationItem = true;
                            isDragCover = true;
                            isEditCoverImage = false;
                            for (int i = 0; i <= buPostModelList.size(); i++)
                            {
                                if (recyclerView.getChildAt(i) != null && recyclerView.getChildViewHolder(recyclerView.getChildAt(i)).getItemViewType() != TYPE_HEADER)
                                {
                                    recyclerView.getChildAt(i).startAnimation(AnimationUtils.loadAnimation(context, R.anim.jiggle));
                                }
                            }
                            touchHelper.startDrag(holder);
                        }
                        return true;
                    }
                });

РЕДАКТИРОВАНИЕ Пример проекта - ссылка

1 Ответ

2 голосов
/ 19 апреля 2019

При перемещении вида центр вращения остается в исходном положении, но вид все еще перемещается на пять градусов назад и вперед, так что это похоже на перемещение от центра карусели к периферии, где движение на пять градусов покрывает большее расстояние за то же время.

Я предлагаю вам перейти на ObjectAnimator , у которого нет этой проблемы.

ObjectAnimator
Этот подкласс ValueAnimator обеспечивает поддержку анимации свойств целевых объектов. Конструкторы этого класса принимают параметры, чтобы определить целевой объект, который будет анимирован, а также имя свойства, которое будет анимировано. Соответствующие функции set / get затем определяются внутри, и анимация будет вызывать эти функции по мере необходимости для анимации свойства.

jiggle.xml
Это новый ObjectAnimator xml для эффекта покачивания. Это очень похоже на ваш jiggle.xml .

<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="100"
    android:propertyName="rotation"
    android:repeatCount="-1"
    android:repeatMode="reverse"
    android:valueFrom="-5"
    android:valueTo="5"
    android:valueType="floatType" />

VHItem
Обновлен видовой держатель с поддержкой аниматора.

class VHItem extends RecyclerView.ViewHolder {
    private ImageView ivCollectionImage, ivRemoveIcon;
    private RelativeLayout rlContainer;
    private Animator mAnimator;

    public VHItem(View itemView) {
        super(itemView);
        ivCollectionImage = itemView.findViewById(R.id.ivCollectionImage);
        ivRemoveIcon = itemView.findViewById(R.id.ivRemoveIcon);
        rlContainer = itemView.findViewById(R.id.rlContainer);
    }

    // Start animation. Inflate the animator lazily.
    public void startAnimator() {
        if (mAnimator == null) {
            mAnimator = AnimatorInflater.loadAnimator(context, R.animator.jiggle);
        }
        mAnimator.setTarget(itemView);
        mAnimator.start();
    }

    // Stop the animation. Set the rotation back to zero.
    public void stopAnimator() {
        if (mAnimator != null) {
            itemView.setRotation(0);
            mAnimator.cancel();
        }
    }
}

Вам потребуется обновить оставшуюся часть адаптера для работы с новой анимацией.

...