Android SlidingMenu 使用详解

分类:【Android github 控件】 40902人阅读 评论(54) 收藏 举报 SlidingMenu 侧滑菜单 Android

目录(?)[+]

转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/36677279

很多APP都有侧滑菜单的功能,部分APP左右都是侧滑菜单~SlidingMenu 这个开源项目可以很好帮助我们实现侧滑功能,如果对SlidingMenu 还不是很了解的童鞋,可以参考下本篇博客。将侧滑菜单引入项目的方式很多中,本博客先通过例子介绍各种引入方式,然后给大家展示个实例:主布局ViewPager,左右各一个侧滑菜单的用法,差不多已经能满足大部分应用的需求了。关于常用属性,在文章末尾介绍。

1、在Activity中通过SlidingMenu构造方法,直接设置侧滑菜单

[java] view plain copy
  1. packagecom.zhy.zhy_slidemenu_demo;
  2. importandroid.app.Activity;
  3. importandroid.os.Bundle;
  4. importcom.jeremyfeinstein.slidingmenu.lib.SlidingMenu;
  5. publicclassMainActivityextendsActivity
  6. {
  7. @Override
  8. protectedvoidonCreate(BundlesavedInstanceState)
  9. {
  10. super.onCreate(savedInstanceState);
  11. setContentView(R.layout.activity_main);
  12. //configuretheSlidingMenu
  13. SlidingMenumenu=newSlidingMenu(this);
  14. menu.setMode(SlidingMenu.LEFT);
  15. //设置触摸屏幕的模式
  16. menu.setTouchModeAbove(SlidingMenu.TOUCHMODE_FULLSCREEN);
  17. menu.setShadowWidthRes(R.dimen.shadow_width);
  18. menu.setShadowDrawable(R.drawable.shadow);
  19. //设置滑动菜单视图的宽度
  20. menu.setBehindOffsetRes(R.dimen.slidingmenu_offset);
  21. //设置渐入渐出效果的值
  22. menu.setFadeDegree(0.35f);
  23. /**
  24. *SLIDING_WINDOWwillincludetheTitle/ActionBarinthecontent
  25. *sectionoftheSlidingMenu,whileSLIDING_CONTENTdoesnot.
  26. */
  27. menu.attachToActivity(this,SlidingMenu.SLIDING_CONTENT);
  28. //为侧滑菜单设置布局
  29. menu.setMenu(R.layout.leftmenu);
  30. }
  31. }

效果图:

Android SlidingMenu 使用详解_第1张图片

是不是特别简单~几行代码搞定~哈~

2、通过把Activity继承SlidingActivity

a、继承SlidingActivity

b、然后在onCreate中setBehindContentView(R.layout.leftmenu); 设置侧滑菜单的布局

c、通过getSlidingMenu()得到SlidingMenu对象,然后设置样式

[java] view plain copy
  1. packagecom.zhy.zhy_slidemenu_demo02;
  2. importandroid.os.Bundle;
  3. importcom.jeremyfeinstein.slidingmenu.lib.SlidingMenu;
  4. importcom.jeremyfeinstein.slidingmenu.lib.app.SlidingActivity;
  5. publicclassMainActivityextendsSlidingActivity
  6. {
  7. @Override
  8. publicvoidonCreate(BundlesavedInstanceState)
  9. {
  10. super.onCreate(savedInstanceState);
  11. setContentView(R.layout.activity_main);
  12. setBehindContentView(R.layout.leftmenu);
  13. //configuretheSlidingMenu
  14. SlidingMenumenu=getSlidingMenu();
  15. menu.setMode(SlidingMenu.LEFT);
  16. //设置触摸屏幕的模式
  17. menu.setTouchModeAbove(SlidingMenu.TOUCHMODE_FULLSCREEN);
  18. menu.setShadowWidthRes(R.dimen.shadow_width);
  19. menu.setShadowDrawable(R.drawable.shadow);
  20. //设置滑动菜单视图的宽度
  21. menu.setBehindOffsetRes(R.dimen.slidingmenu_offset);
  22. //设置渐入渐出效果的值
  23. menu.setFadeDegree(0.35f);
  24. /**
  25. *SLIDING_WINDOWwillincludetheTitle/ActionBarinthecontent
  26. *sectionoftheSlidingMenu,whileSLIDING_CONTENTdoesnot.
  27. */
  28. //menu.attachToActivity(this,SlidingMenu.SLIDING_CONTENT);
  29. //menu.setMenu(R.layout.leftmenu);
  30. }
  31. }

