SlidingMenu使用简介

我们在前面说了如何自定义实现侧滑菜单,但是自己动手毕竟麻烦,网上已经有很多大神写出的很好的开源项目,其中SlidingMenu就是一个很不错的项目。SlidingMenu 是GitHub上的一个开源项目,用来实现SlidingMenu的菜单效果(https://github.com/jfeinstein10/SlidingMenu)目前为止,它提供了侧滑菜单的最佳实现:定制灵活、各种阴影和渐变的滑动效果也很不错。而且目前看来这个项目关注的人很多,各种issue和pull request很频繁,能够保证这个开源库的质量,遇到问题也能有人帮忙答疑。SlidingMenu 是一个开源库,而不是一个完整的项目,要把它作为libary引入到你自己的工程里,简单配置一下就可以实现SlidingMenu的效果。看下他的目录结构:

SlidingMenu使用简介

所谓工欲善其事,必先利其器,我们先了解下SlidingMenu 的一些常用属性和方法
  • menu.setMode(SlidingMenu.LEFT_RIGHT);//设置侧滑菜单的位置,可选值LEFT , RIGHT , LEFT_RIGHT (两边都有菜单时设置)
  • menu.setTouchModeAbove(SlidingMenu.TOUCHMODE_MARGIN);// 设置触摸屏幕的模式,可选值MARGIN , CONTENT 
  • menu.setShadowWidthRes(R.dimen.shadow_width);//根据dimension资源文件的ID来设置阴影的宽度
  • menu.setShadowDrawable(R.drawable.shadow);//根据资源文件ID来设置滑动菜单的阴影效果
  • menu.setBehindOffsetRes(R.dimen.slidingmenu_offset);//SlidingMenu划出时主页面显示的剩余宽度
  • menu.setBehindWidth(400);//设置SlidingMenu菜单的宽度
  • menu.setFadeDegree(0.35f);//SlidingMenu滑动时渐入渐出效果的值
  • menu.setBehindScrollScale(1.0f);//设置SlidingMenu与下方视图的移动的速度比,当为1时同时移动,取值0-1
  • menu.setSecondaryShadowDrawable(R.drawable.shadow);//设置二级菜单的阴影效果
  • menu.setSecondaryMenu(R.layout.right_menu_frame);//设置右边(二级)侧滑菜单
  • menu.attachToActivity(this, SlidingMenu.SLIDING_CONTENT);//把滑动菜单添加进所有的Activity中,可选值SLIDING_CONTENT , SLIDING_WINDOW
  • menu.setMenu(R.layout.menu_layout);//设置menu的布局文件
  • menu.toggle();//动态判断自动关闭或开启SlidingMenu
  • menu.showMenu();//显示SlidingMenu
  • menu.showContent();//显示内容
现在看下几种实现方式
1、在Activity中通过SlidingMenu构造方法,直接设置侧滑菜单
a、获得SlidingMenu对象
b、设置触摸屏幕的模式
c、然后设置侧滑菜单的布局
/**
 * 在Activity中通过SlidingMenu构造方法,直接设置侧滑菜单
 * @author Administrator
 *
 */
public class MainActivity1 extends Activity {
   @Override
   protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main1);
      // configure the SlidingMenu
      SlidingMenu menu = new SlidingMenu(this);
      menu.setMode(SlidingMenu.LEFT);
      // 设置触摸屏幕的模式
      menu.setTouchModeAbove(SlidingMenu.TOUCHMODE_FULLSCREEN);
      menu.setShadowWidthRes(R.dimen.shadow_width);
      menu.setShadowDrawable(R.drawable.shadow);

      // 设置滑动菜单视图的宽度
      menu.setBehindOffsetRes(R.dimen.slidingmenu_offset);
      // 设置渐入渐出效果的值
      menu.setFadeDegree(0.35f);
      /**
       * SLIDING_WINDOW will include the Title/ActionBar in the content
       * section of the SlidingMenu, while SLIDING_CONTENT does not.
       */
      menu.attachToActivity(this, SlidingMenu.SLIDING_CONTENT);
      // 为侧滑菜单设置布局
      menu.setMenu(R.layout.left_menu);
   }
}
效果如下:
SlidingMenu使用简介

2、通过继承SlidingActivity
a、继承SlidingActivity
b、然后在onCreate中setBehindContentView(R.layout.left_menu)设置侧滑菜单的布局
c、通过getSlidingMenu()得到SlidingMenu对象,然后设置样式
public class MainActivity2 extends SlidingActivity {
   @Override
   public  void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main1);

      setBehindContentView(R.layout.left_menu);
      // configure the SlidingMenu  
      SlidingMenu menu = getSlidingMenu();
      menu.setMode(SlidingMenu.LEFT);
      // 设置触摸屏幕的模式  
      menu.setTouchModeAbove(SlidingMenu.TOUCHMODE_FULLSCREEN);
      menu.setShadowWidthRes(R.dimen.shadow_width);
      menu.setShadowDrawable(R.drawable.shadow);

      // 设置滑动菜单视图的宽度  
      menu.setBehindOffsetRes(R.dimen.slidingmenu_offset);
      // 设置渐入渐出效果的值  
      menu.setFadeDegree(0.35f);

   }
