Android 开源项目侧边栏菜单(SlidingMenu)使用详解
项目下载地址:https://github.com/jfeinstein10/slidingmenu
注意: slidingmenu依赖于另一个开源项目actionbarsherlock,所以需要将actionbarsherlock添加作为slidingmenu的库工程,否则会报资源找不到错误。
然后再将slidingmenu添加到自己的工程中去。
slidingmenu集成常见错误:
jar mismatch! fix your dependencies :引用的工程和自身工程以来的jar包版本不一致导致的冲突。确保slidingmenu和actionbarsherlock所使用的jar包版本一致
如果使用到actionbarsherlock的相关api,可能报找不到getsupportactionbar等actionbarsherlock的方法。原因是使用actionbarsherlock的activity需继承于sherlockactivity,修改slidingmenu library中的slidingfragmentactivity,让它继承于sherlockfragmentactivity,重新编译library导入。
slidingmenu 常用属性介绍:
menu.setmode(slidingmenu.left);//设置左滑菜单
menu.settouchmodeabove(slidingmenu.touchmode_fullscreen);//设置滑动的屏幕范围,该设置为全屏区域都可以滑动
menu.setshadowdrawable(r.drawable.shadow);//设置阴影图片
menu.setshadowwidthres(r.dimen.shadow_width);//设置阴影图片的宽度
menu.setbehindoffsetres(r.dimen.slidingmenu_offset);//slidingmenu划出时主页面显示的剩余宽度
menu.setbehindwidth(400);//设置slidingmenu菜单的宽度
menu.setfadedegree(0.35f);//slidingmenu滑动时的渐变程度
menu.attachtoactivity(this, slidingmenu.sliding_content);//使slidingmenu附加在activity上
menu.setmenu(r.layout.menu_layout);//设置menu的布局文件
menu.toggle();//动态判断自动关闭或开启slidingmenu
menu.showmenu();//显示slidingmenu
menu.showcontent();//显示内容
menu.setonopenlistener(onopenlistener);//监听slidingmenu打开
关于关闭menu有两个监听,简单的来说,对于menu close事件,一个是when,一个是after
menu.onclosedlistener(onclosedlistener);//监听slidingmenu关闭时事件
menu.onclosedlistener(onclosedlistener);//监听slidingmenu关闭后事件
左右都可以划出slidingmenu菜单只需要设置
menu.setmode(slidingmenu.left_right);属性,然后设置右侧菜单的布局文件
menu.setsecondaryshadowdrawable(r.drawable.shadowright);//右侧菜单的阴影图片
使用fragment实现slidingmenu:
1.首先activity继承自slidingmenu包下的slidingfragmentactivity
2. setcontentview(r.layout.content_frame);//该layout为一个全屏的framelayout
3. setbehindcontentview(r.layout.menu_frame);//设置slidingmenu使用的布局,同样是一个全屏的framelayout
4.设置slidingmenu左侧菜单的fragment
setbehindcontentview(r.layout.menu_frame); fragmenttransaction t = this.getsupportfragmentmanager().begintransaction(); leftmenufragment = new menufragment(); t.replace(r.id.menu_frame, leftmenufragment); t.commit();
menufragment其实就是一个fragment,显示一个listview
然后点击listview的每一项的时候,通知activity切换不同的fragment
为了看清效果,我们新建5个frament,分别是
fragment1, fragment2, fragment3, fragment4, fragment5
在slidingmenu中用listview显示。
设置主页面显示的fragment:
if (savedinstancestate == null) {//== null的时候新建fragment1 contentfragment = new fragment1(); } else {//不等于null,直接get出来 //不等于null,找出之前保存的当前activity显示的fragment contentfragment = getsupportfragmentmanager().getfragment(savedinstancestate, "contentfragment"); } //设置内容fragment getsupportfragmentmanager() .begintransaction() .replace(r.id.content_frame, contentfragment) .commit();
在activity的onsaveinstancestate中保存当前显示的fragment
getsupportfragmentmanager().putfragment(outstate, "contentfragment", contentfragment);
设置slidingmenu属性
sm = getslidingmenu();
//如果只显示左侧菜单就是用left,右侧就right,左右都支持就left_right
sm.setmode(slidingmenu.left_right);//设置菜单滑动模式,菜单是出现在左侧还是右侧,还是左右两侧都有
sm.setshadowdrawable(r.drawable.shadow);//设置阴影的图片资源
sm.setshadowwidthres(r.dimen.shadow_width);//设置阴影图片的宽度
//sm.setbehindwidth(200);//设置菜单的宽
sm.setbehindoffsetres(r.dimen.slidingmenu_offset);//slidingmenu划出时主页面显示的剩余宽度
sm.settouchmodeabove(slidingmenu.touchmode_fullscreen);//设置滑动的区域
支持右侧划出菜单:
//slidingmenu可以同时支持划出左右两侧的菜单,互不冲突,而且动画优美,体验良好。
sm.setsecondarymenu(r.layout.menu_frame2);//设置右侧菜单
sm.setsecondaryshadowdrawable(r.drawable.shadowright);//设置右侧菜单阴影的图片资源
//右侧slidingmenu的fragment
getsupportfragmentmanager().begintransaction().replace(r.id.menu_frame2, new samplelistfragment()).commit();
设置actionbar可以被点击:
getsupportactionbar().sethomebuttonenabled(true);//actionbar主按键可以被点击
getsupportactionbar().setdisplayhomeasupenabled(true);//显示向左的图标
setslidingactionbarenabled(false);//左右两侧slidingmenu的fragment是否显示标题栏
切换主页面显示的fragment:
public void switchcontent(fragment f) {
//给内容fragment赋值,并在onsaveinstancestate时保存这个fragment
contentfragment = f;
fragmenttransaction t = getsupportfragmentmanager().begintransaction();
t.replace(r.id.content_frame, f);
t.commit();
sm.showcontent();
使用普通activity实现slidingmenu:
slidingmenu menu = new slidingmenu(this);//直接new,而不是getslidingmenu
menu.setmode(slidingmenu.left);
menu.settouchmodeabove(slidingmenu.touchmode_fullscreen);
menu.setshadowdrawable(r.drawable.shadow);
menu.setshadowwidthres(r.dimen.shadow_width);
menu.setbehindoffsetres(r.dimen.slidingmenu_offset);
menu.setbehindwidth(400);//设置slidingmenu菜单的宽度
menu.setfadedegree(0.35f);
menu.attachtoactivity(this, slidingmenu.sliding_content);//必须调用
menu.setmenu(r.layout.menu_layout_left);//就是普通的layout布局
menu.setbehindcanvastransformer(mtransformer);
相应slidingmenu里的点击事件,因为slidingmenu已经被包含在了activity中了,所以直接findviewbyid(id),拿到view之后就可以进行相应的处理。
支持左右两侧都能划出菜单
menu.setsecondarymenu(r.layout.menu_layout_right);
menu.setsecondaryshadowdrawable(r.drawable.shadowright);
右侧菜单一样直接findviewbyid(id),拿到view之后就可以任意处理了
更换slidingmenu的动画
slidingmenu支持左滑或者右滑时定义不同的动画,包括拉伸,缩放,旋转等动画。就是在滑动的过程中,slidingmenu如何出现的动画。
动画使用也很简单
首先定义canvastransformer mtransformer;变量:
mtransformer = new canvastransformer() { @override public void transformcanvas(canvas canvas, float percentopen) { float scale = (float) (percentopen*0.25 + 0.75); canvas.scale(scale, scale, canvas.getwidth()/2, canvas.getheight()/2); } };
然后将mtransformer对象设置给slidingmenu即可,这个是缩放动画:
private void initslidupcanvastransformer() { mtransformer = new canvastransformer() { @override public void transformcanvas(canvas canvas, float percentopen) { canvas.translate(0, canvas.getheight()*(1-interp.getinterpolation(percentopen))); } }; } private static interpolator interp = new interpolator() { @override public float getinterpolation(float t) { t -= 1.0f; return t * t * t + 1.0f; } };
拉伸动画:
mtransformer = new canvastransformer() { @override public void transformcanvas(canvas canvas, float percentopen) { canvas.scale(percentopen, 1, 0, 0); } });