Android中如何设置导航抽屉默认展开1/3屏幕、滑动全开?
嘿,这个需求我之前做项目时刚好实现过,其实用DrawerLayout自带的API就能搞定,给你两种实用的方案,你可以根据自己的代码结构选:
方案一:基础API组合实现(推荐)
这种方式不用自定义View,直接用官方DrawerLayout的方法就能实现默认展开1/3、滑动可完全展开的效果:
第一步:计算屏幕宽度与目标展开宽度
先获取当前设备的屏幕宽度,算出1/3的尺寸:// 在Activity/Fragment中获取屏幕宽度 int screenWidth = getResources().getDisplayMetrics().widthPixels; // 计算默认展开的1/3宽度 int partialOpenWidth = screenWidth / 3;第二步:初始化抽屉的默认状态
找到你的DrawerLayout和NavigationView,设置初始展开并锁定到1/3位置:DrawerLayout drawerLayout = findViewById(R.id.drawer_layout); NavigationView navView = findViewById(R.id.nav_view); // 先让抽屉完全打开(后续会调整到1/3位置) drawerLayout.openDrawer(GravityCompat.START); // 延迟设置偏移量,避免被默认打开动画覆盖 drawerLayout.postDelayed(() -> { // 锁定抽屉在当前位置(1/3宽度) drawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_OPEN, GravityCompat.START); // 计算偏移比例,设置抽屉停在1/3位置 float slideOffset = (float) partialOpenWidth / screenWidth; drawerLayout.setDrawerSlideOffset(GravityCompat.START, slideOffset); }, 200); // 延迟时间对应抽屉动画时长,200ms足够适配大多数设备第三步:添加滑动监听解锁,允许完全展开
当用户开始滑动抽屉时,解锁锁定状态,让用户可以滑到完全展开:drawerLayout.addDrawerListener(new DrawerLayout.SimpleDrawerListener() { @Override public void onDrawerSlide(View drawerView, float slideOffset) { super.onDrawerSlide(drawerView, slideOffset); // 只要用户触发滑动,就解锁抽屉,允许自由滑动 if (drawerLayout.getDrawerLockMode(GravityCompat.START) == DrawerLayout.LOCK_MODE_LOCKED_OPEN) { drawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED, GravityCompat.START); } } @Override public void onDrawerOpened(View drawerView) { super.onDrawerOpened(drawerView); // 完全展开后保持解锁状态,允许用户关闭抽屉 drawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED, GravityCompat.START); } // 可选:如果希望用户关闭抽屉后,下次打开仍默认展开1/3,添加下面的方法 @Override public void onDrawerClosed(View drawerView) { super.onDrawerClosed(drawerView); drawerLayout.openDrawer(GravityCompat.START); drawerLayout.postDelayed(() -> { drawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_OPEN, GravityCompat.START); float slideOffset = (float) partialOpenWidth / screenWidth; drawerLayout.setDrawerSlideOffset(GravityCompat.START, slideOffset); }, 200); } });
关键注意事项
- 确保你的
NavigationView布局宽度设置为match_parent,这样才能支持完全展开;如果之前设了固定宽度,一定要改成match_parent。 - 延迟时间可以根据你的动画时长调整,比如如果抽屉打开动画是300ms,就把延迟改成300ms,避免偏移设置被动画覆盖。
- 测试不同屏幕尺寸,比如平板和手机,确保1/3的比例显示正常。
内容的提问来源于stack exchange,提问作者niraj kumar




