如何启用/禁用浮动操作按钮行为

10
我正在开发一个应用程序,在某些片段中,我想隐藏浮动操作按钮。当我设置 android:visibility="gone" 时,行为动画会在向上和向下滑动时显示浮动操作按钮。是否有任何方法可以禁用/启用浮动操作按钮的行为?
谢谢您的提前感谢。
这是我的代码 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"
    />
2个回答

20

最终我找到了解决方法,我想与您分享。

您可以启用/禁用悬浮按钮行为

禁用行为

    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

在设置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);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接