hamburger transition animation added

This commit is contained in:
Gavriil Sitnikov 2016-03-28 00:12:42 +03:00
parent 69aacd17b0
commit 9e835f7b04
1 changed files with 47 additions and 10 deletions

View File

@ -19,8 +19,12 @@
package ru.touchin.roboswag.components.navigation;
import android.animation.ValueAnimator;
import android.content.res.Configuration;
import android.os.Build;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.app.FragmentManager;
import android.support.v4.widget.DrawerLayout;
import android.support.v7.app.ActionBarDrawerToggle;
@ -33,38 +37,65 @@ import android.view.View;
*/
public class SidebarController implements FragmentManager.OnBackStackChangedListener, BaseActivity.OnBackPressedListener {
@NonNull
private final DrawerLayout drawerLayout;
private final ActionBarDrawerToggle drawerToggle;
@NonNull
private final ActionBarDrawerToggleImpl drawerToggle;
@NonNull
private final View sidebar;
private boolean isHamburgerShowed;
private boolean isSidebarDisabled;
@Nullable
private ValueAnimator hamburgerAnimator;
public SidebarController(@NonNull final BaseActivity activity,
@NonNull final DrawerLayout drawerLayout,
@NonNull final View sidebar) {
this.drawerLayout = drawerLayout;
this.sidebar = sidebar;
drawerToggle = new MyActionBarDrawerToggle(activity, drawerLayout);
drawerToggle = new ActionBarDrawerToggleImpl(activity, drawerLayout);
drawerLayout.addDrawerListener(drawerToggle);
activity.getSupportFragmentManager().addOnBackStackChangedListener(this);
activity.addOnBackPressedListener(this);
}
private boolean shouldShowHamburger() {
return !isHamburgerShowed && !isSidebarDisabled;
}
public void onPostCreate(@Nullable final Bundle savedInstanceState) {
drawerToggle.syncState();
}
public void onConfigurationChanged(@NonNull final Configuration newConfig) {
drawerToggle.onConfigurationChanged(newConfig);
}
public boolean onOptionsItemSelected(@NonNull final MenuItem item) {
return drawerToggle.onOptionsItemSelected(item);
return shouldShowHamburger() && drawerToggle.onOptionsItemSelected(item);
}
private void update() {
final boolean showHamburger = !isHamburgerShowed && !isSidebarDisabled;
drawerToggle.setDrawerIndicatorEnabled(!showHamburger);
drawerToggle.setDrawerIndicatorEnabled(showHamburger);
drawerToggle.syncState();
final boolean showHamburger = shouldShowHamburger();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
drawerToggle.setDrawerIndicatorEnabled(true);
if (hamburgerAnimator != null) {
hamburgerAnimator.cancel();
}
if (showHamburger) {
hamburgerAnimator = ValueAnimator.ofFloat(drawerToggle.slideOffset, 0f);
} else {
hamburgerAnimator = ValueAnimator.ofFloat(drawerToggle.slideOffset, 1f);
}
hamburgerAnimator.addUpdateListener(animation -> drawerToggle.onDrawerSlide(drawerLayout, (Float) animation.getAnimatedValue()));
hamburgerAnimator.start();
} else {
drawerToggle.onDrawerSlide(drawerLayout, showHamburger ? 0f : 1f);
}
drawerToggle.slidePosition = showHamburger ? 0f : 1f;
drawerLayout.setDrawerLockMode(isSidebarDisabled ? DrawerLayout.LOCK_MODE_LOCKED_CLOSED : DrawerLayout.LOCK_MODE_UNLOCKED);
}
@ -109,11 +140,13 @@ public class SidebarController implements FragmentManager.OnBackStackChangedList
return false;
}
private static class MyActionBarDrawerToggle extends ActionBarDrawerToggle {
private static class ActionBarDrawerToggleImpl extends ActionBarDrawerToggle {
private final BaseActivity activity;
private float slideOffset;
private float slidePosition;
public MyActionBarDrawerToggle(final BaseActivity activity, final DrawerLayout drawerLayout) {
public ActionBarDrawerToggleImpl(final BaseActivity activity, final DrawerLayout drawerLayout) {
super(activity, drawerLayout, 0, 0);
this.activity = activity;
}
@ -131,7 +164,11 @@ public class SidebarController implements FragmentManager.OnBackStackChangedList
@Override
public void onDrawerSlide(final View drawerView, final float slideOffset) {
super.onDrawerSlide(drawerView, 0);
if (slideOffset >= this.slideOffset && slideOffset <= this.slidePosition
|| slideOffset <= this.slideOffset && slideOffset >= this.slidePosition) {
this.slideOffset = slideOffset;
}
super.onDrawerSlide(drawerView, this.slideOffset);
}
}