Android侧滑菜单——SlidingMenu详解使用

来源:互联网 发布:淘宝店不开了怎么注销 编辑:程序博客网 时间:2024/05/22 05:12

简介

SlidingMenu 是一个Android端滑动菜单组件,功能强大而且经过简单的设置,就能实现两侧滑动菜单,还可以设置菜单的阴影、渐变色、划动模式等。
SlidingMenu 是github 上Android开源项目 能用于快速集成 Android 侧滑菜单效果
Slidingmenu 里面可以包含多种组件 fragment viewpager listview 等。

环境搭建

  1. 下载SlidingMenu 点击下载
  2. 新建AS项目,把SlidingMenu-master中的library文件夹(我把这个文件夹重命名为sliding_menu)拷到新建项目文件夹中与app文件夹同级
  3. 在settings.gradle文件中添加 include ‘:sliding_menu’

include ‘:sliding_menu’
4. 在build.gradle(Module:app)中添加依赖 compile project(‘:sliding_menu’)
dependencies {
compile fileTree(include: [‘*.jar’], dir: ‘libs’)
compile ‘com.android.support:appcompat-v7:21.0.2’
compile project(‘:sliding_menu’)
}
5. 第4步结束后我这边就提示有错误了,修改sliding_menu的build.gradle中的一些参数,如compileSdkVerdion、buildToolsVersion与你AS相匹配(可参照app的build.gradle
中的设置)

  1. Build/Make Project(到这步SlidingMenu就已经添加成功了)

Slidingmenu 提供属性修改

1 初始化Slidingmenu:
SlidingMenu menu = getSlidingMenu();

2 setMode //设置滑动模式
设置是左滑还是右滑,还是左右都可以滑
menu.setMode(SlidingMenu.LEFT);//设置左滑菜单
menu.setMode(SlidingMenu.LEFT_RIGHT);//设置左右都可滑动
menu.setMode(SlidingMenu.TOUCHMODE_NONE);//不能手势滑动

3 设置SlidingMenu阴影
menu.setShadowWidthRes(R.dimen.shadow_width);//设置阴影图片的宽度
menu.setSecondaryShadowDrawable(R.drawable.shadowright);//设置右侧菜单阴影的图片资源
menu.setShadowDrawable(R.drawable.shadow);//设置左侧菜单阴影图片

4 设置SlidingMenu边框距离
menu.setBehindOffsetRes();//SlidingMenu滑出时距离边框的剩余宽度
menu.setBehindOffset(getWindowManager().getDefaultDisplay().getWidth() / 5);
// getWindowManager().getDefaultDisplay().getWidth() / 5 表示 距离屏幕宽度 1/5

5 设置SlidingMenu渐变
menu.setFadeEnabled(true);/是否有渐变
menu.setFadeDegree(0.35f);//设置渐变比率

6 设置SlidingMenu布局

sm = getSlidingMenu();  setBehindContentView(R.layout.main_menu_frame);  sm.setSecondaryMenu(R.layout.main_menu_frame_two);  messageFragment = new MessageFragment();  profileFragment = new ProfileFragment();          getSupportFragmentManager().beginTransaction().replace(R.id.menu_frame, messageFragment).commit();          getSupportFragmentManager().beginTransaction().replace(R.id.menu_frame_two, profileFragment).commit();  

设置布局有3个方法 :

setContentView(R.layout.main); //设置slidingmenu中间的布局
setBehindContentView(R.layout.main_menu_frame);//设置左侧的布局
sm.setSecondaryMenu(R.layout.main_menu_frame_two);//设置右侧的布局

使用的是左右两侧 我一般设置为 fragment
getSupportFragmentManager().beginTransaction().replace(R.id.menu_frame,messageFragment).commit();
表示为替换 fragment

7 设置SlidingMenu滑动的拖拽效果
slidingMenu.setBehindScrollScale(0);

8 设置SlidingMenu判断打开状态 并 自动关闭或开启
menu.toggle();
如果SlidingMenu 它是open的,它会被关闭,反之亦然。

9 设置SlidingMenu触碰屏幕的范围
menu.setTouchModeBehind(SlidingMenu.TOUCHMODE_FULLSCREEN);
menu.setTouchModeAbove(SlidingMenu.TOUCHMODE_FULLSCREEN);
设置菜单滑动,触碰屏幕的范围setTouchModeAbove

10 设置SlidingMenu关闭器监听
监听主要分2种 open 和 close

open:
menu.setOnOpenedListener(onOpenListener);//监听slidingmenu打开之后调用
menu.setOnOpenListener(onOpenListener);//监听slidingmenu打开时调用

