Ошибка Android CircularReveal: не работает после запуска аниматора другого типа в том же виде - PullRequest
1 голос
/ 22 сентября 2019

У меня есть приложение с RecyclerView, и в каждом элементе я реализовал Swipe для включения / выключения поведения, используя onTouch ().У меня нет проблем с моей реализацией, и я могу обрабатывать пролистывание вправо и влево и требовать перетаскивания из RecyclerView.

Каждый элемент - это RevealFrameLayout, который состоит из содержимого вверху, а внизу - исходный макет и макет, который нужнораскрывается, вот так:

Верхний макет:

Top layout:

Под макетом (верхний выявленный слой):

Below layout (top revealed layer):

Ниже макета (макет по умолчанию перед раскрытием):

Below layout (default layout before reveal):

Там я раскрываю верхраскрытые слои (цветные) и все работает, пока я не добавил еще один ObjectAnimator, чтобы скрыть макет со звездой (сделать помеченный / не помеченный звездочкой), когда Раскрытие работает в первый раз, а затем еще один удар выполнит аниматор скрытия, затем в 3-й раз,там, где он должен раскрыться еще раз, он действительно запускает анимацию (выполняется отладка start ()), но не отображается.Четвёртый раз, когда работает скрывающий аниматор, но нет раскрытого макета.

Behavior gif:

Метод запуска любого действия:

void triggerAction(SwipeAction swipeAction, final Note note, final int position) {
    if (swipeAction.getActionId() == SwipeAction.STAR) {
        if (note.isStarred() && !hidden && !hideAnimating && !justAnimated) {
            starActionLayout.setVisibility(View.VISIBLE);
            archiveActionLayout.setVisibility(View.GONE);
            Animator hideAnim = AnimationUtils.createHideAnimation(revealStar);
            hideAnim.addListener(new AnimatorListenerAdapter() {
                @Override
                public void onAnimationEnd(Animator animation) {
                    revealStar.setVisibility(View.INVISIBLE);
                    hideAnimating = false;
                    hidden = true;
                    note.setStarred(false);
                    MainActivity.notesController.set(position, note);
                    super.onAnimationEnd(animation);
                }
            });
            hideAnim.start();
            revealStar.setVisibility(View.VISIBLE); // DEBUG: Only to make sure the star layout is shown.
            justAnimated = true;
            hideAnimating = true;
            revealAnimating = false;
            revealed = false;
            hidden = false;
        } else if (!note.isStarred() && !revealAnimating && !revealed && !justAnimated) {
            starActionLayout.setVisibility(View.VISIBLE);
            archiveActionLayout.setVisibility(View.GONE);
            final ObjectAnimator revealAnim = (ObjectAnimator) AnimationUtils.createCircularReveal(revealStar, (int) getCenterX(starActionImage), (int) getCenterY(starActionImage), 0, (float) getRadius(starActionLayout));
            revealAnim.addListener(new AnimatorListenerAdapter() {
                @Override
                public void onAnimationEnd(Animator animation) {
                    revealAnimating = false;
                    revealed = true;
                    note.setStarred(true);
                    MainActivity.notesController.set(position, note);
                    super.onAnimationEnd(animation);
                }
            });
            revealAnim.start();
            justAnimated = true;
            revealAnimating = true;
            hideAnimating = false;
            hidden = false;
            revealed = false;
            revealStar.setVisibility(View.VISIBLE);
        }
    } else if (swipeAction.getActionId() == SwipeAction.ARCHIVE) {
        if (!revealAnimating && !revealed) {
            int added = starActionLayout.getWidth();
            starActionLayout.setVisibility(View.GONE);
            archiveActionLayout.setVisibility(View.VISIBLE);
            Animator revealAnim = AnimationUtils.createCircularReveal(revealArchive, (int) getCenterX(archiveActionImage) + added, (int) getCenterY(archiveActionImage), 0, (float) getRadius(archiveActionLayout));
            revealAnim.addListener(new AnimatorListenerAdapter() {
                @Override
                public void onAnimationEnd(Animator animation) {
                    revealAnimating = false;
                    revealed = true;
                    super.onAnimationEnd(animation);
                }
            });
            revealAnim.start();
            revealAnimating = true;
            revealArchive.setVisibility(View.VISIBLE);
        }
    }
}

Там нетпроблема с моими условиями, так как отладка показывает, что покажите аниматор покажите код, когда он должен.И AnimationUtils - это пользовательский класс, который включает ViewAnimationUtils.createCircularReveal(params) и другой пользовательский ObjectAnimator createHideAnimator(), и с этим тоже проблем нет.

AnimationUtils.java:

package com.skaldebane.util.graphics;

import android.animation.Animator;
import android.animation.ObjectAnimator;
import android.os.Build;
import android.view.View;
import android.view.ViewAnimationUtils;
import android.view.animation.LinearInterpolator;

public class AnimationUtils {

    public static Animator createCircularReveal(View view, int centerX, int centerY, float startRadius, float endRadius) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) return ViewAnimationUtils.createCircularReveal(view, centerX, centerY, startRadius, endRadius);
        else return io.codetail.animation.ViewAnimationUtils.createCircularReveal(view, centerX, centerY, startRadius, endRadius);
    }

    public static Animator createHideAnimation(View view) {
        ObjectAnimator hideAnim = new ObjectAnimator();
        hideAnim.setPropertyName("alpha");
        hideAnim.setFloatValues(1.0F, 0.0F);
        hideAnim.setDuration(300);
        hideAnim.setInterpolator(new LinearInterpolator());
        hideAnim.setTarget(view);
        return hideAnim;
    }

}

Примечание: Не говорите мне использовать ItemTouchHelper вместо этого, так как это не является предметом моего вопроса, и это также не решает проблему.

1 Ответ

0 голосов
/ 29 сентября 2019

Я только что понял проблему.Это было просто, но трудно заметить.Когда я применял аниматор скрытия, он постоянно устанавливал альфа на 0, что означало, что вид больше никогда не появится.Мне нужно было использовать view.setAlpha(1.0F); сразу после вызова view.setVisiblity(View.INVISIBLE);.

...