With this class you can clone the {Snackbar} animation to move the {ViewGroup} above of the Snackbar when it is visible and avoid view overlapping (clone of fab animation)
Java file (3 KB): SnackbarAnimation.java
package com.your.package;
import android.support.design.widget.Snackbar;
import android.view.View;
import android.view.ViewGroup;
import com.daimajia.easing.BaseEasingMethod;
import com.daimajia.easing.Glider;
import com.daimajia.easing.Skill;
import com.nineoldandroids.animation.AnimatorSet;
import com.nineoldandroids.animation.ObjectAnimator;
/**
* SnackbarAnimation Class
*
* With this class you can clone the {@link Snackbar} animation to move the {@link ViewGroup} above
* of the Snackbar when it is visible and avoid view overlapping (clone of fab animation)
*
* @dependencies (gradle):
* compile 'com.nineoldandroids:library:2.4.0'
* compile 'com.daimajia.easing:library:1.0.1@aar'
*
* @author firezenk
* @date 18/08/2015
*
* The MIT License (MIT)
*
* Copyright (c) 2015 Jorge Garrido Oval <firezenk@gmail.com>
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
public class SnackbarAnimation {
private ViewGroup layout = null;
private int snackbarDuration = Snackbar.LENGTH_LONG;
private AnimationStatus status = null;
public SnackbarAnimation(final ViewGroup layout) {
this.layout = layout;
animate();
}
public SnackbarAnimation(final ViewGroup layout, int snackbarDuration) {
this.layout = layout;
this.snackbarDuration = snackbarDuration;
animate();
}
public SnackbarAnimation(final ViewGroup layout, int snackbarDuration, AnimationStatus status) {
this.layout = layout;
this.snackbarDuration = snackbarDuration;
this.status = status;
animate();
}
private void animate() {
for (View child : layout.getTouchables())
child.setEnabled(false);
final AnimatorSet set = new AnimatorSet();
final AnimatorSet set2 = new AnimatorSet();
set.play(Glider.glide(Skill.CircEaseOut, 0.005f, ObjectAnimator.ofFloat(layout, "translationY", 0, -140)));
set.start();
set2.play(Glider.glide(Skill.Linear, 0.005f, ObjectAnimator.ofFloat(layout, "translationY", -140, 0), new BaseEasingMethod.EasingListener() {
@Override
public void on(float time, float value, float start, float end, float duration) {
if (value == 0.0) {
for (int i = 0; i < layout.getChildCount(); i++)
layout.getChildAt(i).setEnabled(true);
if (status != null) status.end();
}
}
}));
set2.setStartDelay(snackbarDuration == Snackbar.LENGTH_LONG ? 3000 : 1800);
set2.start();
}
public interface AnimationStatus {
void end();
}
}