close:
两个监听器 注意看了 一个是 closed 一个是 close
menu.setOnClosedListener(listener);
menu.setOnCloseListener(listener);

这两个的区别就是
menu.OnCloseListener(OnClosedListener);//监听Slidingmenu关闭时事件
menu.OnClosedListener(OnClosedListener);//监听Slidingmenu关闭后事件

11 设置SlidingMenu是否淡入/淡出
menu.setFadeEnabled(true);

**重点内容**12 其它
menu.showMenu();//显示SlidingMenu
menu.showContent();//显示内容
menu.attachToActivity(this, SlidingMenu.SLIDING_CONTENT);//使SlidingMenu附加在Activity上
menu.setMenu(R.layout.menu);//设置menu的布局文件

常见问题

提示不支持getSupportActionBar等类似的方法

解决方案:修改SlideMenu中的SlidingFragmentActiviyt类,让其继承SherlockFragmentActivity 如 class SlidingFragmentActivity extends SherlockFragmentActivity implements SlidingActivityBase

运行之后,一直提示找不到相关类

解决方案:这个问题一直困扰我一上午,由于每个开源库中都是用了android-support-v4.jar,所以我们需要将最新版本的这个.jar包分别考入到workplace中的libs文件夹中,统一他们的版本。

代码案例

这里写图片描述

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

package com.zhy.zhy_slidemenu_demo;  import android.app.Activity;  import android.os.Bundle;  import com.jeremyfeinstein.slidingmenu.lib.SlidingMenu;  public class MainActivity extends Activity  {      @Override      protected void onCreate(Bundle savedInstanceState)      {          super.onCreate(savedInstanceState);          setContentView(R.layout.activity_main);          // 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.leftmenu);      }   }  

2、通过把Activity继承SlidingActivity
a、继承SlidingActivity
b、然后在onCreate中setBehindContentView(R.layout.leftmenu); 设置侧滑菜单的布局
c、通过getSlidingMenu()得到SlidingMenu对象,然后设置样式

package com.zhy.zhy_slidemenu_demo02;  import android.os.Bundle;  import com.jeremyfeinstein.slidingmenu.lib.SlidingMenu;  import com.jeremyfeinstein.slidingmenu.lib.app.SlidingActivity;  public class MainActivity extends SlidingActivity  {      @Override      public void onCreate(Bundle savedInstanceState)      {          super.onCreate(savedInstanceState);          setContentView(R.layout.activity_main);          setBehindContentView(R.layout.leftmenu);          // 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当作普通控件

<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" >      <LinearLayout          android:layout_width="wrap_content"          android:layout_height="wrap_content"          android:layout_marginLeft="30dp"          android:layout_marginTop="30dp" >          <com.jeremyfeinstein.slidingmenu.lib.SlidingMenu              xmlns:sliding="http://schemas.android.com/apk/res-auto"              android:id="@+id/slidingmenulayout"              android:layout_width="120dp"              android:layout_height="170dp"              android:background="#ffffffff"              sliding:behindOffset="0dp"              sliding:behindScrollScale="1"              sliding:fadeDegree="0.3"              sliding:fadeEnabled="true"              sliding:touchModeAbove="fullscreen"              sliding:viewAbove="@layout/pic" />      </LinearLayout>  </RelativeLayout>  

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

<?xml version="1.0" encoding="utf-8"?>  <ImageView xmlns:android="http://schemas.android.com/apk/res/android"      android:layout_width="120dp"      android:layout_height="170dp"      android:src="@drawable/zhy" />  

就是一张妹子图片。
这里写图片描述
最后看主Activity:
package com.zhy.zhy_slidemenu_demo03;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;

import com.jeremyfeinstein.slidingmenu.lib.SlidingMenu;

public class MainActivity extends Activity
{
private SlidingMenu mLeftMenu;

@Override  protected void onCreate(Bundle savedInstanceState)  {      super.onCreate(savedInstanceState);      setContentView(R.layout.activity_main);      mLeftMenu = (SlidingMenu) findViewById(R.id.slidingmenulayout);      // configure the SlidingMenu      // SlidingMenu menu = new SlidingMenu(this);      mLeftMenu.setMode(SlidingMenu.LEFT);      // 设置触摸屏幕的模式      mLeftMenu.setShadowWidthRes(R.dimen.shadow_width);      mLeftMenu.setShadowDrawable(R.drawable.shadow);      mLeftMenu.setMenu(R.layout.leftmenu);      mLeftMenu.setOnClickListener(new OnClickListener()      {          @Override          public void onClick(View v)          {              if (mLeftMenu.isMenuShowing())                  mLeftMenu.toggle();          }      });      // 设置滑动菜单视图的宽度      // 设置渐入渐出效果的值  }  
0 0