当前位置: 移动技术网 > IT编程>移动开发>Android > Android 开源项目侧边栏菜单(SlidingMenu)使用详解

Android 开源项目侧边栏菜单(SlidingMenu)使用详解

2019年07月24日  | 移动技术网IT编程  | 我要评论

王力宏回应召妓传闻,水处理设备网,美丽高解像粤语

项目下载地址: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); 
} 
});

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网