Android--NavigationView+DrawerLayout实现侧滑(仿QQ)

简介: 版权声明:本文为博主原创文章,转载请标明出处。 https://blog.csdn.net/chaoyu168/article/details/79271880 1、首先导包[java] view plain copy print?compile 'com.
版权声明:本文为博主原创文章,转载请标明出处。 https://blog.csdn.net/chaoyu168/article/details/79271880

1、首先导包

[java]  view plain  copy
 print ?
  1. compile 'com.android.support:design:26.1.0'  
2、 使用NavigationView

首先在主布局文件中使用DrawerLayout作为外包装,里面包含一个主页面和侧滑的菜单页面,而侧滑菜单页面用NavigationView实现,drawerLayout中包含了主页面和侧滑的菜单页面

<?xml version="1.0" encoding="utf-8"?>  
<android.support.v4.widget.DrawerLayout  
    xmlns:android="http://schemas.android.com/apk/res/android"  
    xmlns:tools="http://schemas.android.com/tools"  
    android:id="@+id/activity_na"  
    android:layout_width="match_parent"  
    android:layout_height="match_parent"  
    tools:context="com.app.ui.MainActivity">  
    <LinearLayout  
        android:layout_width="match_parent"  
        android:layout_height="match_parent"  
        android:orientation="vertical">  
        <LinearLayout  
            android:layout_width="match_parent"  
            android:layout_height="wrap_content"  
            android:background="@color/blue"  
            android:gravity="center_vertical"  
            android:orientation="horizontal">  
            <ImageView  
                android:id="@+id/main_menu"  
                android:layout_width="wrap_content"  
                android:layout_height="wrap_content"  
                android:src="@mipmap/mm"  
                android:background="@color/blue"  
  
                android:layout_margin="20dp"/>  
            <TextView  
                android:layout_width="wrap_content"  
                android:layout_height="wrap_content"  
                android:layout_weight="1"  
                android:text="Demo"  
                android:textColor="#ffffff"  
                android:textSize="20sp"  
                android:layout_marginLeft="16dp"/>  
            <ImageView  
                android:id="@+id/search"  
                android:layout_width="wrap_content"  
                android:layout_height="wrap_content"  
                android:src="@mipmap/three"  
                android:background="@color/blue"  
                android:layout_margin="20dp"/>  
        </LinearLayout>  
        <TextView  
            android:layout_width="match_parent"  
            android:layout_height="match_parent"  
            android:text="主页"  
            android:textSize="22sp"  
            android:gravity="center"/>  
    </LinearLayout>  
    <android.support.design.widget.NavigationView  
        android:id="@+id/nav"  
        android:layout_gravity="left"  
        android:layout_width="wrap_content"  
        android:layout_height="match_parent"  
        android:fitsSystemWindows="true"  
        xmlns:app="http://schemas.android.com/apk/res-auto"  
        app:headerLayout="@layout/head"  
        app:menu="@menu/new_menu"  
  
        >  
  
    </android.support.design.widget.NavigationView>  
</android.support.v4.widget.DrawerLayout>  
head.xml

<?xml version="1.0" encoding="utf-8"?>  
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
    android:layout_width="match_parent"  
    android:layout_height="match_parent"  
    android:orientation="vertical"  
    android:gravity="center"  
    android:background="@color/blue"  
    >  
    <ImageView  
        android:id="@+id/person"  
        android:layout_width="72dp"  
        android:layout_height="72dp"  
        android:layout_marginTop="42dp"  
        android:src="@drawable/touxiang"/>  
    <TextView  
        android:layout_width="wrap_content"  
        android:layout_height="wrap_content"  
        android:textSize="20sp"  
        android:layout_marginTop="24dp"  
        android:textColor="#ffffff"  
        android:text="超宇"/>  
    <TextView  
        android:layout_width="wrap_content"  
        android:layout_height="wrap_content"  
        android:textSize="16sp"  
        android:layout_marginTop="12dp"  
        android:textColor="#ffffff"  
        android:layout_marginBottom="18dp"  
        android:text="不忘初心,方得始终."/>  
</LinearLayout>  

<?xml version="1.0" encoding="UTF-8" ?>  
<menu xmlns:android="http://schemas.android.com/apk/res/android">  
    <group  
        android:checkableBehavior="single">  
        <item  
            android:id="@+id/favorite"  
            android:icon="@drawable/huiyuan"  
            android:checkable="true"  
            android:title="    会员"/>  
  
    </group>  
    <item  
        android:id="@+id/wallet"  
        android:icon="@drawable/money"  
        android:title="    钱包"/>  
    <item  
        android:id="@+id/photo"  
        android:icon="@drawable/xiangce"  
        android:title="    相册"/>  
    <item  
        android:id="@+id/dress"  
        android:icon="@drawable/zhuangban"  
        android:title="    装扮"/>  
    <item  
        android:id="@+id/file"  
        android:icon="@drawable/wenjian"  
        android:title="    文件"/>  
  
