SnackbarAnimation

General

Category
Free
Tag
Animations
License
N/A
Registered
Aug 22, 2015
Favorites
0
Link
https://gist.github.com/FireZenk/dadc22ee0065cdc788da
See also
Depth
EdgeEffectOverride
TransformationLayout
Music Indicator
kooldown

Additional

Language
Java
Version
N/A
Created
Aug 19, 2015
Updated
Aug 11, 2020 (Retired)
Owner
Jorge Garrido (FireZenk)
Activity
N/A
Badge
Generate
Download
Source code

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