效果图和第一种方式一样~是不是也很简单~~

3、将SlidingMenu当作普通控件

可以把SlidingMenu作为普通的view,然后在布局中声明,丧心病狂的玩~下面看个例子:

[html] view plain copy
  1. <RelativeLayoutxmlns:android="http://schemas.android.com/apk/res/android"
  2. xmlns:tools="http://schemas.android.com/tools"
  3. android:id="@+id/id_main_ly"
  4. android:layout_width="match_parent"
  5. android:layout_height="match_parent">
  6. <LinearLayout
  7. android:layout_width="wrap_content"
  8. android:layout_height="wrap_content"
  9. android:layout_marginLeft="30dp"
  10. android:layout_marginTop="30dp">
  11. <com.jeremyfeinstein.slidingmenu.lib.SlidingMenu
  12. xmlns:sliding="http://schemas.android.com/apk/res-auto"
  13. android:id="@+id/slidingmenulayout"
  14. android:layout_width="120dp"
  15. android:layout_height="170dp"
  16. android:background="#ffffffff"
  17. sliding:behindOffset="0dp"
  18. sliding:behindScrollScale="1"
  19. sliding:fadeDegree="0.3"
  20. sliding:fadeEnabled="true"
  21. sliding:touchModeAbove="fullscreen"
  22. sliding:viewAbove="@layout/pic"/>
  23. </LinearLayout>
  24. </RelativeLayout>

我们SlidingMenu作为普通View在布局文件中设置了布局,并且设置了viewAbove的值为另一个布局。

下面看pic布局:

[html] view plain copy
  1. <?xmlversion="1.0"encoding="utf-8"?>
  2. <ImageViewxmlns:android="http://schemas.android.com/apk/res/android"
  3. android:layout_width="120dp"
  4. android:layout_height="170dp"
  5. android:src="@drawable/zhy"/>

就是一张妹子图片。

最后看主Activity:

[java] view plain copy
  1. packagecom.zhy.zhy_slidemenu_demo03;
  2. importandroid.app.Activity;
  3. importandroid.os.Bundle;
  4. importandroid.view.View;
  5. importandroid.view.View.OnClickListener;
  6. importcom.jeremyfeinstein.slidingmenu.lib.SlidingMenu;
  7. publicclassMainActivityextendsActivity
  8. {
  9. privateSlidingMenumLeftMenu;
  10. @Override
  11. protectedvoidonCreate(BundlesavedInstanceState)
  12. {
  13. super.onCreate(savedInstanceState);
  14. setContentView(R.layout.activity_main);
  15. mLeftMenu=(SlidingMenu)findViewById(R.id.slidingmenulayout);
  16. //configuretheSlidingMenu
  17. //SlidingMenumenu=newSlidingMenu(this);
  18. mLeftMenu.setMode(SlidingMenu.LEFT);
  19. //设置触摸屏幕的模式
  20. mLeftMenu.setShadowWidthRes(R.dimen.shadow_width);
  21. mLeftMenu.setShadowDrawable(R.drawable.shadow);
  22. mLeftMenu.setMenu(R.layout.leftmenu);
  23. mLeftMenu.setOnClickListener(newOnClickListener()
  24. {
  25. @Override
  26. publicvoidonClick(Viewv)
  27. {
  28. if(mLeftMenu.isMenuShowing())
  29. mLeftMenu.toggle();
  30. }
  31. });
  32. //设置滑动菜单视图的宽度
  33. //设置渐入渐出效果的值
  34. /**
  35. *SLIDING_WINDOWwillincludetheTitle/ActionBarinthecontent
  36. *sectionoftheSlidingMenu,whileSLIDING_CONTENTdoesnot.
  37. */
  38. }
  39. }

