开发App抽屉功能,彻底掌握了吗?

简介: 在平时开发中,带有抽屉效果的App,应该还是挺多,今天就来看看这个效果是如何实现的,我们用DrawerLayout控件来实现!

DrawerLayout效果图


运行效果图:

2.gif

DrawerLayout 的介绍


DrawerLayout的官方文档介绍链接:http://androiddoc.qiniudn.com/reference/android/support/v4/widget/DrawerLayout.html 

DrawerLayout 类的结构图如下:

92.jpg

官方中文简介大概如下:

DrawerLayout作为窗口内容的顶层容器,允许从窗口的一个或两个垂直边缘拉出交互式“抽屉”视图。

抽屉定位和布局使用android:layout_gravity 子视图对应的属性进行控制,对应于您希望抽屉从哪个侧面出现:左侧或右侧(或支持布局方向的平台版本上的开始/结束)。请注意,您只能窗口的每个垂直边缘的一个抽屉视图。如果您的布局在窗口的每个垂直边缘配置多个抽屉视图,则会在运行时抛出异常。

3DrawerLayout 的使用


一般使用 DrawerLayout 侧滑菜单,可以通过 Toolbar + DrawerLayout来实现。

在res/layout 中,新建一个toolbar.xml文件

<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.Toolbar
   xmlns:android="http://schemas.android.com/apk/res/android"
   xmlns:app="http://schemas.android.com/apk/res-auto"
   android:id="@+id/tl_custom"
   android:layout_width="match_parent"
   android:layout_height="wrap_content"
   android:background="?attr/colorPrimary"
   android:minHeight="?attr/actionBarSize"
   android:popupTheme="@style/ThemeOverlay.AppCompat.Dark"
   app:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">
</android.support.v7.widget.Toolbar>

在新建一个drawerlayout.xml布局

<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.DrawerLayout
xmlns:android="http://schemas.android.com/apk/res/android"
   android:id="@+id/dl_left"
   android:layout_width="match_parent"
   android:layout_height="match_parent">
   <!--主布局-->
   <LinearLayout
       android:layout_width="match_parent"
       android:layout_height="match_parent">
   </LinearLayout>
   <!--侧滑菜单-->
   <RelativeLayout
       android:layout_width="180dp"
       android:clickable="true"
       android:layout_height="match_parent"
       android:layout_gravity="left"
       android:background="#fff"
       >

       <LinearLayout
           android:id="@+id/ll_home_navigation_top"
           android:layout_width="match_parent"
           android:layout_height="120dp"
           android:layout_alignParentTop="true"
           android:background="@color/colorPrimary"
           android:gravity="center"
           android:orientation="vertical">

           <ImageView
               android:layout_width="wrap_content"
               android:layout_height="wrap_content"
               android:layout_gravity="center"
               android:src="@mipmap/ic_launcher" />
       </LinearLayout>

       <ListView
           android:id="@+id/lv_left_menu"
           android:layout_below="@id/ll_home_navigation_top"
           android:layout_width="match_parent"
           android:layout_height="match_parent"
           android:divider="@null"
           android:text="DrawerLayout" />
   </RelativeLayout>
</android.support.v4.widget.DrawerLayout>

主布局activity_main.xml:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
   xmlns:tools="http://schemas.android.com/tools"
   android:layout_width="match_parent"
   android:layout_height="match_parent"
   android:orientation="vertical"
   tools:context=".MainActivity">
   <!--Toolbar-->
   <include layout="@layout/toolbar" />
   <!--DrawerLayout-->
   <include layout="@layout/drawerlayout" />
</LinearLayout>

MainActivity.java:

