Java tutorial
/* * * * * This file is part of QuickLyric * * Created by geecko * * * * QuickLyric is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * QuickLyric is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * * along with QuickLyric. If not, see <http://www.gnu.org/licenses/>. * */ package com.evandroid.musica.utils; import android.content.Context; import android.os.Build; import android.support.design.widget.CoordinatorLayout; import android.support.design.widget.FloatingActionButton; import android.support.v4.view.ViewCompat; import android.support.v4.view.ViewPropertyAnimatorListener; import android.support.v4.view.animation.FastOutSlowInInterpolator; import android.util.AttributeSet; import android.view.View; import android.view.animation.Animation; import android.view.animation.AnimationUtils; import com.evandroid.musica.R; public class RefreshButtonBehavior extends FloatingActionButton.Behavior { private static final android.view.animation.Interpolator INTERPOLATOR = new FastOutSlowInInterpolator(); private boolean mIsAnimatingOut = false; public static boolean visible = true; public RefreshButtonBehavior(Context context, AttributeSet attrs) { super(); } // Same animation that FloatingActionButton.Behavior uses to // hide the FAB when the AppBarLayout exits public void animateOut(final FloatingActionButton button) { int translationY = button.getHeight() + ((CoordinatorLayout.LayoutParams) button.getLayoutParams()).bottomMargin; if (Build.VERSION.SDK_INT >= 14) { ViewCompat.animate(button).translationY(translationY).setInterpolator(INTERPOLATOR).withLayer() .setListener(new ViewPropertyAnimatorListener() { public void onAnimationStart(View view) { RefreshButtonBehavior.this.mIsAnimatingOut = true; } public void onAnimationCancel(View view) { RefreshButtonBehavior.this.mIsAnimatingOut = false; } public void onAnimationEnd(View view) { RefreshButtonBehavior.this.mIsAnimatingOut = false; view.setVisibility(View.GONE); visible = false; } }).start(); } else { Animation anim = AnimationUtils.loadAnimation(button.getContext(), R.anim.refresh_out); anim.setInterpolator(INTERPOLATOR); anim.setDuration(200L); anim.setAnimationListener(new Animation.AnimationListener() { public void onAnimationStart(Animation animation) { RefreshButtonBehavior.this.mIsAnimatingOut = true; } public void onAnimationEnd(Animation animation) { RefreshButtonBehavior.this.mIsAnimatingOut = false; button.setVisibility(View.GONE); visible = false; } @Override public void onAnimationRepeat(final Animation animation) { } }); button.startAnimation(anim); } } // Same animation that FloatingActionButton.Behavior // uses to show the FAB when the AppBarLayout enters public void animateIn(FloatingActionButton button) { if (!button.isEnabled()) return; button.setVisibility(View.VISIBLE); visible = true; if (Build.VERSION.SDK_INT >= 14) { ViewCompat.animate(button).translationY(0).setInterpolator(INTERPOLATOR).withLayer().setListener(null) .start(); } else { Animation anim = AnimationUtils.loadAnimation(button.getContext(), R.anim.refresh_in); anim.setDuration(200L); anim.setInterpolator(INTERPOLATOR); button.startAnimation(anim); } } @Override public boolean onStartNestedScroll(CoordinatorLayout coordinatorLayout, FloatingActionButton child, View directTargetChild, View target, int nestedScrollAxes) { return nestedScrollAxes == ViewCompat.SCROLL_AXIS_VERTICAL || super.onStartNestedScroll(coordinatorLayout, child, directTargetChild, target, nestedScrollAxes); } @Override public void onNestedScroll(CoordinatorLayout coordinatorLayout, FloatingActionButton child, View target, int dxConsumed, int dyConsumed, int dxUnconsumed, int dyUnconsumed) { super.onNestedScroll(coordinatorLayout, child, target, dxConsumed, dyConsumed, dxUnconsumed, dyUnconsumed); if ((dyUnconsumed > 0 || dyConsumed > 25) && !this.mIsAnimatingOut && child.getVisibility() == View.VISIBLE) { animateOut(child); } else if ((dyUnconsumed < 0 || dyConsumed < -10) && child.getVisibility() != View.VISIBLE) { animateIn(child); } } }