如何在 tab/fragment 转换之间为新的浮动操作按钮设置动画?

How can I animate the new Floating Action Button between tab/fragment transition?

从新的 Design Support Library 开始,我想设置浮动操作按钮 (FAB) 的动画,使其随着片段或选项卡的更改而收缩和展开。

我尝试了一段时间的几种过渡,但无法像 this 中的示例那样平滑和连接,所以我认为有更好的方法或正确的方法来做到这一点。

ViewPager.OnPageChangeListener()中,我将根据onPageScrolled()方法的偏移量使用btn.setScaleY()btn.setScaleX()

在你的Activityclass中,在你的ViewPager中添加addOnPageChangeListener。见下文:

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>

最简单的方法:

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 的大小。