登录 立即注册
安币:

安卓巴士 - 安卓开发 - Android开发 - 安卓 - 移动互联网门户

查看: 906|回复: 4

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

[复制链接]

444

主题

824

帖子

1964

安币

手工艺人

发表于 2018-1-9 12:18:25 | 显示全部楼层 |阅读模式

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

[Java] 查看源文件 复制代码
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:

[Java] 查看源文件 复制代码
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;变量:

[Java] 查看源文件 复制代码
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即可,这个是缩放动画:

[Java] 查看源文件 复制代码
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; 
} 
}; 

        拉伸动画:

[Java] 查看源文件 复制代码
mtransformer = new canvastransformer() { 
@override 
public void transformcanvas(canvas canvas, float percentopen) { 
canvas.scale(percentopen, 1, 0, 0); 
} 
});


9

主题

9273

帖子

1798

安币

Android大神

Rank: 6Rank: 6

发表于 2018-1-10 03:59:33 | 显示全部楼层
感觉楼主很用心,辛苦啦~

27

主题

9391

帖子

1890

安币

Android大神

Rank: 6Rank: 6

发表于 2018-1-10 19:32:18 | 显示全部楼层
感觉楼主很用心,辛苦啦~

11

主题

9101

帖子

1003

安币

Android大神

Rank: 6Rank: 6

发表于 2018-1-11 17:11:32 | 显示全部楼层
感谢分享,楼主V5~

20

主题

8938

帖子

2366

安币

Android大神

Rank: 6Rank: 6

发表于 2018-1-13 04:51:54 | 显示全部楼层
楼主威武,以后多发干货,多办活动~!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

站长推荐

通过邮件订阅最新安卓weekly信息
上一条 /4 下一条

下载安卓巴士客户端

全国最大的安卓开发者社区
联系我们
关闭
合作电话:
13802416937
Email:
435399051@qq.com
商务市场合作/投稿
问题反馈及帮助
联系我们

广告投放| 下载客户端|申请友链|手机版|站点统计|安卓巴士 ( 粤ICP备15117877号 )

快速回复 返回顶部 返回列表