SliferMenu详解

简介: SlidingMenu简介: SlidingMenu的是一种比较新的设置界面或配置界面效果,在主界面左滑或者右滑出现设置界面,能方便的进行各种操作.目前有大量的应用都在使用这一效果。如Evernote、Google+、Foursquare等,国内的豌豆夹,人人,360手机助手等都使用SlidingMenu的界面方案。 项目下载地址:https://github.com/jfeins

SlidingMenu简介:

SlidingMenu的是一种比较新的设置界面或配置界面效果,在主界面左滑或者右滑出现设置界面,能方便的进行各种操作.目前有大量的应用都在使用这一效果。如Evernote、Google+、Foursquare等,国内的豌豆夹,人人,360手机助手等都使用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
     

  1. setBehindContentView(R.layout.menu_frame);  
  2. FragmentTransaction t = this.getSupportFragmentManager().beginTransaction();  
  3. leftMenuFragment = new MenuFragment();  
  4. t.replace(R.id.menu_frame, leftMenuFragment);  
  5. t.commit();  

MenuFragment其实就是一个Fragment,显示一个ListView
然后点击ListView的每一项的时候,通知Activity切换不同的Fragment
为了看清效果,我们新建5个Frament,分别是
Fragment1, Fragment2, Fragment3, Fragment4, Fragment5
在SlidingMenu中用ListView显示。

设置主页面显示的Fragment:

  1. if (savedInstanceState == null) {//== null的时候新建Fragment1  
  2. contentFragment = new Fragment1();  
  3. else {//不等于null,直接get出来  
  4. //不等于null,找出之前保存的当前Activity显示的Fragment  
  5. contentFragment = getSupportFragmentManager().getFragment(savedInstanceState, "contentFragment");  
  6. }  
  7. //设置内容Fragment  
  8. getSupportFragmentManager()  
  9. .beginTransaction()  
  10. .replace(R.id.content_frame, contentFragment)  
  11. .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
:

  1. slidingMenu menu = new SlidingMenu(this);//直接new,而不是getSlidingMenu  
  2. menu.setMode(SlidingMenu.LEFT);  
  3. menu.setTouchModeAbove(SlidingMenu.TOUCHMODE_FULLSCREEN);  
  4. menu.setShadowDrawable(R.drawable.shadow);  
  5. menu.setShadowWidthRes(R.dimen.shadow_width);  
  6. menu.setBehindOffsetRes(R.dimen.slidingmenu_offset);  
  7. menu.setBehindWidth(400);//设置SlidingMenu菜单的宽度  
  8. menu.setFadeDegree(0.35f);  
  9. menu.attachToActivity(this, SlidingMenu.SLIDING_CONTENT);//必须调用  
  10. menu.setMenu(R.layout.menu_layout_left);//就是普通的layout布局  
  11. 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;变量:

  1. mTransformer = new CanvasTransformer() {  
  2. @Override  
  3. public void transformCanvas(Canvas canvas, float percentOpen) {  
  4. float scale = (float) (percentOpen*0.25 + 0.75);  
  5. canvas.scale(scale, scale, canvas.getWidth()/2, canvas.getHeight()/2);  
  6. }  
  7. };  

然后将mTransformer对象设置给SlidingMenu即可,这个是 缩放动画:
  1. private void initSlidUpCanvasTransformer() {  
  2. mTransformer = new CanvasTransformer() {  
  3.   
  4. @Override  
  5. public void transformCanvas(Canvas canvas, float percentOpen) {  
  6. canvas.translate(0, canvas.getHeight()*(1-interp.getInterpolation(percentOpen)));  
  7. }  
  8. };  
  9. }  
  10.   
  11. private static Interpolator interp = new Interpolator() {  
  12. @Override  
  13. public float getInterpolation(float t) {  
  14. t -= 1.0f;  
  15. return t * t * t + 1.0f;  
  16. }  
  17. };  

拉伸动画:

  1. mTransformer = new CanvasTransformer() {  
  2. @Override  
  3. public void transformCanvas(Canvas canvas, float percentOpen) {  
  4. canvas.scale(percentOpen, 100);  
  5. }  
  6. }); 
目录
相关文章
|
2天前
|
云安全 人工智能
2025,阿里云安全的“年度报告”
拥抱AI时代,阿里云安全为你护航~
1439 1
|
9天前
|
云安全 人工智能 算法
以“AI对抗AI”,阿里云验证码进入2.0时代
三层立体防护,用大模型打赢人机攻防战
1417 10
|
9天前
|
机器学习/深度学习 安全 API
MAI-UI 开源:通用 GUI 智能体基座登顶 SOTA!
MAI-UI是通义实验室推出的全尺寸GUI智能体基座模型,原生集成用户交互、MCP工具调用与端云协同能力。支持跨App操作、模糊语义理解与主动提问澄清,通过大规模在线强化学习实现复杂任务自动化,在出行、办公等高频场景中表现卓越,已登顶ScreenSpot-Pro、MobileWorld等多项SOTA评测。
1330 7
|
10天前
|
人工智能 Rust 运维
这个神器让你白嫖ClaudeOpus 4.5,Gemini 3!还能接Claude Code等任意平台
加我进AI讨论学习群,公众号右下角“联系方式”文末有老金的 开源知识库地址·全免费
1216 15
|
4天前
|
人工智能 前端开发 API
Google发布50页AI Agent白皮书,老金帮你提炼10个核心要点
老金分享Google最新AI Agent指南:让AI从“动嘴”到“动手”。Agent=大脑(模型)+手(工具)+协调系统,可自主完成任务。通过ReAct模式、多Agent协作与RAG等技术,实现真正自动化。入门推荐LangChain,文末附开源知识库链接。
457 118
|
2天前
|
机器学习/深度学习 测试技术 数据中心
九坤量化开源IQuest-Coder-V1,代码大模型进入“流式”训练时代
2026年首日,九坤创始团队成立的至知创新研究院开源IQuest-Coder-V1系列代码大模型,涵盖7B至40B参数,支持128K上下文与GQA架构,提供Base、Instruct、Thinking及Loop版本。采用创新Code-Flow训练范式,模拟代码演化全过程,提升复杂任务推理能力,在SWE-Bench、LiveCodeBench等基准领先。全阶段checkpoint开放,支持本地部署与微调,助力研究与应用落地。
338 1
|
7天前
|
存储 缓存 NoSQL
阿里云经济型e实例(ecs.e-c1m4.large)2核8G云服务器优惠活动价格及性能测评
阿里云经济型e实例(ecs.e-c1m4.large)2核8G配置,支持按使用流量或按固定带宽两种公网计费方式,搭配20G起ESSD Entry云盘,是主打高性价比的内存优化型入门选择。其核心特点是8G大内存适配轻量内存密集场景,计费模式灵活可控,既能满足个人开发者的复杂测试项目需求,也能支撑小微企业的基础业务运行,无需为闲置资源过度付费。以下从优惠活动价格、性能表现、适用场景及避坑要点四方面,用通俗语言详细解析。
233 153
|
4天前
|
机器学习/深度学习 人工智能 算法
炎鹊「Nexus Agent V1.0」:垂直领域AI应用的原生能力引擎
炎鹊AI「Nexus Agent V1.0」是垂直行业专属AI原生引擎,融合大模型、AIGA决策大脑、行业知识图谱与专属模型,打造“感知-决策-执行”闭环。支持21个行业低代码构建工具型、员工型、决策型AI应用,实现技术到业务价值的高效转化,推动AI从实验走向规模化落地。(239字)
253 1

热门文章

最新文章