Добавить круговую анимацию раскрытия в BottomSheet

Я использую нижний лист в моем приложении для Android. Как добавить анимацию кругового раскрытия для загрузки нижнего листа?createCircularReveal Android SDK функция, которая поддерживает все устройства с уровнями API выше 21.

1 ответ

Простая логика для преобразования обычной анимации слайд-ап в анимацию слайд-ап в API выше 21:

1) Сделать покажи анимационный код для просмотра.

2) Получите родительский вид вашего диалога и измените его фон на прозрачный перед методом.show()

((View) bsdCreateNewBinding.getRoot().getParent()).setBackgroundColor(Color.TRANSPARENT);

3) Применить анимацию показа в этом методе:

bottomSheetDialog.setOnShowListener(new DialogInterface.OnShowListener() {
            @Override
            public void onShow(DialogInterface dialog) {
                revealShow(bsdCreateNewBinding.getRoot(), true, null);
            }
        });

Вот код анимации раскрытия:

private void revealShow(View dialogView, boolean b, final BottomSheetDialog dialog) {

        final View view = dialogView.findViewById(R.id.dialog);

        int w = view.getWidth();
        int h = view.getHeight();

        int endRadius = (int) Math.hypot(w, h);

        int cx = (int) (binding.btnAdd.getX() + (binding.btnAdd.getWidth() / 2));
        int cy = (int) (binding.btnAdd.getY()) + binding.btnAdd.getHeight() + 56;


        if (b) {

            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
                Animator revealAnimator = ViewAnimationUtils.createCircularReveal(view, cx, cy, 0, endRadius);
                view.setVisibility(View.VISIBLE);
                revealAnimator.setDuration(700);
                revealAnimator.start();
            } else {
                view.setVisibility(View.VISIBLE);
            }
        } else {

            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
                Animator anim =
                        ViewAnimationUtils.createCircularReveal(view, cx, cy, endRadius, 0);

                anim.addListener(new AnimatorListenerAdapter() {
                    @Override
                    public void onAnimationEnd(Animator animation) {
                        super.onAnimationEnd(animation);
                        dialog.dismiss();
                        view.setVisibility(View.INVISIBLE);

                    }
                });
                anim.setDuration(700);
                anim.start();
            } else {
                dialog.dismiss();
                view.setVisibility(View.INVISIBLE);
            }

        }

    }

PS: Внизу и выше Lolipop дело решено.

Вот идеальный пример для Dialog или BottomSheetDialog с отображением анимации: https://android.jlelse.eu/custom-dialog-with-circular-reveal-animation-ef7dc77ba1e

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