Source link: https://gist.github.com/FireZenk/dadc22ee0065cdc788da
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 <[email protected]> * * 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();
}
}