Skip to content
This repository has been archived by the owner on Jul 10, 2020. It is now read-only.

Commit

Permalink
Add snackbar support (#9)
Browse files Browse the repository at this point in the history
Support moving FABsMenu when snackbar is shown
  • Loading branch information
jahirfiquitiva authored Aug 24, 2017
1 parent a731a98 commit 18c468d
Show file tree
Hide file tree
Showing 13 changed files with 181 additions and 105 deletions.
4 changes: 3 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,7 @@ Finally, use it in your layout, just like this:
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:fab="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent">

Expand All @@ -54,7 +55,8 @@ Finally, use it in your layout, just like this:
android:layout_width="match_parent"
android:layout_height="match_parent"
fab:fabs_menu_overlayColor="#4d000000"
fab:fabs_menu_clickableOverlay="true">
fab:fabs_menu_clickableOverlay="true"
tools:layout_behavior="@string/fabs_menu_layout_behavior">

<!-- FABs Menu is the main view. It will contain all the items FABs and it create the menu fab itself -->
<jahirfiquitiva.libs.fabsmenu.FABsMenu
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,9 +18,11 @@

import android.graphics.Color;
import android.os.Bundle;
import android.support.design.widget.Snackbar;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.app.AppCompatDelegate;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

import jahirfiquitiva.libs.fabsmenu.FABsMenu;
Expand All @@ -36,6 +38,15 @@ protected void onCreate(Bundle savedInstanceState) {

setContentView(R.layout.activity_main);

Button snackButton = findViewById(R.id.snack_button);
snackButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Snackbar.make(findViewById(R.id.coordinator), "Testing, testing, 1, 2, 3",
Snackbar.LENGTH_LONG).show();
}
});

