版权声明:本文为HaiyuKing原创文章,转载请注明出处!

前言

简单实现侧边栏(侧滑菜单)效果:

点击触发打开左侧侧边栏,手势滑动关闭左侧侧边栏;

手势滑动打开右侧侧边栏,手势滑动关闭右侧侧边栏;

简单实现打开侧边栏的动画效果(透明度、移动效果);

打开侧边栏的时候动态更改侧边栏中的数据;

效果图

代码分析

此Demo只是简单实现侧边栏的效果,目的在于可以快速的导入到项目中。至于更复杂的效果,请阅读《参考资料》

使用步骤

一、项目组织结构图

注意事项:

1、  导入类文件后需要change包名以及重新import R文件路径

2、  Values目录下的文件(strings.xml、dimens.xml、colors.xml等),如果项目中存在,则复制里面的内容,不要整个覆盖

二、导入步骤

引入依赖库

在APP的build.gradle文件中添加以下代码:

apply plugin: 'com.android.application'

android {

compileSdkVersion 26

defaultConfig {

applicationId "com.why.project.drawerlayoutdemo"

minSdkVersion 16

targetSdkVersion 26

versionCode 1

versionName "1.0"

testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"

}

buildTypes {

release {

minifyEnabled false

proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'

}

}

}

dependencies {

implementation fileTree(dir: 'libs', include: ['*.jar'])

implementation 'com.android.support:appcompat-v7:26.1.0'

implementation 'com.android.support.constraint:constraint-layout:1.0.2'

testImplementation 'junit:junit:4.12'

androidTestImplementation 'com.android.support.test:runner:1.0.1'

androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.1'

//DrawerLayout侧边栏中动画效果用到的

compile 'com.nineoldandroids:library:2.4.0'

}

在styles.xml文件中注释和添加以下代码:【主要是用于Demo中的使用自定义的顶部导航栏效果】

@color/colorPrimary

@color/colorPrimaryDark

@color/colorAccent

三、使用方法

在Activity布局文件中使用DrawerLayout【注意下面底色标记的代码】

顶部菜单栏布局文件navigationbar_main.xml【布局较简单,就不展开了】

navigationbar_main.xml

创建侧边栏碎片文件——MainMenuLeftFragment、MainMenuRightFragment【根据项目实际需求,可能只需要创建一个即可】【可参考demo中,直接复制到实际项目中,注意修改activity布局文件中的fragment的完整路径地址】

MainMenuLeftFragment.java

packagecom.why.project.drawerlayoutdemo;importandroid.os.Bundle;importandroid.support.v4.app.Fragment;importandroid.util.Log;importandroid.view.LayoutInflater;importandroid.view.View;importandroid.view.ViewGroup;importandroid.widget.TextView;/*** Created by HaiyuKing

* Used 首页左侧侧边栏碎片界面*/

public class MainMenuLeftFragment extendsFragment {private static final String TAG = "MainMenuLeftFragment";/**View实例*/

privateView myView;// privateTextView tv_show;//重写

publicView onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

Log.d(TAG,"onCreateView");

myView= inflater.inflate(R.layout.fragment_home_left_menu, container, false);returnmyView;

}

@Overridepublic voidonActivityCreated(Bundle savedInstanceState) {//TODO Auto-generated method stub

super.onActivityCreated(savedInstanceState);

Log.d(TAG,"onActivityCreated");//初始化控件以及设置

initView();

}

@Overridepublic voidonResume() {super.onResume();

Log.d(TAG,"onResume");//初始化监听事件

initEvent();

}/**初始化控件*/

private voidinitView(){

Log.d(TAG,"initView");

tv_show=myView.findViewById(R.id.tv_show);

}/**初始化默认数据【这个需要在activity中执行,原因是:在布局文件中通过的方式引用Fragment,打开Activity的时候,Fragment的生命周期函数均执行了】

* 那么就存在一个问题,初始化fragment中的数据,可能会在activity数据初始化之前执行*/

publicvoidsetDefaultDatas(){

tv_show.setText(tv_show.getText()+ "\n执行了一次setDefaultDatas()");

}/**初始化监听事件*/

private voidinitEvent(){

}

}

fragment_home_left_menu.xml布局文件

/>

在Activity中使用如下【继承FragmentActivity或者其子类AppCompatActivity】

