15

我正在使用带有 5 个不同片段的 TabLayout。在这些片段中的 3 个上android.support.design.widget.FloatingActionButton应该出现一个。现在我只是在选项卡更改时设置 FAB 的可见性,但我想要一个动画,FAB 进出的地方。如何在 Android 中实现这一点?

4

5 回答 5

28

收缩/弹出的隐藏/显示动画由新版本的支持库自动处理。(22.2.1) 然后 OnTabChange 监听器使用新库提供的显示/隐藏方法显示或隐藏浮动动作按钮。

晶圆厂.show(); 或 fab.hide();

于 2015-08-16T20:09:03.443 回答
13

设计支持库修订版 22.2.1(2015 年 7 月)将hide()show()方法添加到FloatingActionButton类中,因此您可以从现在开始使用这些方法。

http://developer.android.com/tools/support-library/index.html

于 2015-08-07T12:19:38.563 回答
10

在此处输入图像描述

你想要这样的东西吗?但是,onScrollListener您可以在 on onCreateViewor onCreatemethod 上对其进行动画处理,而不是对其进行动画处理。按照这个 -->实现浮动操作按钮 - 第 2 部分

基本上,代码仅总结于此

动画隐藏

FloatingActionButton floatingActionButton = (FloatingActionButton) getActivity().findViewById(R.id.fab);
                floatingActionButton.animate().translationY(floatingActionButton.getHeight() + 16).setInterpolator(new AccelerateInterpolator(2)).start();

动画返回显示

FloatingActionButton floatingActionButton = (FloatingActionButton) getActivity().findViewById(R.id.fab);
                floatingActionButton.animate().translationY(0).setInterpolator(new DecelerateInterpolator(2)).start();

但我们不希望它动画只是为了隐藏它,所以“动画隐藏”将是这样的

FloatingActionButton floatingActionButton = (FloatingActionButton) getActivity().findViewById(R.id.fab);
                floatingActionButton.setTranslationY(floatingActionButton.getHeight() + 16);

在“动画隐藏”上将其放在onCreateVieworonCreate方法上,以便在您创建此片段时隐藏您的 FAB,然后您可以添加一个处理程序和可运行程序,在一两秒钟后触发“动画返回显示”以显示您的动画

或者您可以使用时间来制作短动画

int mShortAnimationDuration = getResources().getInteger(
            android.R.integer.config_shortAnimTime);

我在 onScroll 上尝试过这个,但没有尝试过,onCreateView或者onCreate我想它应该可以工作

--编辑--

试试这个代码;)

public class DummyFragment extends Fragment {

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        int mShortAnimationDuration = getResources().getInteger(
                android.R.integer.config_shortAnimTime);

        FloatingActionButton floatingActionButton = (FloatingActionButton) getActivity().findViewById(R.id.fab);
        floatingActionButton.setTranslationY(floatingActionButton.getHeight() + 16);

        new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {
                FloatingActionButton floatingActionButton = (FloatingActionButton) getActivity().findViewById(R.id.fab);
                floatingActionButton.animate().translationY(0).setInterpolator(new DecelerateInterpolator(2)).start();

            }, mShortAnimationDuration);
        }
    }
}
于 2015-06-08T04:56:26.050 回答
1

最简单的方法是扩展 FloatingActionButton 类并覆盖setVisibility。像这样:

public void setVisibility(final int visibility) {
    if (getVisibility() != View.VISIBLE && visibility == View.VISIBLE && inAnim != null) {
        animator = // create your animator here
        super.setVisibility(visibility);
    } else if (getVisibility() == View.VISIBLE && visibility != View.VISIBLE) {
        AnimatorListenerAdapter listener = new AnimatorListenerAdapter() {
            @Override
            public void onAnimationEnd(Animator animator) {
                Button.super.setVisibility(visibility);
            }
        });
        animator = // create your animator here
        animator.addListener(listener);
    }
}

上面的代码取自我的库中的 Button 类。您可以在源代码中找到示例实现。

于 2015-05-31T10:02:22.927 回答
1

因为我不想扩展FloatingActionButton,所以我这样做了:

FloatingActionButton createButton;

// ...

Animation makeInAnimation = AnimationUtils.makeInAnimation(getBaseContext(), false);
makeInAnimation.setAnimationListener(new Animation.AnimationListener() {
    @Override
    public void onAnimationEnd(Animation animation) { }

    @Override
    public void onAnimationRepeat(Animation animation) { }

    @Override
    public void onAnimationStart(Animation animation) {
        createButton.setVisibility(View.VISIBLE);
    }
});

Animation makeOutAnimation = AnimationUtils.makeOutAnimation(getBaseContext(), true);
makeOutAnimation.setAnimationListener(new Animation.AnimationListener() {
    @Override
    public void onAnimationEnd(Animation animation) {
        createButton.setVisibility(View.INVISIBLE);
    }

    @Override
    public void onAnimationRepeat(Animation animation) { }

    @Override
    public void onAnimationStart(Animation animation) { }
});

// ...

if (createButton.isShown()) {
    createButton.startAnimation(makeOutAnimation);
}

// ...

if (!createButton.isShown()) {
    createButton.startAnimation(makeInAnimation);
}
于 2015-06-01T14:41:51.043 回答