Как я могу анимировать новую кнопку с плавающим действием между вкладкой/фрагментом перехода?

Из новой библиотеки поддержки дизайна я бы например, анимировать плавающую кнопку действия (FAB), чтобы сжимать и расширять ее по мере изменения фрагмента или вкладки.

введите здесь описание изображения

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


person IndyZa    schedule 09.07.2015    source источник


Ответы (3)


В ViewPager.OnPageChangeListener() я буду использовать btn.setScaleY() и btn.setScaleX() в зависимости от смещения метода onPageScrolled().

person Chol    schedule 09.07.2015

В Activity классе добавьте addOnPageChangeListener в ViewPager. Смотри ниже :

viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
            private int state = 0;
            private boolean isFloatButtonHidden = false;
            private int position = 0;

            @Override
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

                if (isFloatButtonHidden == false && state == 1 && positionOffset != 0.0) {
                    isFloatButtonHidden = true;

                    //hide floating action button
                    swappingAway();
                }
            }

            @Override
            public void onPageSelected(int position) {
                //reset floating
                this.position = position;

                if (state == 2) {
                    //have end in selected tab
                    isFloatButtonHidden = false;
                    selectedTabs(position);

                }
            }

            @Override
            public void onPageScrollStateChanged(int state) {
                //state 0 = nothing happen, state 1 = begining scrolling, state 2 = stop at selected tab.
                this.state = state;
                if (state == 0) {
                    isFloatButtonHidden = false;
                } else if (state == 2 && isFloatButtonHidden) {
                    //this only happen if user is swapping but swap back to current tab (cancel to change tab)
                    selectedTabs(position);
                }

            }
        });

в вашем частном методе вы можете выполнять там пользовательские задачи.

private void swappingAway()
{
    floatingActionButton.clearAnimation();
    Animation animation = AnimationUtils.loadAnimation(this, R.anim.pop_down);
    floatingActionButton.startAnimation(animation);
}

private void selectedTabs(int tab)
{
    floatingActionButton.show();

    //a bit animation of popping up.
    floatingActionButton.clearAnimation();
    Animation animation = AnimationUtils.loadAnimation(this, R.anim.pop_up);
    floatingActionButton.startAnimation(animation);

    //you can do more task. for example, change color for each tabs, or custom action for each tabs.
}

Я намеренно не использую hide() и show(), так как в них есть баги, когда меняешь местами и сразу возвращаешься.

вот анимация pop_down и pop_up

pop_down.xml

<scale xmlns:android="http://schemas.android.com/apk/res/android"
    android:fromXScale="1.0"
    android:fromYScale="1.0"
    android:toXScale="0.0"
    android:toYScale="0.0"
    android:duration="100"
    android:pivotX="50%"
    android:pivotY="50%"
    android:shareInterpolator="true"
    android:fillAfter="true">
</scale>

pop_up.xml

<scale xmlns:android="http://schemas.android.com/apk/res/android"
    android:fromXScale="0.0"
    android:fromYScale="0.0"
    android:toXScale="1.0"
    android:toYScale="1.0"
    android:duration="500"
    android:pivotX="50%"
    android:pivotY="50%"
    android:startOffset="200"
    android:interpolator="@android:anim/bounce_interpolator"
    android:shareInterpolator="true"
    android:fillAfter="true">
</scale>
person HelmiB    schedule 23.10.2015

Самый простой способ:

viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
        @Override
        public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {}

        @Override
        public void onPageSelected(int position) {}

        @Override
        public void onPageScrollStateChanged(int state) {
            switch (state) {
                case ViewPager.SCROLL_STATE_IDLE:
                    switch (viewPager.getCurrentItem()) {
                        case 0: {
                            fab.setImageResource(R.drawable.your_drawable);
                            fab.show();
                            break;
                        }
                        case 1: {
                            fab.setImageResource(R.drawable.your_another_drawable);
                            fab.show();
                            break;
                        }
                    }
                    break;
                case ViewPager.SCROLL_STATE_DRAGGING:
                case ViewPager.SCROLL_STATE_SETTLING:
                    fab.hide();
                    break;
            }

Важно: чтобы повысить производительность отрисовки, попробуйте использовать формат .svg или затем уменьшите размер вашего png.

person Jurij Pitulja    schedule 20.12.2018
comment
Я хочу тот же результат, но с нижней навигацией на Android. Есть ли элегантный способ? - person james04; 11.12.2020