如何启用/禁用FloatingActionButton行为

时间:2016-01-28 03:01:50

标签: android android-coordinatorlayout floating-action-button

我正在处理应用程序中的一些片段我想隐藏FloatingActionButtton。 当我设置 android:visibility ="去了" 。当我向上和向下滑动时,行为动画向我显示FloatingActionButtton。是否有任何方法可以禁用/启用FloatingActionButtton行为。

谢谢你提前。

这是我的代码

QuickReturnFooterBehavior.java

package com.app.common;

import android.animation.Animator;
import android.content.Context;
import android.support.design.widget.CoordinatorLayout;
import android.support.v4.view.ViewCompat;
import android.support.v4.view.animation.FastOutSlowInInterpolator;
import android.util.AttributeSet;
import android.view.View;
import android.view.ViewPropertyAnimator;


@SuppressWarnings("unused")
public class QuickReturnFooterBehavior extends     CoordinatorLayout.Behavior<View> {
private static final FastOutSlowInInterpolator INTERPOLATOR = new FastOutSlowInInterpolator();

private int mDySinceDirectionChange;
private boolean mIsShowing;
private boolean mIsHiding;

public QuickReturnFooterBehavior() {
}
public QuickReturnFooterBehavior(Context context, AttributeSet attrs) {
    super(context, attrs);
}

@Override
public boolean onStartNestedScroll(CoordinatorLayout coordinatorLayout, View child, View directTargetChild, View target, int nestedScrollAxes) {
    return (nestedScrollAxes & ViewCompat.SCROLL_AXIS_VERTICAL) != 0;
}

@Override
public void onNestedPreScroll(CoordinatorLayout coordinatorLayout, View child, View target, int dx, int dy, int[] consumed) {
    if (dy > 0 && mDySinceDirectionChange < 0
            || dy < 0 && mDySinceDirectionChange > 0) {
        // We detected a direction change- cancel existing animations and reset our cumulative delta Y
        child.animate().cancel();
        mDySinceDirectionChange = 0;
    }

    mDySinceDirectionChange += dy;

    if (mDySinceDirectionChange > child.getHeight()
            && child.getVisibility() == View.VISIBLE
            && !mIsHiding) {
        hide(child);
    } else if (mDySinceDirectionChange < 0
            && child.getVisibility() == View.GONE
            && !mIsShowing) {
        show(child);
    }
}

/**
 * Hide the quick return view.
 *
 * Animates hiding the view, with the view sliding down and out of the screen.
 * After the view has disappeared, its visibility will change to GONE.
 *
 * @param view The quick return view
 */
private void hide(final View view) {
    mIsHiding = true;
    ViewPropertyAnimator animator = view.animate()
            .translationY(view.getHeight())
            .setInterpolator(INTERPOLATOR)
            .setDuration(200);

    animator.setListener(new Animator.AnimatorListener() {
        @Override
        public void onAnimationStart(Animator animator) {}

        @Override
        public void onAnimationEnd(Animator animator) {
            // Prevent drawing the View after it is gone
            mIsHiding = false;
            view.setVisibility(View.GONE);
        }

        @Override
        public void onAnimationCancel(Animator animator) {
            // Canceling a hide should show the view
            mIsHiding = false;
            if (!mIsShowing) {
                show(view);
            }
        }

        @Override
        public void onAnimationRepeat(Animator animator) {}
    });

    animator.start();
}

/**
 * Show the quick return view.
 *
 * Animates showing the view, with the view sliding up from the bottom of the screen.
 * After the view has reappeared, its visibility will change to VISIBLE.
 *
 * @param view The quick return view
 */
private void show(final View view) {
    mIsShowing = true;
    ViewPropertyAnimator animator = view.animate()
            .translationY(0)
            .setInterpolator(INTERPOLATOR)
            .setDuration(200);

    animator.setListener(new Animator.AnimatorListener() {
        @Override
        public void onAnimationStart(Animator animator) {
            view.setVisibility(View.VISIBLE);
        }

        @Override
        public void onAnimationEnd(Animator animator) {
            mIsShowing = false;
        }

        @Override
        public void onAnimationCancel(Animator animator) {
            // Canceling a show should hide the view
            mIsShowing = false;
            if (!mIsHiding) {
                hide(view);
            }
        }

        @Override
        public void onAnimationRepeat(Animator animator) {}
    });

    animator.start();
  }
 }

和XML

   <android.support.design.widget.FloatingActionButton
    app:layout_behavior="com.app.common.QuickReturnFooterBehavior"
    android:id="@+id/fab_2"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginTop="16dp"
    android:src="@drawable/ic_action_quick_response_code"
    app:backgroundTint="@color/text_gray"
    app:descriptionText="@string/add_friend"
    app:elevation="3dp"
    app:borderWidth="0dp"
    />

3 个答案:

答案 0 :(得分:19)

最后我找到了解决方案,我想和你分享。

您可以启用/禁用 FloatingActionButton行为

禁用行为

    FloatingActionButton fab2 = (FloatingActionButton)findViewById(R.id.fab2);

    CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) fab2.getLayoutParams();
    params.setBehavior(null);
    fab2.requestLayout();
    fab2.setVisibility(View.GONE);

启用行为

    CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) fab2.getLayoutParams();
    params.setBehavior(new QuickReturnFooterBehavior());
    fab2.requestLayout();
    fab2.setVisibility(View.VISIBLE);

已编辑:更多可重复使用的课程

public class CoordinateBehaviourUtils {

  public static void enableDisableViewBehaviour(View view,CoordinatorLayout.Behavior<View> behavior,boolean enable){
    CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) view.getLayoutParams();
    params.setBehavior(behavior);
    view.requestLayout();
    view.setVisibility((enable ? View.VISIBLE: View.GONE));
  }

}

如何启用公共类

FloatingActionButton fab2 = (FloatingActionButton)findViewById(R.id.fab2);
CoordinateBehaviourUtils.enableDisableViewBehaviour(fab2,new QuickReturnFooterBehavior(),true);

如何使用公共类禁用

FloatingActionButton fab2 = (FloatingActionButton)findViewById(R.id.fab2);
CoordinateBehaviourUtils.enableDisableViewBehaviour(fab2,null,false);

希望它能解决你的问题:)

答案 1 :(得分:0)

在设置FAB的可见性时没有区别,它可能是其他控件。

0 is for VISIBLE
4 is for INVISIBLE
8 is for GONE

你可以试试这个;

FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
// to make is disable for some requirement 
fab.setVisibility(View.GONE);
// to make it enable 
fab.setVisibility(View.VISIBLE);

答案 2 :(得分:0)

在kotlin中启用/禁用为:

fab.isEnabled = true
fab.isEnabled = false