我在我的应用程序中使用v7 appcompat库中的ActionBarDrawerToggle,并且在菜单到箭头动画方面遇到了一些麻烦。 根据材料设计指南,导航抽屉应与工具栏重叠,打开抽屉时不应使用图标动画。
为什么在打开/关闭导航栏时默认启用动画,如何禁用它?
另外,如何在其他出现时触发动画?我找到了this solution,但它仅适用于Android API 11+,并且可以通过调用setDrawerIndicatorEnabled(false)
或工具栏中的扩展ActionView来覆盖。
答案 0 :(得分:16)
当您创建ActionBarDrawerToggle时,请执行此操作以禁用动画/箭头并始终显示汉堡包:
drawerToggle = new ActionBarDrawerToggle(this, drawerLayout,
getToolbar(), R.string.open, R.string.close) {
@Override
public void onDrawerClosed(View view) {
super.onDrawerClosed(view);
}
@Override
public void onDrawerOpened(View drawerView) {
super.onDrawerOpened(drawerView);
super.onDrawerSlide(drawerView, 0); // this disables the arrow @ completed state
}
@Override
public void onDrawerSlide(View drawerView, float slideOffset) {
super.onDrawerSlide(drawerView, 0); // this disables the animation
}
};
答案 1 :(得分:4)
我今天遇到了这个问题,发现很简单,(我相信)一个合适的解决方案:
不要将ActionBarDrawerToggle实例设置为DrawerLayout的DrawerListener。这样ActionBarDrawerToggle将不会执行依赖于抽屉滑动偏移的动画。
如果你需要DrawerLayout的监听器,请使用DrawerLayout.DrawerListener。
修改强> 您还可以将ActionBarDrawerToggle设置为侦听器,但必须覆盖其onDrawerSlide方法。例如像这样:
mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout, R.string.drawer_open_desc, R.string.drawer_close_desc) {
@Override
public void onDrawerSlide(View drawerView, float slideOffset) {
super.onDrawerSlide(drawerView, 0);
}
};
使用0值而不是slideOffset调用super.onDrawerSlide()
,禁用动画
答案 2 :(得分:1)
在您的主题中添加DrawerArrowStyle
,如上所示。这样做诀窍......
<style name="AppTheme" parent="Theme.AppCompat.NoActionBar">
<!-- Customize your theme here. -->
<item name="drawerArrowStyle">@style/DrawerArrowStyle</item>
</style>
<style name="DrawerArrowStyle" parent="Widget.AppCompat.DrawerArrowToggle">
<item name="spinBars">true</item>
<item name="color">@android:color/white</item>
</style>
示例活动
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toolbar mToolbar = (Toolbar) findViewById(R.id.toolbar);
DrawerLayout mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
ActionBarDrawerToggle mDrawerToggle = new ActionBarDrawerToggle(
this, mDrawerLayout, mToolbar,
R.string.navigation_drawer_open, R.string.navigation_drawer_close
);
mDrawerLayout.setDrawerListener(mDrawerToggle);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setHomeButtonEnabled(true);
mDrawerToggle.syncState();
}
答案 3 :(得分:1)
我知道我已经很晚了......
在活动中执行此操作:
drawerToggle.setDrawerIndicatorEnabled(false);
在styles.xml主题中。这样做:
<item name="android:homeAsUpIndicator">@drawable/menu_icon</item>
答案 4 :(得分:0)
mDrawerToggle = new ActionBarDrawerToggle(
this,
mDrawerLayout,
mToolbar,
R.string.drawer_open,
R.string.drawer_close
) {
public void onDrawerClosed(View view) {
super.onDrawerClosed(view);
invalidateOptionsMenu();
syncState();
}
public void onDrawerOpened(View drawerView) {
super.onDrawerOpened(drawerView);
invalidateOptionsMenu();
syncState();
mLeftMenuFrame.bringToFront();
mRightMenuFrame.bringToFront();
}
};
mDrawerToggle.setDrawerIndicatorEnabled(true);
mDrawerLayout.setDrawerListener(mDrawerToggle);
mToolbar.inflateMenu(R.menu.menu_main);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
mDrawerToggle.syncState();