packagecom.why.project.drawerlayoutdemo;importandroid.content.Context;importandroid.os.Bundle;importandroid.support.v4.widget.DrawerLayout;importandroid.support.v7.app.AppCompatActivity;importandroid.util.Log;importandroid.view.Gravity;importandroid.view.View;importandroid.widget.ImageView;importcom.nineoldandroids.view.ViewHelper;public class MainActivity extendsAppCompatActivity {privateContext mContext;/**导航栏左侧的用户图标*/

privateImageView nav_userImg;/**导航栏左侧的侧边栏的父容器*/

privateDrawerLayout mDrawerLayout;/**导航栏左侧的侧边栏碎片界面*/

privateMainMenuLeftFragment leftMenuFragment;

@Overrideprotected voidonCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

mContext= this;//初始化控件

initViews();//初始化数据

initData();//初始化控件的点击事件

initEvent();

}private voidinitViews() {

nav_userImg=(ImageView) findViewById(R.id.nav_user);

mDrawerLayout=(DrawerLayout) findViewById(R.id.id_drawerLayout);//关闭手势滑动:DrawerLayout.LOCK_MODE_LOCKED_CLOSED(Gravity.LEFT:代表左侧的)

mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED, Gravity.LEFT);

leftMenuFragment=(MainMenuLeftFragment) getSupportFragmentManager().findFragmentById(R.id.fragment_leftmenu);

}private voidinitData() {

}private voidinitEvent() {//用户图标的点击事件

nav_userImg.setOnClickListener(newView.OnClickListener() {

@Overridepublic voidonClick(View v) {

OpenLeftMenu();

}

});//侧边栏的事件监听

mDrawerLayout.addDrawerListener(newDrawerLayout.DrawerListener()

{/*** 当抽屉滑动状态改变的时候被调用

* 状态值是STATE_IDLE(闲置-0),STATE_DRAGGING(拖拽-1),STATE_SETTLING(固定-2)中之一。*/@Overridepublic void onDrawerStateChanged(intnewState)

{

}/*** 当抽屉被滑动的时候调用此方法

* slideOffset 表示 滑动的幅度(0-1)*/@Overridepublic void onDrawerSlide(View drawerView, floatslideOffset)

{

Log.w("onDrawerSlide", "slideOffset="+slideOffset);//0.0 -- 0.56 -- 1.0

View mContent= mDrawerLayout.getChildAt(0);//内容区域view

View mMenu =drawerView;float scale = 1 -slideOffset;if (drawerView.getTag().equals("LEFT"))

{//左侧的侧边栏动画效果//设置左侧区域的透明度0.6f + 0.4f * (0.0 ... 1.0)【也就是打开的时候透明度从0.6f ... 1.0f,关闭的时候反之】

ViewHelper.setAlpha(mMenu, 0.6f + 0.4f *slideOffset);//移动内容区域:左侧侧边栏宽度 * (0.0 ... 1.0)【也就是打开的时候,内容区域移动从0 ... 左侧侧边栏宽度】

ViewHelper.setTranslationX(mContent,mMenu.getMeasuredWidth() *slideOffset);

mContent.invalidate();//重绘view

}else{//右侧的侧边栏动画效果//移动内容区域:-右侧侧边栏宽度 * (0.0 ... 1.0)【也就是打开的时候,内容区域移动从-0 ... -左侧侧边栏宽度】

ViewHelper.setTranslationX(mContent,-mMenu.getMeasuredWidth() *slideOffset);

mContent.invalidate();

}

}/*** 当一个抽屉被完全打开的时候被调用*/@Overridepublic voidonDrawerOpened(View drawerView) {if (drawerView.getTag().equals("LEFT")){//如果感觉显示有延迟的话,可以放到nav_userImg的点击事件监听中执行

leftMenuFragment.setDefaultDatas();//打开的时候初始化默认数据【比如:请求网络,获取数据】}

}/*** 当一个抽屉被完全关闭的时候被调用*/@Overridepublic voidonDrawerClosed(View drawerView)

{//关闭手势滑动:DrawerLayout.LOCK_MODE_LOCKED_CLOSED(Gravity.LEFT:代表左侧的)mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED, Gravity.LEFT);

}

});

}/**打开左侧的侧边栏*/

public voidOpenLeftMenu()

{

mDrawerLayout.openDrawer(Gravity.LEFT);//打开手势滑动:DrawerLayout.LOCK_MODE_UNLOCKED(Gravity.LEFT:代表左侧的)mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED,Gravity.LEFT);

}

}

混淆配置

参考资料

项目demo下载地址