</menu>  

import android.os.Bundle;  
import android.support.annotation.NonNull;  
import android.support.design.widget.NavigationView;  
import android.support.v4.widget.DrawerLayout;  
import android.support.v7.app.AppCompatActivity;  
import android.view.MenuItem;  
import android.view.View;  
import android.widget.ImageView;  
import android.widget.LinearLayout;  
import android.widget.Toast;  
  
public class MainActivity extends AppCompatActivity implements View.OnClickListener {  
  
    private DrawerLayout drawerLayout;  
    private NavigationView navigationView;  
    ImageView menu;  
    LinearLayout contentView ;  
  
    @Override  
    protected void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.activity_main);  
  
  
        drawerLayout = (DrawerLayout) findViewById(R.id.activity_na);  
        navigationView = (NavigationView) findViewById(R.id.nav);  
        menu= (ImageView) findViewById(R.id.main_menu);  
        View headerView = navigationView.getHeaderView(0);//获取头布局  
        menu.setOnClickListener(this);  
        navigationView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() {  
            @Override  
            public boolean onNavigationItemSelected(@NonNull MenuItem item) {  
                //item.setChecked(true);  
                Toast.makeText(MainActivity.this,item.getTitle().toString(),Toast.LENGTH_SHORT).show();  
                drawerLayout.closeDrawer(navigationView);  
                return true;  
            }  
        });  
        //为DrawerLayout控件添加监听器  
        drawerLayout.addDrawerListener(new DrawerLayout.SimpleDrawerListener() {  
            //当侧滑菜单正在滑动时触发的方法  
            /** 
             第一个参数:正在滑动的侧滑菜单 
             第二个参数:菜单滑动的宽度的百分比 
             **/  
            @Override  
            public void onDrawerSlide(View drawerView, float slideOffset) {  
                super.onDrawerSlide(drawerView, slideOffset);  
                //获得侧滑菜单的宽度  
                int drawerViewWidth = drawerView.getMeasuredWidth();  
                //根据滑动百分比计算内容部分应该向右边移动的距离  
                int marginLeft = (int)(drawerViewWidth * slideOffset) ;  
                //获得内容部分的View对象(内容View对象是第一个,所以是0)  
                contentView = (LinearLayout) drawerLayout.getChildAt(0);  
                //修改内容部分的左边距  
                contentView.setLeft(marginLeft);  
				//解决DrawerLayout不能全屏滑动的问题,displayWidthPercentage传 1,即可实现全屏滑动。
                // 如果你想让右侧菜单也是全屏,只要将对应的 "mLeftDragger" 改为 "mRightDragger"
                setDrawerLeftEdgeSize(MainActivity.this,drawerLayout,1);
            }  
        });  
    }  
  
  
    @Override  
    public void onClick(View v) {  
        switch (v.getId()){  
            case R.id.main_menu://点击菜单,跳出侧滑菜单  
                if (drawerLayout.isDrawerOpen(navigationView)){  
                    drawerLayout.closeDrawer(navigationView);  
                }else{  
                    drawerLayout.openDrawer(navigationView);  
                }  
                break;  
        }  
    }  
  
  
    @Override  
    public void onPointerCaptureChanged(boolean hasCapture) {  
  
    }  
	
	private void setDrawerLeftEdgeSize (Activity activity, DrawerLayout drawerLayout, float displayWidthPercentage) {
        if (activity == null || drawerLayout == null) return;
        try {
            // 找到 ViewDragHelper 并设置 Accessible 为true
            Field leftDraggerField =
                    drawerLayout.getClass().getDeclaredField("mLeftDragger");//Right
            leftDraggerField.setAccessible(true);
            ViewDragHelper leftDragger = (ViewDragHelper) leftDraggerField.get(drawerLayout);

            // 找到 edgeSizeField 并设置 Accessible 为true
            Field edgeSizeField = leftDragger.getClass().getDeclaredField("mEdgeSize");
            edgeSizeField.setAccessible(true);
            int edgeSize = edgeSizeField.getInt(leftDragger);

            // 设置新的边缘大小
            Point displaySize = new Point();
            activity.getWindowManager().getDefaultDisplay().getSize(displaySize);
            edgeSizeField.setInt(leftDragger, Math.max(edgeSize, (int) (displaySize.x *
                    displayWidthPercentage)));
        } catch (NoSuchFieldException e) {
        } catch (IllegalArgumentException e) {
        } catch (IllegalAccessException e) {
        }
    }
  
}  
以上的此外,侧滑菜单头布局也可以设置点击事件,通过View  head = navigtionview .getHeaderView实现,这里的点击事件我没有写,这里我还将状态栏的颜色改成了标题栏的颜色,达到整体的界面协调。具体实现方法可以参考文章http://blog.csdn.net/s1674521/article/details/59480114

