0

我正在尝试在 RecyclerView 项目中实现交叉淡入淡出动画。有两个文本视图将通过淡入淡出动画依次显示。

就像 1000ms 显示 TextViewOne -> 500ms 交叉淡入淡出到 TextViewTwo -> 1000ms 显示 TextViewTwo -> 500ms 交叉淡入淡出到 TextViewOne -> 1000ms 显示 TextViewOne -> 等等......有人可以帮我解决这个问题吗?提前致谢。

4

1 回答 1

0

在探索多篇文章时,我找到了解决方案。下面是代码片段。

/**
 * Setup crossfade animation on the views
 *
 * @param firstView  First view
 * @param secondView Second view
 */
private void setAnimations(@NonNull View firstView, @NonNull View secondView) {
        int crossFadeDuration = 500;
        int holdDuration = 1000;

        ObjectAnimator fadeOutFirstView = ObjectAnimator.ofFloat(firstView, View.ALPHA, 1f, 0f);
        fadeOutFirstView.addListener(new Animator.AnimatorListener() {
            @Override
            public void onAnimationStart(Animator animation) {
            }

            @Override
            public void onAnimationEnd(Animator animation) {
                firstView.setVisibility(View.GONE);
            }

            @Override
            public void onAnimationCancel(Animator animation) {
            }

            @Override
            public void onAnimationRepeat(Animator animation) {
            }
        });
        fadeOutFirstView.setInterpolator(new LinearInterpolator());

        ObjectAnimator fadeOutSecondView = ObjectAnimator.ofFloat(secondView, View.ALPHA, 1f, 0f);
        fadeOutSecondView.addListener(new Animator.AnimatorListener() {
            @Override
            public void onAnimationStart(Animator animation) {
            }

            @Override
            public void onAnimationEnd(Animator animation) {
                secondView.setVisibility(View.GONE);
            }

            @Override
            public void onAnimationCancel(Animator animation) {
            }

            @Override
            public void onAnimationRepeat(Animator animation) {
            }
        });
        fadeOutSecondView.setInterpolator(new LinearInterpolator());

        ObjectAnimator fadeInFirstView = ObjectAnimator.ofFloat(firstView, View.ALPHA, 0f, 1f);
        fadeInFirstView.addListener(new Animator.AnimatorListener() {
            @Override
            public void onAnimationStart(Animator animation) {
                firstView.setVisibility(View.VISIBLE);
            }

            @Override
            public void onAnimationEnd(Animator animation) {
            }

            @Override
            public void onAnimationCancel(Animator animation) {
            }

            @Override
            public void onAnimationRepeat(Animator animation) {
            }
        });
        fadeInFirstView.setInterpolator(new LinearInterpolator());

        ObjectAnimator fadeInSecondView = ObjectAnimator.ofFloat(secondView, View.ALPHA, 0f, 1f);
        fadeInSecondView.addListener(new Animator.AnimatorListener() {
            @Override
            public void onAnimationStart(Animator animation) {
                secondView.setVisibility(View.VISIBLE);
            }

            @Override
            public void onAnimationEnd(Animator animation) {
            }

            @Override
            public void onAnimationCancel(Animator animation) {
            }

            @Override
            public void onAnimationRepeat(Animator animation) {
            }
        });
        fadeInSecondView.setInterpolator(new LinearInterpolator());

        AnimatorSet mAnimationSetForward = new AnimatorSet();
        mAnimationSetForward.setDuration(crossFadeDuration);
        mAnimationSetForward.playTogether(fadeOutFirstView, fadeInSecondView);

        AnimatorSet mAnimationSetReverse = new AnimatorSet();
        mAnimationSetReverse.setDuration(crossFadeDuration);
        mAnimationSetReverse.playTogether(fadeOutSecondView, fadeInFirstView);

        mAnimationSetForward.addListener(new Animator.AnimatorListener() {
            @Override
            public void onAnimationStart(Animator animation) {

            }

            @Override
            public void onAnimationEnd(Animator animation) {
                mAnimationSetReverse.setStartDelay(holdDuration);
                mAnimationSetReverse.start();
            }

            @Override
            public void onAnimationCancel(Animator animation) {

            }

            @Override
            public void onAnimationRepeat(Animator animation) {

            }
        });


        mAnimationSetReverse.addListener(new Animator.AnimatorListener() {
            @Override
            public void onAnimationStart(Animator animation) {

            }

            @Override
            public void onAnimationEnd(Animator animation) {
                mAnimationSetForward.setStartDelay(holdDuration);
                mAnimationSetForward.start();
            }

            @Override
            public void onAnimationCancel(Animator animation) {

            }

            @Override
            public void onAnimationRepeat(Animator animation) {

            }
        });
        mAnimationSetForward.start();
}
于 2019-09-26T11:49:36.417 回答