final FABsMenu menu = findViewById(R.id.fabs_menu);
menu.setMenuUpdateListener(new FABsMenuListener() {
// You don't need to override all methods. Just the ones you want.
Expand Down
15 changes: 12 additions & 3 deletions app/src/main/res/layout/activity_main.xml
Original file line number Diff line number Diff line change
Expand Up @@ -14,9 +14,11 @@
~ limitations under the License.
-->

<RelativeLayout
<android.support.design.widget.CoordinatorLayout
android:id="@+id/coordinator"
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:fab="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent">

Expand All @@ -25,7 +27,8 @@
android:layout_width="match_parent"
android:layout_height="match_parent"
fab:fabs_menu_overlayColor="#4d000000"
fab:fabs_menu_clickableOverlay="true">
fab:fabs_menu_clickableOverlay="true"
tools:layout_behavior="@string/fabs_menu_layout_behavior">

<!-- FABs Menu is the main view. It will contain all the items FABs and it create the menu fab itself -->
<jahirfiquitiva.libs.fabsmenu.FABsMenu
Expand Down Expand Up @@ -92,4 +95,10 @@

</jahirfiquitiva.libs.fabsmenu.FABsMenuLayout>

</RelativeLayout>
<Button
android:id="@+id/snack_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Show snackbar"/>

</android.support.design.widget.CoordinatorLayout>
2 changes: 1 addition & 1 deletion library/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ android {
buildTypes {
release {
minifyEnabled false
shrinkResources true
shrinkResources false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,22 +24,26 @@ public class DimensionUtils {
/**
* This method converts dp unit to equivalent pixels, depending on device density.
*
* @param dp A value in dp (density independent pixels) unit. Which we need to convert into
* pixels
* @param context Context to get resources and device specific display metrics
* @param dp
* A value in dp (density independent pixels) unit. Which we need to convert into
* pixels
* @param context
* Context to get resources and device specific display metrics
* @return A float value to represent px equivalent to dp depending on device density
*/
public static float convertDpToPixel(float dp, Context context) {
Resources resources = context.getResources();
DisplayMetrics metrics = resources.getDisplayMetrics();
return dp * ((float) metrics.densityDpi / DisplayMetrics.DENSITY_DEFAULT);
}

/**
* This method converts device specific pixels to density independent pixels.
*
* @param px A value in px (pixels) unit. Which we need to convert into db
* @param context Context to get resources and device specific display metrics
* @param px
* A value in px (pixels) unit. Which we need to convert into db
* @param context
* Context to get resources and device specific display metrics
* @return A float value to represent dp equivalent to px value
*/
public static float convertPixelsToDp(float px, Context context) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,19 +26,37 @@

import java.util.List;

/**
* Credits to: https://goo.gl/ZWHwaw
* <p>
* Layout behavior that can be applied to either {@link TitleFAB} or {@link
* FABsMenu} to make components automatically animate to stay above {@code Snackbar}
* instances within the same parent {@code CoordinatorLayout}.
* <p>
* Usage:
* <pre>
* &lt;android.support.design.widget.CoordinatorLayout ...&gt;
* ...
* &lt;jahirfiquitiva.libs.fabsmenu.FABsMenuLayout
* ...
* app:layout_behavior="jahirfiquitiva.libs.fabsmenu.FABSnackbarBehavior"
* /&gt;
* &lt;/android.support.design.widget.CoordinatorLayout&gt;
* </pre>
*/
@SuppressWarnings("unused")
public class FABSnackbarBehavior extends CoordinatorLayout.Behavior<View> {

private float mTranslationY;

public FABSnackbarBehavior() {
super();
}

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

/**
* Find the {@code translation Y} value for any child Snackbar components.
*
Expand All @@ -48,29 +66,29 @@ public FABSnackbarBehavior(Context context, AttributeSet attrs) {
private float getFabTranslationYForSnackbar(CoordinatorLayout parent, View fab) {
float minOffset = 0.0F;
final List<View> dependencies = parent.getDependencies(fab);

for (View view : dependencies) {
if (view instanceof Snackbar.SnackbarLayout && parent.doViewsOverlap(fab, view)) {
minOffset = Math.min(minOffset, view.getTranslationY() - (float) view.getHeight());
}
}

return minOffset;
}

@Override
public boolean layoutDependsOn(CoordinatorLayout parent, View child, View dependency) {
return dependency instanceof Snackbar.SnackbarLayout;
}

@Override
public boolean onDependentViewChanged(CoordinatorLayout parent, View child, View dependency) {
if (dependency instanceof Snackbar.SnackbarLayout) {
this.updateFabTranslationForSnackbar(parent, child, dependency);
}
return false;
}

/**
* Animate FAB on snackbar change.
*/
Expand Down
18 changes: 10 additions & 8 deletions library/src/main/java/jahirfiquitiva/libs/fabsmenu/FABsMenu.java
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@
import android.support.annotation.DrawableRes;
import android.support.annotation.IntDef;
import android.support.annotation.NonNull;
import android.support.design.widget.CoordinatorLayout;
import android.support.v4.content.ContextCompat;
import android.util.AttributeSet;
import android.util.Log;
Expand All @@ -56,6 +57,7 @@
import java.lang.annotation.RetentionPolicy;

@SuppressWarnings("unused")
@CoordinatorLayout.DefaultBehavior(FABSnackbarBehavior.class)
public class FABsMenu extends ViewGroup {
public static final int EXPAND_UP = 0;
public static final int EXPAND_DOWN = 1;
Expand Down Expand Up @@ -756,6 +758,14 @@ public Drawable getMenuButtonIcon() {
return menuButtonIcon;
}

public void setMenuButtonIcon(@DrawableRes int resId) {
try {
setMenuButtonIcon(ContextCompat.getDrawable(getContext(), resId));
} catch (Exception e) {
e.printStackTrace();
}
}

public void setMenuButtonIcon(@NonNull Drawable menuButtonIcon) {
this.menuButtonIcon = menuButtonIcon;
createRotatingDrawable();
Expand Down Expand Up @@ -835,14 +845,6 @@ public void setMenuButtonIcon(@NonNull Uri uri) {
}
}

public void setMenuButtonIcon(@DrawableRes int resId) {
try {
setMenuButtonIcon(ContextCompat.getDrawable(getContext(), resId));
} catch (Exception e) {
e.printStackTrace();
}
}

public void setLabelsVerticalOffset(int labelsVerticalOffset) {
this.labelsVerticalOffset = labelsVerticalOffset;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,43 +23,46 @@
import android.support.annotation.ColorInt;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.design.widget.CoordinatorLayout;
import android.util.AttributeSet;
import android.view.View;
import android.view.ViewGroup;
import android.widget.FrameLayout;

@CoordinatorLayout.DefaultBehavior(FABSnackbarBehavior.class)
public class FABsMenuLayout extends FrameLayout {

@ColorInt
private int overlayColor;
private View overlayView;
private boolean clickableOverlay;

public FABsMenuLayout(@NonNull Context context) {
super(context);
}

public FABsMenuLayout(@NonNull Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
init(context, attrs);
}

public FABsMenuLayout(@NonNull Context context, @Nullable AttributeSet attrs, @AttrRes int
defStyleAttr) {
super(context, attrs, defStyleAttr);
init(context, attrs);
}

private void init(Context context, AttributeSet attrs) {
try {
TypedArray a = context.getTheme().obtainStyledAttributes(attrs,
R.styleable.FABsMenuLayout, 0, 0);
R.styleable.FABsMenuLayout, 0,
0);
overlayColor = a.getColor(R.styleable.FABsMenuLayout_fabs_menu_overlayColor,
Color.parseColor("#4d000000"));
Color.parseColor("#4d000000"));
clickableOverlay = a.getBoolean(R.styleable.FABsMenuLayout_fabs_menu_clickableOverlay,
true);
true);
a.recycle();

overlayView = new View(context);
overlayView.setLayoutParams(new FrameLayout.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
Expand All @@ -70,28 +73,28 @@ private void init(Context context, AttributeSet attrs) {
e.printStackTrace();
}
}

@ColorInt
public int getOverlayColor() {
return overlayColor;
}

public void setOverlayColor(@ColorInt int overlayColor) {
this.overlayColor = overlayColor;
}

public View getOverlayView() {
return overlayView;
}

public void setOverlayView(View overlayView) {
this.overlayView = overlayView;
}

public boolean hasClickableOverlay() {
return clickableOverlay;
}

public void setClickableOverlay(boolean clickableOverlay) {
this.clickableOverlay = clickableOverlay;
}
Expand Down
Loading

0 comments on commit 18c468d

Please sign in to comment.