思考如何关闭手势滑动?NavigationView的确没有相关关闭侧滑手势的属性,但是别忘了,drawerLayout却可以,通过以下属性可以关闭滑动手势操作:
在android抽屉开发中,需要关闭手势滑动,来滑出弹出框

mDrawer_layout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED)//关闭手势滑动

mDrawer_layout.setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED);//打开手势滑动

NavigationView Item图标不显示原始颜色解决办法:

navigationView.setItemIconTintList(null);

目录
相关文章
|
Android开发
Android Support Design Library之NavigationView(二)
Android Support Design Library之NavigationView(二)
71 0
|
XML Android开发 数据格式
Android Support Design Library之NavigationView(一)
Android Support Design Library之NavigationView(一)
90 0
Android Support Design Library之NavigationView(一)
|
XML Android开发 数据格式
Android Design Support Library全解:Part 3 NavigationView 抽屉菜单页面
Android Design Support Library系列第三弹,NavigationView 抽屉菜单的实现 左侧弹出菜单 抽屉菜单页面是一中很常见的页面设计,虽然有很多第三方库(SlidingMenu)来帮助我们实现该功能,但是如果自己来实现的话,确实是很麻烦的工作。
1042 0
|
3天前
|
Linux 编译器 Android开发
FFmpeg开发笔记(九)Linux交叉编译Android的x265库
在Linux环境下,本文指导如何交叉编译x265的so库以适应Android。首先,需安装cmake和下载android-ndk-r21e。接着,下载x265源码,修改crosscompile.cmake的编译器设置。配置x265源码,使用指定的NDK路径,并在配置界面修改相关选项。随后,修改编译规则,编译并安装x265,调整pc描述文件并更新PKG_CONFIG_PATH。最后,修改FFmpeg配置脚本启用x265支持,编译安装FFmpeg,将生成的so文件导入Android工程,调整gradle配置以确保顺利运行。
24 1
FFmpeg开发笔记(九)Linux交叉编译Android的x265库
|
26天前
|
Java Android开发
Android 开发获取通知栏权限时会出现两个应用图标
Android 开发获取通知栏权限时会出现两个应用图标
12 0
|
1月前
|
XML 缓存 Android开发
Android开发,使用kotlin学习多媒体功能(详细)
Android开发,使用kotlin学习多媒体功能(详细)
102 0
|
1月前
|
设计模式 人工智能 开发工具
安卓应用开发:构建未来移动体验
【2月更文挑战第17天】 随着智能手机的普及和移动互联网技术的不断进步,安卓应用开发已成为一个热门领域。本文将深入探讨安卓平台的应用开发流程、关键技术以及未来发展趋势。通过分析安卓系统的架构、开发工具和框架,本文旨在为开发者提供全面的技术指导,帮助他们构建高效、创新的移动应用,以满足不断变化的市场需求。
18 1
|
20小时前
|
数据库 Android开发 开发者
安卓应用开发:构建高效用户界面的策略
【4月更文挑战第24天】 在竞争激烈的移动应用市场中,一个流畅且响应迅速的用户界面(UI)是吸引和保留用户的关键。针对安卓平台,开发者面临着多样化的设备和系统版本,这增加了构建高效UI的复杂性。本文将深入分析安卓平台上构建高效用户界面的最佳实践,包括布局优化、资源管理和绘制性能的考量,旨在为开发者提供实用的技术指南,帮助他们创建更流畅的用户体验。
|
17天前
|
XML 开发工具 Android开发
构建高效的安卓应用:使用Jetpack Compose优化UI开发
【4月更文挑战第7天】 随着Android开发不断进化,开发者面临着提高应用性能与简化UI构建流程的双重挑战。本文将探讨如何使用Jetpack Compose这一现代UI工具包来优化安卓应用的开发流程,并提升用户界面的流畅性与一致性。通过介绍Jetpack Compose的核心概念、与传统方法的区别以及实际集成步骤,我们旨在提供一种高效且可靠的解决方案,以帮助开发者构建响应迅速且用户体验优良的安卓应用。