4

Я хочу анимировать значок ящика из гамбургера на стрелку и наоборот вручную, а не только при перетаскивании ящика, возможно ли это? Я использую библиотеку поддержки appcompat-v7: 21.Анимация Значок действияBarDrawerToggle программно

Также я не могу найти исходный код android.support.v7.app.ActionBarDrawerToggle, который был бы полезен.

ответ

13

Я нашел способ анимировать значок с помощью простого метода ValueAnimator и .onDrawerSlide.

ValueAnimator anim = ValueAnimator.ofFloat(start, end); 
    anim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { 
     @Override 
     public void onAnimationUpdate(ValueAnimator valueAnimator) { 
      float slideOffset = (Float) valueAnimator.getAnimatedValue(); 
      drawerToggle.onDrawerSlide(drawerLayout, slideOffset); 
     } 
    }); 
    anim.setInterpolator(new DecelerateInterpolator()); 
    anim.setDuration(300); 
    anim.start(); 

Но, возможно, есть лучшее решение.

+0

Спасибо за ваш ответ! Это отлично работает для меня, хотя я согласен, что, вероятно, это лучшее решение. Но пока это единственное решение, которое сработало :) – MathieuMaree

4
// define your drawer layout 
    DrawerLayout drawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout); 
    // define your actionbar toggle 
    final ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
      // Pass in context 
      this, 
      // Pass in your drawer layout 
      drawerLayout, 
      // Pass a String resource to describe the "open drawer" action for accessibility 
      R.string.open_drawer, 
      // Pass a String resource to describe the "close drawer" action for accessibility 
      R.string.close_drawer 
    ); 
    // add a drawerListener to your drawer layout 
    drawerLayout.setDrawerListener(new DrawerLayout.DrawerListener() { 
     @Override 
     public void onDrawerSlide(View drawerView, float slideOffset) { 
      // Here's where the animation happens. 
      // the provided float starts at 0 (drawer closed) and goes to 1 (drawer open) hitting all points in between. 

      // ActionBarDrawerToggle has an onDrawerSlide method that takes your drawer layout and the provided float from the onDrawerSlide constructor. 
      // By passing the slideOffSet from the drawer's OnDrawerSlide method into the toggle, it maps the animation to the provided float. 
      toggle.onDrawerSlide(drawerView, slideOffset); 
     } 

     @Override 
     public void onDrawerOpened(View view) { 

     } 

     @Override 
     public void onDrawerClosed(View view) { 

     } 

     @Override 
     public void onDrawerStateChanged(int i) { 

     } 
    }); 

EDIT: выше будет работать, но я нашел гораздо более элегантный способ сделать это. Установив переключатель в качестве слушателя ящика, состояния обрабатываются по умолчанию. См. Ниже:

 // define your drawer layout 
    drawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout); 
    // define your actionbar drawertoggle 
    drawerToggle = new ActionBarDrawerToggle(
      // Pass in context 
      this, 
      // Pass in your drawer layout 
      drawerLayout, 
      // Attach the toolbar 
      toolbar, 
      // Pass a String resource to describe the "open drawer" action for accessibility 
      R.string.open_drawer, 
      // Pass a String resource to describe the "close drawer" action for accessibility 
      R.string.close_drawer 
    ) { 
     // attach drawer listener states to the ActionBarDrawerToggle 
     public void onDrawerClosed(View view) { 
      super.onDrawerClosed(view); 
      invalidateOptionsMenu(); 
     } 

     public void onDrawerOpened(View drawerView) { 
      super.onDrawerOpened(drawerView); 
      invalidateOptionsMenu(); 
     } 
    }; 
    drawerLayout.setDrawerListener(drawerToggle); 
    drawerToggle.syncState(); 
Смежные вопросы