public class MainActivity extends AppCompatActivity {    
protected boolean statusBarCompat = true;    
   private static long DOUBLE_CLICK_TIME = 0L;    //声明相关变量
   private Toolbar toolbar;    
   private DrawerLayout mDrawerLayout;    
   private ActionBarDrawerToggle mDrawerToggle;    
   private ListView lvLeftMenu;    
   private String[] lvs = {"Android", "iOS", "Python", "Html5", "Java"};    
   private ArrayAdapter arrayAdapter;    @Override
   protected void onCreate(Bundle savedInstanceState) {        
   super.onCreate(savedInstanceState);
       setContentView(R.layout.activity_main);        
   if (statusBarCompat) {
           StatusBarCompat.compat(this, ContextCompat.getColor(this, R.color.colorPrimary));
           transparent19and20();
       }
       findByIdViews(); //获取控件
       toolbar.setTitle("Drawerlayout");//设置标题
       toolbar.setTitleTextColor(Color.parseColor("#ffffff")); //设置标题颜色
       setSupportActionBar(toolbar);
       getSupportActionBar().setHomeButtonEnabled(true); //设置返回键可用
       getSupportActionBar().setDisplayHomeAsUpEnabled(true);        //创建返回键,并实现打开关/闭监听
       mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout, toolbar, R.string.open, R.string.close) {            
       @Override
           public void onDrawerOpened(View drawerView) {                
           super.onDrawerOpened(drawerView);
           }            @Override
           public void onDrawerClosed(View drawerView) {                
           super.onDrawerClosed(drawerView);
           }
       };
       mDrawerToggle.syncState();
       mDrawerLayout.addDrawerListener(mDrawerToggle);        //设置菜单列表
       arrayAdapter = new ArrayAdapter(this, android.R.layout.simple_list_item_1, lvs);
       lvLeftMenu.setAdapter(arrayAdapter);
       lvLeftMenu.setOnItemClickListener(new AdapterView.OnItemClickListener() {            
           @Override
           public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
               Toast.makeText(MainActivity.this, "点击"+position , Toast.LENGTH_SHORT).show();
           }
       });
   }    
   //返回键监听
   @Override
   public boolean onKeyDown(int keyCode, KeyEvent event) {        
   if (event.getKeyCode() == KeyEvent.KEYCODE_MENU && mDrawerLayout != null) {            
   if (mDrawerLayout.isDrawerOpen(Gravity.LEFT)) {
               mDrawerLayout.closeDrawer(Gravity.LEFT);
           } else {
               mDrawerLayout.openDrawer(Gravity.LEFT);
           }            return true;
       }  else if (event.getKeyCode() == KeyEvent.KEYCODE_BACK) {            
       if (mDrawerLayout.isDrawerOpen(Gravity.LEFT)) {
               mDrawerLayout.closeDrawer(Gravity.LEFT);
           } else {                if ((System.currentTimeMillis() - DOUBLE_CLICK_TIME) > 2000) {
                   Toast.makeText(MainActivity.this, "再按一次退出", Toast.LENGTH_SHORT).show();
                   DOUBLE_CLICK_TIME = System.currentTimeMillis();
               } else {
                   finish();
               }
           }            return true;
       }        return super.onKeyDown(keyCode, event);
   }    protected void transparent19and20() {        
       if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT
               && Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
           getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
       }
   }    
       private void findByIdViews() {
       toolbar = (Toolbar) findViewById(R.id.tl_custom);
       mDrawerLayout = (DrawerLayout) findViewById(R.id.dl_left);
       lvLeftMenu = (ListView) findViewById(R.id.lv_left_menu);
   }
}


本文的源码,直接公众号后台回复:侧滑,获取完整源码。


4总结


本文属于原创,如有转载,请标注原作者,版权归本公众号所有。如果你喜欢我写的文章请关注 程序IT圈  ,欢迎大家继续关注本公众号的技术博文。如果您觉得这篇文章对你有所帮助的话,不妨点个赞或给个赞赏哈,您的支持就是我坚持原创的动力~

