Подтвердить что ты не робот

Анимировать значок ящика в стрелку на setDisplayHomeAsUpEnabled?

Я использую setDisplayHomeAsUpEnabled, чтобы показать стрелку вместо значка "burger", но он не становится анимированным или что-то еще. Вместо этого он мгновенно отображает стрелку.

Начальный экран: (Альбом 1)

При нажатии на фильм: (альбом 2)

Дело в том, значок делает анимация просто отлично, когда я скольжу ящик, который заставляет меня думать, что, возможно, я не должен использовать setDisplayHomeAsUpEnabled для этого: (Альбом 3)

Альбом: http://imgur.com/a/LkXbh

Здесь мой код переключения ящика:

    Toolbar toolbar = (Toolbar) findViewById(R.id.my_awesome_toolbar);
    setSupportActionBar(toolbar);

    drawerAdapter = new DrawerAdapter(this, App.getNavItems(), getSupportFragmentManager());
    drawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
    drawerList = (ExpandableListView) findViewById(R.id.left_drawer);

    // Set onGroupClick and onChildClick
    drawerAdapter.setClickEvents(MainActivity.this, drawerLayout, drawerList);
    drawerList.setAdapter(drawerAdapter);

    ActionBarDrawerToggle toolbarDrawerToggle = new ActionBarDrawerToggle(
            this,                 
            drawerLayout,        
            toolbar,             
            R.string.drawer_open, 
            R.string.drawer_close 
    ) {

        public void onDrawerClosed(View view) {
            super.onDrawerClosed(view);
            invalidateOptionsMenu();
        }

        public void onDrawerOpened(View view) {
            super.onDrawerOpened(view);
            invalidateOptionsMenu();
        }
    };
    drawerLayout.setDrawerListener(toolbarDrawerToggle);
    toolbarDrawerToggle.syncState();

РЕДАКТИРОВАТЬ: Я хочу, чтобы анимация не открывала ящик, который уже работает. Я хотел бы запускать анимацию вручную при загрузке определенного фрагмента. Возможно, я не правильно объяснил.

4b9b3361

Ответ 1

Я не тестировал это, но вы можете достичь этого, оживив поплавок между 0 (ящик закрыт) и 1 (ящик открыт), а затем передав значение в ActionBarDrawerToggle.onDrawerSlide(View, float). Я считаю, что как переключатель определяет, в каком состоянии должен находиться анимированный переключатель.

Что-то вроде этого должно работать.

ValueAnimator anim = ValueAnimator.ofFloat(start, end);
anim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
    @Override
    public void onAnimationUpdate(ValueAnimator valueAnimator) {
        float slideOffset = (Float) valueAnimator.getAnimatedValue();
        toolbarDrawerToggle.onDrawerSlide(drawerLayout, slideOffset);
    }
});
anim.setInterpolator(new DecelerateInterpolator());
// You can change this duration to more closely match that of the default animation.
anim.setDuration(500);
anim.start();

Ответ 2

Поскольку вопрос был задан, появился альтернативный способ. Анимированная стрелка реализуется теперь открытым классом DrawerArrowDrawable, который реализует Drawable.

В вашем коде установите значок навигации следующим образом:

DrawerArrowDrawable drawerArrow = new DrawerArrowDrawable(this);
drawerArrow.setColor(myColor);

toolbar.setNavigationIcon(drawerArrow);

Зарегистрируйте OnBackStackChangedListener и анимируйте стрелку вручную:

@Override
public void onBackStackChanged() {
    boolean drawer = getSupportFragmentManager().getBackStackEntryCount() == 0;
    ObjectAnimator.ofFloat(drawerArrow, "progress", drawer ? 0 : 1).start();
}

Ответ 3

Похоже, что он работает по назначению, вы можете использовать setDisplayHomeAsUpEnabled, чтобы просто включить кнопку "Дом", которая будет использоваться в качестве кнопки "Назад", анимация отсутствует.

Если вы используете ящик для навигации и хотите, чтобы анимация не использовала setDisplayHomeAsUpEnabled и для материальной темы (по крайней мере, с AppCompat v21), убедитесь, что вы используете ActionBarDrawerToggle из пакета v7.

Play Store - хороший пример. На верхнем уровне вы работаете с навигационным ящиком и гамбургером, который оживляет, когда вы открываете ящик. Если вы нажмете на приложение, оно откроет новое действие со стрелкой назад.