Проблема с анимацией Android - видимость меняется быстрее, чем анимация

У меня проблема с настройкой анимации для изменения видимости представления.

Я читал о различных советах, но рекомендуемые решения мне не помогают. Анимация работает не плавно - что я делаю не так?

Мой код выглядит так:

    childRelativeLayout.setVisibility(View.GONE);

    parentRelativeLayout.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {
            if (childRelativeLayout.getVisibility() == View.VISIBLE) {
                Animation slide_up = AnimationUtils.loadAnimation(context, R.anim.slide_up);
                childRelativeLayout.startAnimation(slide_up);

                //-------
                childRelativeLayout.getLayoutTransition()
                        .enableTransitionType(LayoutTransition.CHANGING);
                //-------
                //OR
                //-------
                try {
                    Thread.sleep(200);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                //-------

                childRelativeLayout.setVisibility(View.GONE);
            } else {
                Animation slide_down = AnimationUtils.loadAnimation(context, R.anim.slide_down);
                childRelativeLayout.startAnimation(slide_down);

                childRelativeLayout.setVisibility(View.VISIBLE);
            }
        }
    });

slide_down.xml

<translate
    android:duration = "200"
    android:fromYDelta = "-100%"
    android:toYDelta = "0" />

slide_up.xml

<translate
    android:duration = "200"
    android:fromYDelta = "0"
    android:toYDelta = "-100%" />

вы пробовали изменить продолжительность? 200 миллисекунд - это 0,2 секунды, разве это не слишком быстро?

Nikos Hidalgo 04.12.2018 12:38
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
1
676
2

Ответы 2

вам нужно удалить thread.Sleep () и добавить список анимаций и установить видимость GONE в прослушивателе окончания анимации.

slide_up.setAnimationListener(new Animation.AnimationListener() {
    @Override
    public void onAnimationStart(Animation animation) {

    }

    @Override
    public void onAnimationEnd(Animation animation) {
childRelativeLayout.setVisibility(View.GONE);
    }

    @Override
    public void onAnimationRepeat(Animation animation) {

    }
});

и для анимации скольжения вниз

 slide_down.setAnimationListener(new Animation.AnimationListener() {
        @Override
        public void onAnimationStart(Animation animation) {
    childRelativeLayout.setVisibility(View.VISIBLE);
        }

        @Override
        public void onAnimationEnd(Animation animation) {

        }

        @Override
        public void onAnimationRepeat(Animation animation) {

        }
    });

он работает лучше, потому что он более плавный, но у меня все еще есть три проблемы. Вот git: gifyu.com/image/TGEZ 1. Не знаю почему, если пропала видимость представления - после нажатия ничего не происходит. Если я начинаю с видимого обзора, то все работает. 2. Изменение видимости происходит с другой скоростью, чем анимация (я могу согласиться с этим, но это все еще не идеально) 3. Анимация ChildLayout заставляет представление перекрываться с ParentLayout

Kamil 04.12.2018 14:08

во избежание перекрытия уменьшите от -100% до -80%.

asim 04.12.2018 14:21

работает намного лучше, спасибо. Если бы у вас была идея по поводу оставшихся проблем, я был бы рад услышать. Но это совсем не плохо!

Kamil 04.12.2018 14:40

Я использую Kotlin, но на Java он будет выглядеть так же

val animatorSet = AnimatorSet()

val positionAnimator = ValueAnimator.ofFloat(tv.x, 0F)

positionAnimator.duration = animationDuration
positionAnimator.addUpdateListener {
   tv.x = positionAnimator.animatedValue as Float
}

val alphaAnimation = ValueAnimator.ofFloat(1F, 0F, 1F)

alphaAnimation.duration = animationDuration
alphaAnimation.addUpdateListener {
   tv.alpha = alphaAnimation.animatedValue as Float
}

animatorSet.addListener(object : AnimatorListenerAdapter() {
override fun onAnimationEnd(animation: Animator) {
   super.onAnimationEnd(animation)
   //If you need some events
   }
})

positionAnimator.interpolator = AccelerateDecelerateInterpolator()
animatorSet.playTogether(positionAnimator, alphaAnimation)
animatorSet.start()

Для JAVA. Это всего лишь пример.

private void animate() {
        animatorSet = new AnimatorSet();

        ValueAnimator positionAnimator = ValueAnimator.ofFloat(0, 100F);
        positionAnimator.setDuration(200);
        positionAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
            @Override
            public void onAnimationUpdate(ValueAnimator valueAnimator) {
                view.setX((Float) valueAnimator.getAnimatedValue());
            }
        });

        ValueAnimator alphaAnimation = ValueAnimator.ofFloat(0f, 1F);
        positionAnimator.setDuration(200);
        positionAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
            @Override
            public void onAnimationUpdate(ValueAnimator valueAnimator) {
                view.setAlpha((Float) valueAnimator.getAnimatedValue());
            }
        });

        animatorSet.addListener(new Animator.AnimatorListener() {
            @Override
            public void onAnimationStart(Animator animation, boolean isReverse) {

            }

            @Override
            public void onAnimationEnd(Animator animation, boolean isReverse) {

            }

            @Override
            public void onAnimationStart(Animator animator) {

            }

            @Override
            public void onAnimationEnd(Animator animator) {

            }

            @Override
            public void onAnimationCancel(Animator animator) {

            }

            @Override
            public void onAnimationRepeat(Animator animator) {

            }
        });

        positionAnimator.setInterpolator(new AccelerateDecelerateInterpolator()); 
        animatorSet.playTogether(positionAnimator, alphaAnimation);
        animatorSet.start();
    }

У меня много проблем с реализацией этого на Android

Kamil 04.12.2018 14:17

спасибо большое, но на этот раз я выберу более простое решение

Kamil 04.12.2018 15:04

Другие вопросы по теме