Проблема с Android-анимацией - видимость меняется быстрее, чем анимация - PullRequest
0 голосов
/ 04 декабря 2018

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

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

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

    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%" />

Ответы [ 2 ]

0 голосов
/ 04 декабря 2018

Я использую 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();
    }
0 голосов
/ 04 декабря 2018

вам нужно удалить 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) {

        }
    });
...