package me.ccrama.redditslide.handler; import android.support.v7.widget.RecyclerView; import android.support.v7.widget.Toolbar; import android.view.View; import android.view.animation.LinearInterpolator; /** * Created by ccrama on 2/18/2016. * Adapted from http://rylexr.tinbytes.com/2015/04/27/how-to-hideshow-android-toolbar-when-scrolling-google-play-musics-behavior/ */ public class ToolbarScrollHideHandler extends RecyclerView.OnScrollListener { Toolbar tToolbar; View mAppBar; View extra; View opposite; public ToolbarScrollHideHandler(Toolbar t, View appBar) { tToolbar = t; mAppBar = appBar; } public ToolbarScrollHideHandler(Toolbar t, View appBar, View extra, View opposite) { tToolbar = t; mAppBar = appBar; this.extra = extra; this.opposite = opposite; } public int verticalOffset; boolean scrollingUp; @Override public void onScrollStateChanged(RecyclerView recyclerView, int newState) { if (newState == RecyclerView.SCROLL_STATE_IDLE) { if(reset){ verticalOffset = 0; reset = false; } if (scrollingUp) { if (verticalOffset > tToolbar.getHeight()) { toolbarAnimateHide(); } else { toolbarAnimateShow(verticalOffset); } if (opposite != null) if (verticalOffset > opposite.getHeight()) { oppositeAnimateHide(); } else { oppositeAnimateShow(verticalOffset); } } else { if (mAppBar.getTranslationY() < tToolbar.getHeight() * -0.6 && verticalOffset > tToolbar.getHeight()) { toolbarAnimateHide(); } else { toolbarAnimateShow(verticalOffset); } if (opposite != null) if (opposite.getTranslationY() < opposite.getHeight() * -0.6 && verticalOffset > opposite.getHeight()) { oppositeAnimateHide(); } else { oppositeAnimateShow(verticalOffset); } } } } public boolean reset = false; @Override public void onScrolled(RecyclerView recyclerView, int dx, int dy) { if(verticalOffset == 0 && dy < 0){ //if scrolling begins halfway through an adapter, don't treat it like going negative and instead reset the start position to 0 dy = 0; } verticalOffset += dy; scrollingUp = dy > 0; int toolbarYOffset = (int) (dy - mAppBar.getTranslationY()); mAppBar.animate().cancel(); if (scrollingUp) { if (toolbarYOffset < tToolbar.getHeight()) { mAppBar.setTranslationY(-toolbarYOffset); if (extra != null) extra.setTranslationY(-toolbarYOffset); } else { mAppBar.setTranslationY(-tToolbar.getHeight()); if (extra != null) extra.setTranslationY(-tToolbar.getHeight()); } } else { if (toolbarYOffset < 0) { mAppBar.setTranslationY(0); if (extra != null) extra.setTranslationY(0); } else { mAppBar.setTranslationY(-toolbarYOffset); if (extra != null) extra.setTranslationY(-toolbarYOffset); } } if(opposite != null){ toolbarYOffset = (int) (dy + opposite.getTranslationY()); opposite.animate().cancel(); if (scrollingUp) { if (toolbarYOffset < opposite.getHeight()) { opposite.setTranslationY(toolbarYOffset); } else { opposite.setTranslationY(opposite.getHeight()); } } else { if (toolbarYOffset < 0) { opposite.setTranslationY(0); } else { opposite.setTranslationY(toolbarYOffset); } } } } private void toolbarAnimateShow(final int verticalOffset) { mAppBar.animate() .translationY(0) .setInterpolator(new LinearInterpolator()) .setDuration(180); if (extra != null) extra.animate() .translationY(0) .setInterpolator(new LinearInterpolator()) .setDuration(180); } private void toolbarAnimateHide() { mAppBar.animate() .translationY(-tToolbar.getHeight()) .setInterpolator(new LinearInterpolator()) .setDuration(180); if (extra != null) extra.animate() .translationY(-tToolbar.getHeight()) .setInterpolator(new LinearInterpolator()) .setDuration(180); } private void oppositeAnimateShow(final int verticalOffset) { opposite.animate() .translationY(0) .setInterpolator(new LinearInterpolator()) .setDuration(180); } private void oppositeAnimateHide() { opposite.animate() .translationY(opposite.getHeight()) .setInterpolator(new LinearInterpolator()) .setDuration(180); } }