Transition Animation From Hamburger To Arrow Icon On Adding Fragment
Solution 1:
Some explanations first.
android.support.v7.app.ActionBarDrawerToggle
uses special drawable class for hamburger-to-arrow icons and animation.the class is
android.support.v7.graphics.drawable.DrawerArrowDrawable
DrawerArrowDrawable
implements animation with methodsetProgress(float progress)
, where progress is from 0 (hamburger) to 1 (arrow).ActionBarDrawerToggle uses
private void setPosition(float position)
that callsDrawerArrowDrawable.setProgress()
ActionBarDrawerToggle uses
public void onDrawerSlide(View drawerView, float slideOffset)
to call privatesetPosition()
ActionBarDrawerToggle
callstoolbar.setNavigationOnClickListener()
in constructor with it's listener, that is used to toggle drawer.ActionBarDrawerToggle
keep track of actualDrawerArrowDrawable
state.Toolbar
andActionBar
do not track actualDrawerArrowDrawable
state.
So, what you should do in activity. Option-A, use ActionBarDrawerToggle.
// define a variable to track hamburger-arrow stateprotectedboolean isHomeAsUp = false;
protectedDrawerLayout drawer;
protectedToolbar toolbar;
protectedActionBarDrawerToggle toggle;
// I've implemented it in setContentView(), but you can implement it in onCreate()@OverridepublicvoidsetContentView(@LayoutRes int layoutResID) {
super.setContentView(layoutResID);
toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
toggle = newActionBarDrawerToggle(this, drawer, toolbar, R.string.drawer_open, R.string.drawer_close);
drawer.addDrawerListener(toggle);
toggle.syncState();
// overwrite Navigation OnClickListener that is set by ActionBarDrawerToggle
toolbar.setNavigationOnClickListener(newView.OnClickListener() {
@OverridepublicvoidonClick(View v) {
if (drawer.isDrawerOpen(GravityCompat.START)){
drawer.closeDrawer(GravityCompat.START);
} elseif (isHomeAsUp){
onBackPressed();
} else {
drawer.openDrawer(GravityCompat.START);
}
}
});
}
// call this method for animation between hamburged and arrowprotectedvoidsetHomeAsUp(boolean isHomeAsUp){
if (this.isHomeAsUp != isHomeAsUp) {
this.isHomeAsUp = isHomeAsUp;
ValueAnimator anim = isHomeAsUp ? ValueAnimator.ofFloat(0, 1) : ValueAnimator.ofFloat(1, 0);
anim.addUpdateListener(newValueAnimator.AnimatorUpdateListener() {
@OverridepublicvoidonAnimationUpdate(ValueAnimator valueAnimator) {
float slideOffset = (Float) valueAnimator.getAnimatedValue();
toggle.onDrawerSlide(drawer, slideOffset);
}
});
anim.setInterpolator(newDecelerateInterpolator());
// You can change this duration to more closely match that of the default animation.
anim.setDuration(400);
anim.start();
}
}
Or you can set a DrawerArrowDrawable
as a navigation icon with toolbar.setNavigationIcon()
and animate it without ActionBarDrawerToggle
See Option-B: https://stackoverflow.com/a/42024138/1148784
Solution 2:
See my another answer for explanation https://stackoverflow.com/a/42023946/1148784. This is option-B. code for Activity
class. We do not use ActionBarDrawerToggle
here.
protectedboolean isHomeAsUp = false;
DrawerArrowDrawable homeDrawable;
protectedToolbar toolbar;
protectedDrawerLayout drawer;
@OverridepublicvoidsetContentView(@LayoutRes int layoutResID) {
super.setContentView(layoutResID);
toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
homeDrawable = newDrawerArrowDrawable(toolbar.getContext());
toolbar.setNavigationIcon(homeDrawable);
toolbar.setNavigationOnClickListener(newView.OnClickListener() {
@OverridepublicvoidonClick(View v) {
if (drawer.isDrawerOpen(GravityCompat.START)){
drawer.closeDrawer(GravityCompat.START);
} elseif (isHomeAsUp){
onBackPressed();
} else {
drawer.openDrawer(GravityCompat.START);
}
}
});
}
protectedvoidsetHomeAsUp(boolean isHomeAsUp){
if (this.isHomeAsUp != isHomeAsUp) {
this.isHomeAsUp = isHomeAsUp;
ValueAnimator anim = isHomeAsUp ? ValueAnimator.ofFloat(0, 1) : ValueAnimator.ofFloat(1, 0);
anim.addUpdateListener(newValueAnimator.AnimatorUpdateListener() {
@OverridepublicvoidonAnimationUpdate(ValueAnimator valueAnimator) {
float slideOffset = (Float) valueAnimator.getAnimatedValue();
homeDrawable.setProgress(slideOffset);
}
});
anim.setInterpolator(newDecelerateInterpolator());
anim.setDuration(400);
anim.start();
}
}
Post a Comment for "Transition Animation From Hamburger To Arrow Icon On Adding Fragment"