相关文章
|
1天前
|
前端开发 Java 开发工具
【03】完整flutter的APP打包流程-以apk设置图标-包名-签名-APP名-打包流程为例—-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈 章节内容【03】
【03】完整flutter的APP打包流程-以apk设置图标-包名-签名-APP名-打包流程为例—-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈 章节内容【03】
【03】完整flutter的APP打包流程-以apk设置图标-包名-签名-APP名-打包流程为例—-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈 章节内容【03】
|
2天前
|
Dart 前端开发 Android开发
【02】写一个注册页面以及配置打包选项打包安卓apk测试—开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
【02】写一个注册页面以及配置打包选项打包安卓apk测试—开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
【02】写一个注册页面以及配置打包选项打包安卓apk测试—开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
|
3天前
|
Dart 前端开发 架构师
【01】vs-code如何配置flutter环境-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈-供大大的学习提升
【01】vs-code如何配置flutter环境-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈-供大大的学习提升
|
19天前
|
开发框架 小程序 前端开发
圈子社交app前端+后端源码,uniapp社交兴趣圈子开发,框架php圈子小程序安装搭建
本文介绍了圈子社交APP的源码获取、分析与定制,PHP实现的圈子框架设计及代码编写,以及圈子小程序的安装搭建。涵盖环境配置、数据库设计、前后端开发与接口对接等内容,确保平台的安全性、性能和功能完整性。通过详细指导,帮助开发者快速搭建稳定可靠的圈子社交平台。
142 18
|
15天前
|
JSON 供应链 搜索推荐
淘宝APP分类API接口:开发、运用与收益全解析
淘宝APP作为国内领先的购物平台,拥有丰富的商品资源和庞大的用户群体。分类API接口是实现商品分类管理、查询及个性化推荐的关键工具。通过开发和使用该接口,商家可以构建分类树、进行商品查询与搜索、提供个性化推荐,从而提高销售额、增加商品曝光、提升用户体验并降低运营成本。此外,它还能帮助拓展业务范围,满足用户的多样化需求,推动电商业务的发展和创新。
40 5
|
14天前
|
移动开发 安全 搜索推荐
圈子社交系统APP,同城本地圈子论坛开发,让身边的人沟通更加紧密
圈子社交系统APP是一款基于社交网络的移动应用,用户可创建、加入和管理兴趣圈子。主要功能包括:动态分享与交流、实时聊天、会员体系与身份认证、活动策划等。该APP注重个性化定制、社交关系深化、隐私安全及跨平台互联,提供丰富的社交体验。
|
18天前
鸿蒙语言开发 几十套鸿蒙ArkTs app毕业设计及课程作业
鸿蒙语言开发 几十套鸿蒙ArkTs app毕业设计及课程作业
26 1
|
UED 数据管理 安全
如何分析APP功能需求、结构
<p><br></p> <p style="text-align:center"><span style="font-size:24px; color:#3366ff">如何分析APP功能需求、结构</span><br></p> <p></p> <p style="margin-top:0px; margin-bottom:0px; padding-top:0px; padding-
3860 0
|
3月前
|
小程序 JavaScript 前端开发
uni-app开发微信小程序:四大解决方案,轻松应对主包与vendor.js过大打包难题
uni-app开发微信小程序:四大解决方案,轻松应对主包与vendor.js过大打包难题
867 1
|
26天前
|
JSON 缓存 前端开发
HarmonyOS NEXT 5.0鸿蒙开发一套影院APP(附带源码)
本项目基于HarmonyOS NEXT 5.0开发了一款影院应用程序,主要实现了电影和影院信息的展示功能。应用包括首页、电影列表、影院列表等模块。首页包含轮播图与正在热映及即将上映的电影切换显示;电影列表模块通过API获取电影数据并以网格形式展示,用户可以查看电影详情;影院列表则允许用户选择城市后查看对应影院信息,并支持城市选择弹窗。此外,项目中还集成了Axios用于网络请求,并进行了二次封装以简化接口调用流程,同时添加了请求和响应拦截器来处理通用逻辑。整体代码结构清晰,使用了组件化开发方式,便于维护和扩展。 该简介概括了提供的内容,但请注意实际开发中还需考虑UI优化、性能提升等方面的工作。
91 11

热门文章

最新文章