Анимировать значок ящика в стрелку на 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();
РЕДАКТИРОВАТЬ: Я хочу, чтобы анимация не открывала ящик, который уже работает.
Я хотел бы запускать анимацию вручную при загрузке определенного фрагмента. Возможно, я не правильно объяснил.
Ответы
Ответ 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 - хороший пример. На верхнем уровне вы работаете с навигационным ящиком и гамбургером, который оживляет, когда вы открываете ящик. Если вы нажмете на приложение, оно откроет новое действие со стрелкой назад.