3、将SlidingMenu当作普通控件
可以把SlidingMenu作为自定义view,然后在布局中声明使用
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
      xmlns:tools="http://schemas.android.com/tools"
      android:id="@+id/id_main_ly"
      android:layout_width="match_parent"
      android:layout_height="match_parent" >

      <com.jeremyfeinstein.slidingmenu.lib.SlidingMenu
      xmlns:sliding="http://schemas.android.com/apk/res-auto"
      android:id="@+id/slidingmenulayout"
      android:layout_width="match_parent"
      android:layout_height="match_parent"
      android:background="#ffffffff"
      sliding:behindOffset="0dp"
      sliding:behindScrollScale="1"
      sliding:fadeDegree="0.3"
      sliding:fadeEnabled="true"
      sliding:touchModeAbove="fullscreen"
      sliding:viewAbove="@layout/activity_content" />
      <!-- sliding:viewAbove就是主界面要显示的布局内容 -->

      </RelativeLayout>
SlidingMenu相当于一个容器,用来存放将要显示的布局,viewAbove的值即为另一个布局
看下activity_content.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
      android:layout_width="match_parent"
      android:layout_height="match_parent" >

      <TextView
      android:layout_width="match_parent"
      android:layout_height="wrap_content"
      android:text="主界面" />

  </LinearLayout>
最后看下Activity
public class MainActivity3 extends Activity {
    private SlidingMenu mLeftMenu;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main3);

        mLeftMenu = (SlidingMenu) findViewById(R.id.slidingmenulayout);
        mLeftMenu.setMode(SlidingMenu.LEFT);
        // 设置触摸屏幕的模式
        mLeftMenu.setShadowWidthRes(R.dimen.shadow_width);
        mLeftMenu.setShadowDrawable(R.drawable.shadow);

        mLeftMenu.setMenu(R.layout.left_menu);

        mLeftMenu.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                if (mLeftMenu.isMenuShowing())
                    mLeftMenu.toggle();
            }
        });
      
    }
}
效果如下:
SlidingMenu使用简介

4、继承SlidingFragmentActivity来实现侧滑菜单
上面的例子,SlidingMenu的布局中控件的事件都需要写在Activity中,这样代码就过于庞大了,通过继承SlidingFragmentActivity,我们可以使用Fragment作为侧滑菜单的布局容器。
MainActiviyt4.java如下
public class MainActivity4 extends SlidingFragmentActivity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        this.requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.activity_main4);
        // 初始化SlidingMenu
        initFragmentMenu();


    }

    private void initFragmentMenu() {

        Fragment leftMenuFragment = new LeftMenuFragment();
        setBehindContentView(R.layout.left_menu_frame);
        getSupportFragmentManager().beginTransaction()
                .replace(R.id.layout_left_menu_frame, leftMenuFragment)
                .commit();
        SlidingMenu menu = getSlidingMenu();
        menu.setMode(SlidingMenu.LEFT_RIGHT);
        // 设置触摸屏幕的模式
        menu.setTouchModeAbove(SlidingMenu.TOUCHMODE_MARGIN);
        menu.setShadowWidthRes(R.dimen.shadow_width);
        menu.setShadowDrawable(R.drawable.shadow);
        // 设置滑动菜单视图的宽度
        menu.setBehindOffsetRes(R.dimen.slidingmenu_offset);
        // menu.setBehindWidth()
        // 设置渐入渐出效果的值
        menu.setFadeDegree(0.35f);
        // menu.setBehindScrollScale(1.0f);
        menu.setSecondaryShadowDrawable(R.drawable.shadow);
        // 设置右边(二级)侧滑菜单
        menu.setSecondaryMenu(R.layout.right_menu_frame);
        Fragment rightMenuFragment = new RightMenuFragment();
        getSupportFragmentManager().beginTransaction()
                .replace(R.id.layout_right_menu_frame, rightMenuFragment)
                .commit();
    }

    public void showLeftMenu(View view) {
        getSlidingMenu().showMenu();
    }

    public void showRightMenu(View view) {
        getSlidingMenu().showSecondaryMenu();
    }
}
核心代码:
Fragment leftMenuFragment = new LeftMenuFragment();
setBehindContentView(R.layout.left_menu_frame);
getSupportFragmentManager().beginTransaction()
.replace(R.id.frm_left_menu_layout, leftMenuFragment).commit();
首先给侧滑菜单通过 setBehindContentView(R.layout.left_menu_frame); 设置一个布局,此布局中只有一个FrameLayout,然后使用FragmentManager将Fragment替换掉此Fragment,这样这个 Fragment就作为我们侧滑菜单的布局了,我们的事件处理代码也可以写在Fragement中,而不是Activity中。Fragment作为我们的菜单界面,就任由自己发挥了。
效果如下:
SlidingMenu使用简介

SlidingMenu的监听事件
/**
* 设置打开监听事件,当滑动菜单被打开时调用
*/
public void setOnOpenListener(OnOpenListener listener) {
mOpenListener = listener;
}

/**
* 设置关闭监听事件,当滑动菜单被关闭时调用
*/
public void setOnCloseListener(OnCloseListener listener) {
//mViewAbove.setOnCloseListener(listener);
mCloseListener = listener;
}

/**
* 设置打开监听事件,当滑动菜单被打开过之后调用
*/
public void setOnOpenedListener(OnOpenedListener listener) {
mViewAbove.setOnOpenedListener(listener);
}

/**
* 设置关闭监听事件,当滑动菜单被关闭过之后调用
*/
public void setOnClosedListener(OnClosedListener listener) {
mViewAbove.setOnClosedListener(listener);
}

就介绍这么多吧

源代码

参考:


上一篇:自定义Application使用示例——几个Activity共同操作某个变量


下一篇:使用GitHub建立个人网站