效果图:

Android SlidingMenu 使用详解_第2张图片

通过SlidingMenu给图片设置一个滑动展示介绍,你也可以滑动显示任何东西,下载、分享按钮什么的。图片很多的时候不知道效率咋样,可以这么玩,但是不建议哈~


4、SlidingMenu设置左右侧滑菜单例子

上面介绍的3个方法,SlidingMenu的布局中控件的事件都需要写在Activity中,这样代码比较臃肿,一般会使用Fragment作为侧滑菜单的布局容器。

核心代码:

[java] view plain copy
  1. FragmentleftMenuFragment=newMenuLeftFragment();
  2. setBehindContentView(R.layout.left_menu_frame);
  3. getSupportFragmentManager().beginTransaction()
  4. .replace(R.id.id_left_menu_frame,leftMenuFragment).commit();
  5. SlidingMenumenu=getSlidingMenu();
  6. menu.setMode(SlidingMenu.LEFT_RIGHT);
  7. //设置触摸屏幕的模式
  8. menu.setTouchModeAbove(SlidingMenu.TOUCHMODE_MARGIN);

先给侧滑菜单通过 setBehindContentView(R.layout.left_menu_frame);设置一个布局,此布局中只有一个FrameLayout,然后使用FragmentManager将Fragment替换掉此Fragment,这样这个Fragment就作为我们侧滑菜单的布局了,我们的事件处理代码也可以写在Fragement中,而不是Activity中。

下面看具体例子:

首先分别是左右两边的两个Fragment:

MenuLeftFragment

[java] view plain copy
  1. packagecom.zhy.zhy_slidemenu_demo04;
  2. importjava.util.Arrays;
  3. importjava.util.List;
  4. importandroid.os.Bundle;
  5. importandroid.support.v4.app.Fragment;
  6. importandroid.view.LayoutInflater;
  7. importandroid.view.View;
  8. importandroid.view.ViewGroup;
  9. importandroid.widget.ArrayAdapter;
  10. importandroid.widget.ListAdapter;
  11. importandroid.widget.ListView;
  12. publicclassMenuLeftFragmentextendsFragment
  13. {
  14. privateViewmView;
  15. privateListViewmCategories;
  16. privateList<String>mDatas=Arrays
  17. .asList("聊天","发现","通讯录","朋友圈","订阅号");
  18. privateListAdaptermAdapter;
  19. @Override
  20. publicViewonCreateView(LayoutInflaterinflater,ViewGroupcontainer,
  21. BundlesavedInstanceState)
  22. {
  23. if(mView==null)
  24. {
  25. initView(inflater,container);
  26. }
  27. returnmView;
  28. }
  29. privatevoidinitView(LayoutInflaterinflater,ViewGroupcontainer)
  30. {
  31. mView=inflater.inflate(R.layout.left_menu,container,false);
  32. mCategories=(ListView)mView
  33. .findViewById(R.id.id_listview_categories);
  34. mAdapter=newArrayAdapter<String>(getActivity(),
  35. android.R.layout.simple_list_item_1,mDatas);
  36. mCategories.setAdapter(mAdapter);
  37. }
  38. }

左边的侧滑布局就是一个ListView,代码比较简单~

MenuRightFragment

[java] view plain copy
  1. packagecom.zhy.zhy_slidemenu_demo04;
  2. importandroid.os.Bundle;
  3. importandroid.support.v4.app.Fragment;
  4. importandroid.view.LayoutInflater;
  5. importandroid.view.View;
  6. importandroid.view.ViewGroup;
  7. publicclassMenuRightFragmentextendsFragment
  8. {
  9. privateViewmView;
  10. @Override
  11. publicViewonCreateView(LayoutInflaterinflater,ViewGroupcontainer,
  12. BundlesavedInstanceState)
  13. {
  14. if(mView==null)
  15. {
  16. mView=inflater.inflate(R.layout.right_menu,container,false);
  17. }
  18. returnmView;
  19. }
  20. }
