如何为新的Design Support Library的FloatingActionButton制作动画

时间:2015-05-31 07:28:48

标签: android android-animation floating-action-button android-design-library

我正在使用带有5个不同片段的TabLayout。在其中3个片段中应出现android.support.design.widget.FloatingActionButton。现在我只是在选项卡更改时设置FAB的可见性,但我希望有一个动画,FAB进出。 我怎样才能在Android中实现这一目标?

5 个答案:

答案 0 :(得分:28)

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

fab.show(); 要么 fab.hide();

答案 1 :(得分:13)

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

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

答案 2 :(得分:10)

enter image description here

你想要这样的东西吗?但是,您可以使用onScrollListeneronCreateView方法为其设置动画,而不是在onCreate上设置动画。按照这个 - > Implement Floating Action Button – Part 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();

但我们不希望它只是为了隐藏它而设置动画,以及“动画隐藏”#39;将会是这样的

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

On' Animate to Hide'将其放在onCreateViewonCreate方法上,以便在创建此片段时隐藏在FAB上,然后您可以添加一个处理程序和runnable,它将触发“Animate”返回Show&#39 ;一两秒后显示你的动画

或者您可以使用时间进行短动画

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

我在onScroll上尝试了这个但未尝试onCreateViewonCreate,但我想它应该可行

- 的修改 -

试试这段代码;)

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);
        }
    }
}

答案 3 :(得分: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);
    }
}

上面的代码来自my library的Button类。您可以在源代码中找到示例实现。

答案 4 :(得分: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);
}