java侧边栏_DrawerLayoutDemo【侧边栏(侧滑菜单)简单实现】相关推荐

  1. 原生Android 侧滑菜单实践(部分)

    此为第一个制作侧滑菜单的实践 . 此部分仅仅为部分实践: 仅缺menu的字符串布局,以及需要修改的MainActivity.java文件,也是需要主要修改的地方. 从使用MD设计-进行侧滑菜单的制作( ...

  2. android自定义侧滑菜单代码,原生Android 侧滑菜单实践(部分)

    此为第一个制作侧滑菜单的实践 . 此部分仅仅为部分实践: 仅缺menu的字符串布局,以及需要修改的MainActivity.java文件,也是需要主要修改的地方. 从使用MD设计-进行侧滑菜单的制作( ...

  3. DrawerLayoutDemo【侧边栏(侧滑菜单)简单实现】

    版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 简单实现侧边栏(侧滑菜单)效果: 点击触发打开左侧侧边栏,手势滑动关闭左侧侧边栏: 手势滑动打开右侧侧边栏,手势滑动关闭右侧侧边栏: ...

  4. Android 自定义控件打造史上最简单的侧滑菜单

    侧滑菜单在很多应用中都会见到,最近QQ5.0侧滑还玩了点花样~~对于侧滑菜单,一般大家都会自定义ViewGroup,然后隐藏菜单栏,当手指滑动时,通过Scroller或者不断的改变leftMargin ...

  5. Flutter | 超简单仿微信QQ侧滑菜单组件(改)

    文章目录 一.明确需求 二.实现需求 1. 滑动菜单实现使用`SingleChildScrollView`: 2. 列表滑动不够距离则菜单再次隐藏,距离足够则完全展示菜单. 3. 菜单支持事件处理. ...

  6. 【设计】精致的侧滑菜单设计案例

    侧滑菜单已经成为app一个极常用的设计,不管是事务类,效率类还是生活类app.侧滑菜单因Path 2.0和Facebook为开发者熟知,本文搜集了一些时髦的,精致的侧滑菜单设计案例. 优雅的纯色背景, ...

  7. Android组件——使用DrawerLayout仿网易新闻v4.4侧滑菜单

    转载请注明出处: http://blog.csdn.net/allen315410/article/details/42914501 概述 今天这篇博客将记录一些关于DrawerLayout的基本用法 ...

  8. 安卓之实现侧滑菜单DrawerLayout

    根据郭霖老师在他著作<第一行代码>中的介绍: Material Design Material Design是有谷歌的设计工程师们基于传统优秀的设计原则,结合丰富的创意和科学技术所发明的一 ...

  9. Android之实现侧滑菜单(左侧)

    只有忙完才有点时间来更新博客.今天要讲的是实现侧滑菜单,当然,这个我也是在借鉴了他人的开源项目后修改而成,个人认为还是可以的~~ 首先是效果图: 原理很简单,我其实是继承LinearLayout来实现 ...

最新文章

  1. 电视机检测大巴徘徊在英格兰的大街上
  2. 马斯克放的卫星被曝3%已成太空垃圾,占资源位置,最坏还能“锁死”地球人...
  3. 【搜索引擎】Smartsys部署ES的准备工作
  4. 如何在C++中调用python程序?
  5. 搭建AWStats日志分析系统
  6. php mysql_connect 不支持_php mysql_connect不支持的解决方法
  7. FireBug 调试JS入门 —如何调试JS
  8. 获取当前图层所处的坐标系统(C++)(ArcObject开发)
  9. 从零基础入门Tensorflow2.0 ----二、5.3 实战sklearn超参数搜索
  10. selenium2 原理和常用api
  11. stm32f207/stm32f407擦除内部flash讲解
  12. CSS样式--前端布局(五)
  13. JRebel出现ERROR Failed to obtain seat. Unable to connect to license server
  14. html打开ppt自动播放,ppt文件怎么打开就可以全屏自动播放
  15. 如何 重构网络 SDN架构实现
  16. 全国大学生英语竞赛考题总结
  17. 把Mitre SFR 1.4.2源码打包成MFC风格的exe
  18. 链游系列 Decentraland / MANA 项目玩法解析
  19. oracle忘记某个用户密码,Oracle忘记用户名密码怎样恢复
  20. iphone界面元素的大小

热门文章

  1. 李彦宏内部反思:“马化腾说的问题,百度也都有” | 36氪独家
  2. 最短路径算法【matlab仿真】
  3. 广西计算机一级机试考试试题,全国高校计算机等级考试(广西考区)一级机试试题(A)...
  4. wireshark抓包分析怎么看进程_WireShark抓包分析
  5. python的filter函数
  6. 【Golang Leetcode】总目录(Day1~100)
  7. python在线投票系统_Python开发基础-项目实训-在线投票系统.pptx
  8. 社交电商+广告分佣,广告电商开创全新商业模式
  9. 关于文件夹全部是exe,665kb解决办法
  10. CCNA - 理解IP地址和子网