右边的侧滑菜单的Fragment,加载了一个布局,没有做任何事件处理~

最后是MainActivity

[java] view plain copy
  1. packagecom.zhy.zhy_slidemenu_demo04;
  2. importjava.util.ArrayList;
  3. importjava.util.List;
  4. importandroid.os.Bundle;
  5. importandroid.support.v4.app.Fragment;
  6. importandroid.support.v4.app.FragmentPagerAdapter;
  7. importandroid.support.v4.view.ViewPager;
  8. importandroid.view.View;
  9. importandroid.view.Window;
  10. importcom.jeremyfeinstein.slidingmenu.lib.SlidingMenu;
  11. importcom.jeremyfeinstein.slidingmenu.lib.app.SlidingFragmentActivity;
  12. publicclassMainActivityextendsSlidingFragmentActivity
  13. {
  14. privateViewPagermViewPager;
  15. privateFragmentPagerAdaptermAdapter;
  16. privateList<Fragment>mFragments=newArrayList<Fragment>();
  17. @Override
  18. publicvoidonCreate(BundlesavedInstanceState)
  19. {
  20. super.onCreate(savedInstanceState);
  21. this.requestWindowFeature(Window.FEATURE_NO_TITLE);
  22. setContentView(R.layout.activity_main);
  23. //初始化SlideMenu
  24. initRightMenu();
  25. //初始化ViewPager
  26. initViewPager();
  27. }
  28. privatevoidinitViewPager()
  29. {
  30. mViewPager=(ViewPager)findViewById(R.id.id_viewpager);
  31. MainTab01tab01=newMainTab01();
  32. MainTab02tab02=newMainTab02();
  33. MainTab03tab03=newMainTab03();
  34. mFragments.add(tab01);
  35. mFragments.add(tab02);
  36. mFragments.add(tab03);
  37. /**
  38. *初始化Adapter
  39. */
  40. mAdapter=newFragmentPagerAdapter(getSupportFragmentManager())
  41. {
  42. @Override
  43. publicintgetCount()
  44. {
  45. returnmFragments.size();
  46. }
  47. @Override
  48. publicFragmentgetItem(intarg0)
  49. {
  50. returnmFragments.get(arg0);
  51. }
  52. };
  53. mViewPager.setAdapter(mAdapter);
  54. }
  55. privatevoidinitRightMenu()
  56. {
  57. FragmentleftMenuFragment=newMenuLeftFragment();
  58. setBehindContentView(R.layout.left_menu_frame);
  59. getSupportFragmentManager().beginTransaction()
  60. .replace(R.id.id_left_menu_frame,leftMenuFragment).commit();
  61. SlidingMenumenu=getSlidingMenu();
  62. menu.setMode(SlidingMenu.LEFT_RIGHT);
  63. //设置触摸屏幕的模式
  64. menu.setTouchModeAbove(SlidingMenu.TOUCHMODE_MARGIN);
  65. menu.setShadowWidthRes(R.dimen.shadow_width);
  66. menu.setShadowDrawable(R.drawable.shadow);
  67. //设置滑动菜单视图的宽度
  68. menu.setBehindOffsetRes(R.dimen.slidingmenu_offset);
  69. //设置渐入渐出效果的值
  70. menu.setFadeDegree(0.35f);
  71. //menu.setBehindScrollScale(1.0f);
  72. menu.setSecondaryShadowDrawable(R.drawable.shadow);
  73. //设置右边(二级)侧滑菜单
  74. menu.setSecondaryMenu(R.layout.right_menu_frame);
  75. FragmentrightMenuFragment=newMenuRightFragment();
  76. getSupportFragmentManager().beginTransaction()
  77. .replace(R.id.id_right_menu_frame,rightMenuFragment).commit();
  78. }
  79. publicvoidshowLeftMenu(Viewview)
  80. {
  81. getSlidingMenu().showMenu();
  82. }
  83. publicvoidshowRightMenu(Viewview)
  84. {
  85. getSlidingMenu().showSecondaryMenu();
  86. }
  87. }

