开发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圈  ,欢迎大家继续关注本公众号的技术博文。如果您觉得这篇文章对你有所帮助的话,不妨点个赞或给个赞赏哈,您的支持就是我坚持原创的动力~

相关文章
|
26天前
|
移动开发 小程序
如何让uni-app开发的H5页面顶部原生标题和小程序的顶部标题不一致?
如何让uni-app开发的H5页面顶部原生标题和小程序的顶部标题不一致?
|
2月前
|
API 数据安全/隐私保护 iOS开发
利用uni-app 开发的iOS app 发布到App Store全流程
利用uni-app 开发的iOS app 发布到App Store全流程
95 3
|
2月前
|
Android开发 开发者 UED
个人开发 App 成功上架手机应用市场的关键步骤
个人开发 App 成功上架手机应用市场的关键步骤
|
2月前
|
开发工具 数据安全/隐私保护 Android开发
【教程】APP 开发后如何上架?
【教程】APP 开发后如何上架?
|
4天前
|
前端开发 Android开发 开发者
【Flutter前端技术开发专栏】Flutter中的混合应用(Hybrid Apps)开发
【4月更文挑战第30天】本文探讨了使用Flutter开发混合应用的方法。混合应用结合Web技术和原生容器,提供快速开发和低成本维护。Flutter,一款现代前端框架,以其插件系统和高性能渲染引擎支持混合应用开发。通过创建Flutter项目、添加平台代码、使用WebView、处理平台间通信以及发布应用,开发者可构建跨平台混合应用。虽然混合应用有性能和用户体验的局限,但Flutter的跨平台兼容性和丰富的插件生态降低了开发成本。开发者应根据项目需求权衡选择。
【Flutter前端技术开发专栏】Flutter中的混合应用(Hybrid Apps)开发
|
26天前
|
移动开发 小程序 前端开发
使用uni-app开发(h5、小程序、app)步骤
使用uni-app开发(h5、小程序、app)步骤
|
2月前
|
Java Android开发 开发者
【Uniapp开发】APP的真机调试指南,从开发到上架全过程
【Uniapp开发】APP的真机调试指南,从开发到上架全过程
36 3
游戏直播APP平台开发多少钱成本:定制与成品源码差距这么大
开发一款游戏直播APP平台所需的费用是多少?对于计划投身这一领域的投资者来说,首要关心的问题之一就是。本文将探讨两种主要的开发模式——定制开发与成品源码二次开发的成本差异及其优劣势。
|
2月前
|
开发框架 移动开发 JavaScript
SpringCloud微服务实战——搭建企业级开发框架(四十六):【移动开发】整合uni-app搭建移动端快速开发框架-环境搭建
正如优秀的软件设计一样,uni-app把一些移动端常用的功能做成了独立的服务或者插件,我们在使用的时候只需要选择使用即可。但是在使用这些服务或者插件时一定要区分其提供的各种服务和插件的使用场景,例如其提供的【uni-starter快速开发项目模版】几乎集成了移动端所需的所有基础功能,使用非常方便,但是其许可协议只允许对接其uniCloud的JS开发服务端,不允许对接自己的php、java等其他后台系统。
153 2
|
2月前
|
移动开发 负载均衡 小程序
代驾app开发丨代驾系统开发玩法详情丨代驾系统开发网页版/H5/小程序及源码部署
**司机/代驾员端**:司机可以通过APP接收订单,查看订单详情、路线和导航,提供现场服务并进行确认。