Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to enable/disable FloatingActionButton Behavior

I am working on app in some fragment i want to hide FloatingActionButtton. When i set android:visibility="gone". Behavior animation show me FloatingActionButtton when i swipe up and down. is there is any way i can disable/enable FloatingActionButtton behavior.

Thank you advance.

here is my code

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

and 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"
    />
like image 771
Munish Kapoor Avatar asked Jan 28 '16 03:01

Munish Kapoor


2 Answers

There is no difference while setting up the visibility of a FAB, it works likely other controls.

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

You can try something this;

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);
like image 163
Iqra. Avatar answered Oct 31 '22 07:10

Iqra.


Finally I find it solution and I want to share with you.

You can enable/disable FloatingActionButton Behavior

Disable Behavior

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

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

Enable Behavior

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

Edited: More Reusable Class

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

}

How To Enable Using Common Class

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

How To Disable Using Common Class

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

Hope it will solve your problem :)

like image 32
Munish Kapoor Avatar answered Oct 31 '22 06:10

Munish Kapoor