简单说明一下,MainActivity继承的是SlidingFragmentActivity ,在Activity中FragmentPagerAdapter和viewPager作为主布局,然后分别初始化SlidingMenu的两边的菜单。

效果图:


哈哈,微信又躺枪了~~这个例子应该可以满足一般APP的需求了。

5、SlidingMenu的一些常用属性

//设置侧滑菜单的位置,可选值LEFT , RIGHT , LEFT_RIGHT (两边都有菜单时设置)

menu.setMode(SlidingMenu.LEFT_RIGHT);

// 设置触摸屏幕的模式,可选只MARGIN , CONTENT
menu.setTouchModeAbove(SlidingMenu.TOUCHMODE_MARGIN);

//根据dimension资源文件的ID来设置阴影的宽度
menu.setShadowWidthRes(R.dimen.shadow_width);

//根据资源文件ID来设置滑动菜单的阴影效果
menu.setShadowDrawable(R.drawable.shadow);

// 这两个都是设置滑动菜单视图的宽度,二选一
//设置SlidingMenu离屏幕的偏移量
menu.setBehindOffsetRes(R.dimen.slidingmenu_offset);
//设置宽度
menu.setBehindWidth()

// 设置渐入渐出效果的值
menu.setFadeDegree(0.35f);

//设置SlidingMenu与下方视图的移动的速度比,当为1时同时移动,取值0-1
menu.setBehindScrollScale(1.0f);

//设置二级菜单的阴影效果
menu.setSecondaryShadowDrawable(R.drawable.shadow);

//设置右边(二级)侧滑菜单
menu.setSecondaryMenu(R.layout.right_menu_frame);

//为侧滑菜单设置布局
menu.setMenu(R.layout.leftmenu);

//把滑动菜单添加进所有的Activity中,可选值SLIDING_CONTENT , SLIDING_WINDOW
menu.attachToActivity(this, SlidingMenu.SLIDING_CONTENT);

还有几个监听事件:

[java] view plain copy
  1. /**
  2. *设置打开监听事件,当滑动菜单被打开时调用
  3. */
  4. publicvoidsetOnOpenListener(OnOpenListenerlistener){
  5. mOpenListener=listener;
  6. }
  7. /**
  8. *设置关闭监听事件,当滑动菜单被关闭时调用
  9. */
  10. publicvoidsetOnCloseListener(OnCloseListenerlistener){
  11. //mViewAbove.setOnCloseListener(listener);
  12. mCloseListener=listener;
  13. }
  14. /**
  15. *设置打开监听事件,当滑动菜单被打开过之后调用
  16. */
  17. publicvoidsetOnOpenedListener(OnOpenedListenerlistener){
  18. mViewAbove.setOnOpenedListener(listener);
  19. }
  20. /**
  21. *设置关闭监听事件,当滑动菜单被关闭过之后调用
  22. */
  23. publicvoidsetOnClosedListener(OnClosedListenerlistener){
  24. mViewAbove.setOnClosedListener(listener);
  25. }

更多相关文章

  1. Android中的界面布局之帧布局,相对布局
  2. 学习Android从0开始之基础篇(3)-视图组件之布局管理器
  3. 初学Android,使用菜单资源(十九)
  4. Android 五大布局FrameLayout,LinearLayout ,AbsoluteLayout...
  5. Android的CheckBox控件的点击效果布局文件
  6. Android开发UI布局必备基础知识
  7. Android基础入门教程——2.2.1 LinearLayout(线性布局)

随机推荐

  1. android网游开发之socket的简单设计和实
  2. Android平台上关于IM的实践总结
  3. Android(安卓)摇一摇开发——灵敏度优化
  4. Android单位区别与转化
  5. Android(安卓)屏幕尺寸适配大全
  6. 安卓开发中调用WebService实例
  7. android 优秀源码
  8. Android几种常见的多渠道(批量)打包方式
  9. Android中的广播机制(一)----- 接收广播
  10. 高德地图Android错误码1008、32和7;错误提