You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动