如何使用滑动菜单SlidingMenu?
左側滑:
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvanVuaHVhaG91c2U=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="" align="left" height="389" width="217">
右側滑:
在此之前,我使用网上朋友自己定义的側滑菜单。利用重写布局来控制和实现。可是到最后项目写80%的时候。突然发现跟我的功能产生了冲突。
我去。这么凌乱的代码,我也搞不定。
所以没办法,就在网上狂搜索,三天之后。
搞定了。并成功嵌入到了我的项目中。
当中的測试demo如上图!
还是别带着好奇去使用那些自己定义的側滑菜单,当你项目立即要结项,你使用该側滑菜单跟你 的项目功能产生了冲突,你又不能解决,这时候你才叫一个抓狂。
所以,经久的更耐用,人家都是用,当你项目出现故障,才干快熟解决;
好了。看一下怎么使用吧!
/** SlidingMenu 经常使用属性介绍: */ menu.setMode(SlidingMenu.LEFT);//设置左滑菜单 SlidingMenu.RIGHT SlidingMenu.LEFT_RIGHT 右側滑/左右側滑 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封闭后事务
简单设置左方向菜单側滑的用法:
public class SlidingExample extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setTitle(R.string.attach);
// set the content view
setContentView(R.layout.content);
// 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);
menu.attachToActivity(this, SlidingMenu.SLIDING_CONTENT);
menu.setMenu(R.layout.menu);
}
}
假设你要设置左右菜单側滑,看这里:
public class MainActivity extends FragmentActivity {
public SlidingMenu mSlidingMenu;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mSlidingMenu = new SlidingMenu(this);
mSlidingMenu.setMode(SlidingMenu.LEFT_RIGHT);
mSlidingMenu.setBehindOffsetRes(R.dimen.slidingmenu_offset);
mSlidingMenu.setTouchModeAbove(SlidingMenu.TOUCHMODE_FULLSCREEN);
mSlidingMenu.attachToActivity(this, SlidingMenu.SLIDING_CONTENT);
mSlidingMenu.setMenu(R.layout.slidemenu_primary);//左側滑
mSlidingMenu.setSecondaryMenu(R.layout.slidemenu_secondery);//右側滑
getSupportFragmentManager().beginTransaction().
replace(R.id.aty_main_framLayout, new ViewPagerFragment()).commit();
getSupportFragmentManager().beginTransaction().
replace(R.id.framLayout_fragment, new TranslationAnimationFragment()).commit();
}
/** 重写返回键和menu键,控制菜单側滑关闭 */
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
// TODO Auto-generated method stub
switch (keyCode) {
case KeyEvent.KEYCODE_BACK:
if(mSlidingMenu.isMenuShowing())
mSlidingMenu.showContent();
else finish();
return true;
case KeyEvent.KEYCODE_MENU:
mSlidingMenu.showSecondaryMenu();
return true;
}
return super.onKeyDown(keyCode, event);
}
}
以下看一下怎样解决側滑跟ViewPager左右滑动的冲突:《当然,我的源代码上展示了怎么使用》
mSlidingMenu.addIgnoredView(viewPager);
在你的Viewpager内容显示之前。调用上面的方法。就Ok了、
SlidingMenu.setTouchModeAbove().当中一共包括三中手势模式:
TOUCHMODE_FULLSCREEN 全屏模式,在正文布局中通过手势也能够打开SlidingMenu
TOUCHMODE_MARGIN 边缘模式,在正文布局的边缘处通过手势能够找开SlidingMenu
TOUCHMODE_NONE 自然是不能通过手势打开SlidingMenu了
当你在设置暗影时,在res/drawable/shadow.xml
<?xml version="1.0" encoding="utf-8"? >
<shape xmlns:android="http://schemas.android.com/apk/res/android" > <gradient
android:centerColor="#11000000"
android:endColor="#00000000"
android:startColor="#33000000" /> </shape>
续写:
其一:在导入project之后,假设使用到了Actionbar,要把actionbarSherLockLibrary这个类库、SlideMenu类库以及所建立的project,必需要使用同一个android-support-v4.jar包,(使用自己的project中的,然后把其它的给替换掉);否则,会报错哦!
其二:当我们导入完毕側滑的效果之后,是不是发现我们所做的側滑菜单的左右两側划出来的距离是一样的?答案是必须的,由于源代码就是这么做的。并没有给我们写出单独设置某边側滑——左或者右的距离。那么,这种话,就要我们自己来设置了。自己看了看源代码以及在网上看了看小伙伴们对側滑的自己定义的理解。总结到了,仅仅须要更改几个方法和属性就能完毕该功能。
让我们自己可以随意设置左右側滑的宽度。
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvanVuaHVhaG91c2U=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="" align="left" height="325" width="182">
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvanVuaHVhaG91c2U=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="" align="left" height="324" width="189">
首先,在源代码中的SlidingMenu.java中加入几个方法:
//*********************************自己定义扩展側滑宽度方法******************************************** // 设置右側边栏菜单展开时距离左边界的偏移量
public void setRightMenuOffset(int offset) {
mViewBehind.setRightWidthOffset(offset);
} // 设置右側边栏菜单展开时距离左边界的偏移量
public void setRightMenuOffsetRes(int resId) {
int i = (int) getContext().getResources().getDimension(resId);
setRightMenuOffset(i);
} // 设置右側边栏的宽度
@SuppressWarnings("deprecation")
public void setRightBehindWidth(int i) {
int width;
Display display = ((WindowManager) getContext().getSystemService(
Context.WINDOW_SERVICE)).getDefaultDisplay();
try {
Class<?> cls = Display.class;
Class<? >[] parameterTypes = { Point.class };
Point parameter = new Point();
Method method = cls.getMethod("getSize", parameterTypes);
method.invoke(display, parameter);
width = parameter.x;
} catch (Exception e) {
width = display.getWidth();
}
setRightMenuOffset(width - i);
} // 设置右側边栏的宽度
public void setRightBehindWidthRes(int res) {
int i = (int) getContext().getResources().getDimension(res);
setRightBehindWidth(i);
}
然后,改动CustomViewBehind.java类
即:1.在源代码CustomViewBehind.java类中增加必要的方法:
// ----------------------自己定义扩展加入方法----------------------------------------
private int mRightWidthOffset; // 右边宽度偏移量 public void setRightWidthOffset(int i) {
mRightWidthOffset = i;
requestLayout();
} private int getRightBehindWidth() {
return mSecondaryContent.getWidth();
}
2.改动方法:scrollBehindT( View content , int x , int y );
public void scrollBehindTo(View content, int x, int y) {
int vis = View.VISIBLE;
if (mMode == SlidingMenu.LEFT) {
if (x >= content.getLeft())
vis = View.INVISIBLE;
scrollTo((int) ((x + getBehindWidth()) * mScrollScale), y);
} else if (mMode == SlidingMenu.RIGHT) {
if (x <= content.getLeft())
vis = View.INVISIBLE;
scrollTo(
(int) (getRightBehindWidth() - getWidth() + (x - getRightBehindWidth())
* mScrollScale), y);
} else if (mMode == SlidingMenu.LEFT_RIGHT) {
mContent.setVisibility(x >= content.getLeft() ?
View.INVISIBLE
: View.VISIBLE);
mSecondaryContent
.setVisibility(x <= content.getLeft() ? View.INVISIBLE
: View.VISIBLE);
vis = x == 0 ?
View.INVISIBLE : View.VISIBLE;
if (x <= content.getLeft()) {
scrollTo((int) ((x + getBehindWidth()) * mScrollScale), y);
} else {
scrollTo(
(int) (getRightBehindWidth() - getWidth() + (x - getRightBehindWidth())
* mScrollScale), y);
}
}
if (vis == View.INVISIBLE)
Log.v(TAG, "behind INVISIBLE");
setVisibility(vis);
}
3.改动方法:getMenuLeft( View content , int page );
public int getMenuLeft(View content, int page) {
if (mMode == SlidingMenu.LEFT) {
switch (page) {
case 0:
return content.getLeft() - getBehindWidth();
case 2:
return content.getLeft();
}
} else if (mMode == SlidingMenu.RIGHT) {
switch (page) {
case 0:
return content.getLeft();
case 2:
return content.getLeft() + getRightBehindWidth();
}
} else if (mMode == SlidingMenu.LEFT_RIGHT) {
switch (page) {
case 0:
return content.getLeft() - getBehindWidth();
case 2:
return content.getLeft() + getRightBehindWidth();
}
}
return content.getLeft();
}
4.改动方法:getAbsRightBound( View content );
public int getAbsRightBound(View content) {
if (mMode == SlidingMenu.LEFT) {
return content.getLeft();
} else if (mMode == SlidingMenu.RIGHT
|| mMode == SlidingMenu.LEFT_RIGHT) {
return content.getLeft() + getRightBehindWidth();
}
return 0;
}
最后。使用 属性变量mRightWidthOffset 和方法 getRightBehindWidth()。替换在源代码CustomViewBehind.java类中的方法
onLayout(boolean changed, int l, int t, int r, int b);
onMeasure(int widthMeasureSpec, int heightMeasureSpec);
中的变量属性 mWidthOffset 。和中的方法
drawFade(View content, Canvas canvas, float openPercent)
中的 getBehindWidth();详细代码。例如以下所看到的:
@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
final int width = r - l;
final int height = b - t;
mContent.layout(0, 0, width - mWidthOffset, height);
if (mSecondaryContent != null)
// 这里做了改动
// mSecondaryContent.layout(0, 0, width - mWidthOffset, height);
mSecondaryContent.layout(0, 0, width - mRightWidthOffset, height);
} @Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int width = getDefaultSize(0, widthMeasureSpec);
int height = getDefaultSize(0, heightMeasureSpec);
setMeasuredDimension(width, height);
// 这里做了改动
// final int contentWidth = getChildMeasureSpec(widthMeasureSpec, 0, width
// - mWidthOffset);
final int contentWidth = getChildMeasureSpec(widthMeasureSpec, 0, width
- mRightWidthOffset);
final int contentHeight = getChildMeasureSpec(heightMeasureSpec, 0,
height);
mContent.measure(contentWidth, contentHeight);
if (mSecondaryContent != null)
mSecondaryContent.measure(contentWidth, contentHeight);
}
public void drawFade(View content, Canvas canvas, float openPercent) {
if (!mFadeEnabled)
return;
final int alpha = (int) (mFadeDegree * 255 * Math.abs(1 - openPercent));
mFadePaint.setColor(Color.argb(alpha, 0, 0, 0));
int left = 0;
int right = 0;
if (mMode == SlidingMenu.LEFT) {
left = content.getLeft() - getBehindWidth();
right = content.getLeft();
} else if (mMode == SlidingMenu.RIGHT) {
left = content.getRight();
right = content.getRight() + getBehindWidth();
} else if (mMode == SlidingMenu.LEFT_RIGHT) {
left = content.getLeft() - getRightBehindWidth();//替换原先的getBehindWidth();
right = content.getLeft();
canvas.drawRect(left, 0, right, getHeight(), mFadePaint);
left = content.getRight();
right = content.getRight() + getRightBehindWidth();//替换原先的getBehindWidth();
}
canvas.drawRect(left, 0, right, getHeight(), mFadePaint);
}
最后的最后。在控制側滑菜单的Activity类中加入几句代码就搞定了:
mSlidingMenu = new SlidingMenu(this);
mSlidingMenu.setMode(SlidingMenu.LEFT_RIGHT); mSlidingMenu.setBehindOffsetRes(R.dimen.slidingmenu_offset);//左右側滑距离
mSlidingMenu.setRightMenuOffsetRes(R.dimen.slidingmenu_right_offset);//重写右边側滑的距离 mSlidingMenu.setTouchModeAbove(SlidingMenu.TOUCHMODE_FULLSCREEN);
mSlidingMenu.attachToActivity(this, SlidingMenu.SLIDING_CONTENT);
mSlidingMenu.setMenu(R.layout.slidemenu_primary);
mSlidingMenu.setSecondaryMenu(R.layout.slidemenu_secondery); getSupportFragmentManager().beginTransaction().
replace(R.id.aty_main_framLayout, new ViewPagerFragment()).commit();
getSupportFragmentManager().beginTransaction().
replace(R.id.framLayout_fragment, new TranslationAnimationFragment()).commit();
如何使用滑动菜单SlidingMenu?的更多相关文章
- android 自定义ViewGroup和对view进行切图动画实现滑动菜单SlidingMenu
示意图就不展示了,和上一节的一样,滑动菜单SlidingMenu效果如何大家都比较熟悉,在这里我简单说明一下用自定义ViewGroup来实现. 实现方法:我们自定义一个ViewGroup实现左右滑动, ...
- android 自定义ViewGroup和对view进行切图动画实现滑动菜单SlidingMenu[转]
http://blog.csdn.net/jj120522/article/details/8095852 示意图就不展示了,和上一节的一样,滑动菜单SlidingMenu效果如何大家都比较熟悉,在这 ...
- Android 滑动菜单SlidingMenu
首先我们看下面视图: 这种效果大家都不陌生,网上好多都说是仿人人网的,估计人家牛逼出来的早吧,我也参考了一一些例子,实现起来有三种方法,我下面简单介绍下: 方法一:其实就是对GestureDetect ...
- android 滑动菜单SlidingMenu的实现
首先我们看下面视图: 这种效果大家都不陌生,网上好多都说是仿人人网的,估计人家牛逼出来的早吧,我也参考了一一些例子,实现起来有三种方法,我下面简单介绍下: 方法一:其实就是对Gesture ...
- Android 学习笔记之AndBase框架学习(七) SlidingMenu滑动菜单的实现
PS:努力的往前飞..再累也无所谓.. 学习内容: 1.使用SlidingMenu实现滑动菜单.. SlidingMenu滑动菜单..滑动菜单在绝大多数app中也是存在的..非常的实用..Gith ...
- Android UI(三)SlidingMenu实现滑动菜单(详细 官方)
Jeff Lee blog: http://www.cnblogs.com/Alandre/ (泥沙砖瓦浆木匠),retain the url when reproduced ! Thanks ...
- 第三方侧滑菜单SlidingMenu在android studio中的使用
南尘:每天进步一点点! 前面讲了官方的侧滑菜单DrawerLayout的使用,其实早在官方没有推出这个之前,就有很多第三方的jar包如SlidingMenu等,感谢开源的力量. SlidingMenu ...
- Android Studio 使用ViewPager + Fragment实现滑动菜单Tab效果 --简易版
描述: 之前有做过一个记账本APP,拿来练手的,做的很简单,是用Eclipse开发的: 最近想把这个APP重新完善一下,添加了一些新的功能,并选用Android Studio来开发: APP已经完善了 ...
- bootstrap-简单实用的垂直手风琴滑动菜单列表特效
前端: <html lang="zh"> <head> <meta charset="UTF-8"> <meta ht ...
随机推荐
- 华为-on练习--小写字符数的统计显示
主题: 手动输入一个字符串,只有小写字母,统计每个字符和输出频率中出现的串,输出.提示可以使用map 样例:输入:aaabbbccc 输出:a 3 b 3 c 3 分析: 看到后面的提示,简直就是不用 ...
- HTML5 CSS3 诱人的实例 : 网页载入进度条的实现,下载进度条等
今天给大家带来一个比較炫的进度条,进度条在一耗时操作上给用户一个比較好的体验,不会让用户认为在盲目等待,对于没有进度条的长时间等待,用户会任务死机了,毫不犹豫的关掉应用:一般用于下载任务,删除大量任务 ...
- 编译Android源代码与内核总结
这些天花了些时间自己下载了android源代码来编译,当中走了一些弯路导致耗了些时间,如今又一次梳理总结下,让有同样想法的人自己编译的时候能少走些弯路,官方指导文档在http://source.and ...
- Morphia采用
Morphia配合mongoDB喜欢Hibernate关系型数据库.也能够想到Morphia于MongoDB它调用上述的基础上,mongoDB语法. 于java直接通话Morphia的api它会变得更 ...
- top 查看资源使用
top:动态观察程序的变化 ? [root@linux ~]# top [-d] | top [-bnp] 参数: -d :后面可以接秒数,就是整个程序画面更新的秒数.预设是 5 秒: -b :以批次 ...
- clientIDMode的应用
以前我们可以通过ClientID在JavaScript脚本中服务器端控件.比如: document.getElementById("<%=控件.ClientID %>" ...
- C# WinForm多线程(二)ThreadPool 与 Timer
本文接上文,继续探讨WinForm中的多线程问题,再次主要探讨threadpool 和timer 一 ThreadPool 线程池(ThreadPool)是一种相对较简单的方法,它适应于一些需要多个 ...
- MyEclipse每次修改js有另一种部署
今天在做时间格式显示这块内容的时候.我改动了这个js函数,同一时候凝视的掉了其它的一些替换的方法,可是在浏览器中执行发现效果一点也没有改变.于是debug js,发现浏览器中识别的还是之前未改动的js ...
- AndroidAnnotations说明—AndroidAnnotations它是如何工作的?
AndroidAnnotations它的工作原理很easy,它使用标准java注塑加工工具,自己主动加她一个额外的步骤生成源代码编译. 源代码是什么?每个增强的类.比方每个用@EAct ...
- DHCP Option 60 认识
原文地址: http://blog.163.com/chenqioulin_1983/blog/static/83216232010109104430251/ 首先还是看看RFC咋说的吧.DHCP ...