#android #animation #android-actionbar #navigation-drawer
#Android #Анимация #android-панель действий #навигация-ящик
Вопрос:
<— значок ящика
Если вы создаете с помощью android Studio проект с навигационным ящиком, при открытии / закрытии ящика будет плавная анимация значка ящика.
Если я добавлю прослушиватель ящика в свой drawerlayout, анимации больше нет, значок ящика больше не меняется:
DrawerLayout dl = (DrawerLayout) findViewById(R.id.drawer_layout);
dl.setDrawerListener(new ActionBarDrawerToggle(this, dl,R.drawable.ic_drawer,R.string.navigation_drawer_open,R.string.navigation_drawer_close));
Я попытался переопределить методы ActionBarDrawerToggle для добавления вызовов в syncState().
DrawerLayout dl = (DrawerLayout)findViewById(R.id.drawer_layout);
mDrawerToggle = new ActionBarDrawerToggle(this, dl,
R.drawable.ic_drawer, R.string.drawer_open, R.string.drawer_close) {
@Override
public void onDrawerSlide(View drawerView, float slideOffset) {
super.onDrawerSlide(drawerView, slideOffset);
mDrawerToggle.syncState();
}
@Override
public void onDrawerStateChanged(int newState) {
super.onDrawerStateChanged(newState);
mDrawerToggle.syncState();
}
public void onDrawerClosed(View view) {
super.onDrawerClosed(view);
mDrawerToggle.syncState();
}
/** Called when a drawer has settled in a completely open state. */
public void onDrawerOpened(View drawerView) {
super.onDrawerOpened(drawerView);
mDrawerToggle.syncState();
}
};
dl.setDrawerListener(mDrawerToggle);
Теперь, когда ящик открыт, у меня появляется маленький значок, а затем он переключается на большой значок, когда ящик закрыт, но у меня нет плавной анимации.
Кто-нибудь знает, как получить плавную анимацию?
Ответ №1:
Попробуйте поместить @Override
аннотации, которые отсутствуют для последних двух прослушивателей, и удалить все syncState()
вызовы. Вызовите syncState() из onPostCreate
:
@Override
protected void onPostCreate(Bundle savedInstanceState) {
super.onPostCreate(savedInstanceState);
// Sync the toggle state after onRestoreInstanceState has occurred.
mDrawerToggle.syncState();
}
Комментарии:
1. Я только что попробовал, это не меняет поведение: нет анимации.
Ответ №2:
У меня была такая же проблема.Прошло много времени с тех пор, как был задан вопрос, но если вам все еще интересно, вот мой ответ.
поместите
invalidateOptionsMenu();
вместо
syncstate();
для onDrawerClosed(), onDrawerOpened(), onDrawerSlide(), onDrawerStateChanged()
Кроме того, поместите
@Override
protected void onPostCreate(Bundle savedInstanceState){
super.onPostCreate(savedInstanceState);
mDrawerToggle.syncState();
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
mDrawerToggle.onConfigurationChanged(newConfig);
}
Ответ №3:
Введите логическое значение как false.. private boolean isDrawerOpen = false;
public void onDrawerSlide(View drawerView, float slideOffset) {
if(slideOffset > .55 amp;amp; !isDrawerOpen){
super.onDrawerSlide(drawerView, 1);
onDrawerOpened(drawerView);
isDrawerOpen = true;
} else if(slideOffset < .45 amp;amp; isDrawerOpen) {
super.onDrawerSlide(drawerView,slideOffset);
onDrawerClosed(drawerView);
isDrawerOpen = false;
}
}
public void onDrawerClosed(View view) {
getActionBar().setTitle("Your title");
invalidateOptionsMenu();
}
public void onDrawerOpened(View drawerView) {
getActionBar().setTitle("your title");
invalidateOptionsMenu();
}
};
Комментарии:
1. Я попробовал ваше решение, но оно не решает мою проблему: у меня нет плавной анимации (я просто вижу значок открытого ящика, а затем значок закрытого ящика, а не анимацию).