左側滑:

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?的更多相关文章

  1. android 自定义ViewGroup和对view进行切图动画实现滑动菜单SlidingMenu

    示意图就不展示了,和上一节的一样,滑动菜单SlidingMenu效果如何大家都比较熟悉,在这里我简单说明一下用自定义ViewGroup来实现. 实现方法:我们自定义一个ViewGroup实现左右滑动, ...

  2. android 自定义ViewGroup和对view进行切图动画实现滑动菜单SlidingMenu[转]

    http://blog.csdn.net/jj120522/article/details/8095852 示意图就不展示了,和上一节的一样,滑动菜单SlidingMenu效果如何大家都比较熟悉,在这 ...

  3. Android 滑动菜单SlidingMenu

    首先我们看下面视图: 这种效果大家都不陌生,网上好多都说是仿人人网的,估计人家牛逼出来的早吧,我也参考了一一些例子,实现起来有三种方法,我下面简单介绍下: 方法一:其实就是对GestureDetect ...

  4. android 滑动菜单SlidingMenu的实现

    首先我们看下面视图:       这种效果大家都不陌生,网上好多都说是仿人人网的,估计人家牛逼出来的早吧,我也参考了一一些例子,实现起来有三种方法,我下面简单介绍下: 方法一:其实就是对Gesture ...

  5. Android 学习笔记之AndBase框架学习(七) SlidingMenu滑动菜单的实现

    PS:努力的往前飞..再累也无所谓.. 学习内容: 1.使用SlidingMenu实现滑动菜单..   SlidingMenu滑动菜单..滑动菜单在绝大多数app中也是存在的..非常的实用..Gith ...

  6. Android UI(三)SlidingMenu实现滑动菜单(详细 官方)

    Jeff Lee blog:   http://www.cnblogs.com/Alandre/  (泥沙砖瓦浆木匠),retain the url when reproduced ! Thanks ...

  7. 第三方侧滑菜单SlidingMenu在android studio中的使用

    南尘:每天进步一点点! 前面讲了官方的侧滑菜单DrawerLayout的使用,其实早在官方没有推出这个之前,就有很多第三方的jar包如SlidingMenu等,感谢开源的力量. SlidingMenu ...

  8. Android Studio 使用ViewPager + Fragment实现滑动菜单Tab效果 --简易版

    描述: 之前有做过一个记账本APP,拿来练手的,做的很简单,是用Eclipse开发的: 最近想把这个APP重新完善一下,添加了一些新的功能,并选用Android Studio来开发: APP已经完善了 ...

  9. bootstrap-简单实用的垂直手风琴滑动菜单列表特效

    前端: <html lang="zh"> <head> <meta charset="UTF-8"> <meta ht ...

随机推荐

  1. [转载]起动service保存android系统log( logcat服务)

    原文链接:http://www.myexception.cn/android/1904013.html 启动service保存android系统log 作为android开发工程师,出现了BUG是否苦 ...

  2. [置顶] ios 一个不错的图片浏览分享框架demo

    demo功能:一个不错的图片浏览分享框架demo.iphone6.1 测试通过.可以浏览图片,保存,微博分享到新浪,腾讯,网易,人人等. 注:(由于各个微博的接口有时候会有调整,不一定能分享成功.只看 ...

  3. gif动图快速制作方法(附工具)(转)

    现在写博客或是wiki的过程中,会经常引用到图片,特别是客户端经常与页面相关所以截图不可避.但是越来越多的效果仅仅一张图片是无法清楚的描述.并且博客或是wiki也是支持gif图的.gif图的制作方法有 ...

  4. 乐在其中设计模式(C#) - 命令模式(Command Pattern)

    原文:乐在其中设计模式(C#) - 命令模式(Command Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 命令模式(Command Pattern) 作者:webabcd ...

  5. 解决PhpCms V9后台无法上传图片

    PHPCMS V9 在近期一次更新的版本号(9.4.2)中因为代码推断失误.导致PHPCMS在后台更新文章无法上传图片而导致的bug.在PHPCMS论坛中找到了暂时解决方式,希望PHPCMS官方能尽快 ...

  6. 手提wifi双卡配置+window7同时多用户远程+有些公司限制网络环境方案

    该公司只提供几台机器,同时限制并连接到内部办公网络的机, 我们更多的临时工作人员,项目紧张,而另一种是太麻烦了申请, 当被问及其他网络管理,说没有变通方法. 在我的尝试,最后,找到一个解决方案; 解决 ...

  7. Vs2010 配置驱动的开发环境

    我已被用来VS2010开发环境,之前曾经与vs2010驱动的开发环境.重装系统,一次又一次的配置,找了好几篇文章,配置没有成功,在配置阶段突然成功了,直接把原来的驱动程序的配置文件将能够接管使用. 当 ...

  8. C#和C++下数据类型对应表

    /C++中的DLL函数原型为//extern "C" __declspec(dllexport) bool 方法名一(const char* 变量名1, unsigned char ...

  9. Sublime Text 3 搭建Go开发环境(Windows)

    一.安装GO 如果已经环境已经配置好,这一步省略.... 1.下载并安装go sdk 2.配置环境变量 (1). 新建 变量名:GOBIN 变量值 :F:\Go\bin (2). 新建 变量名:GOA ...

  10. Windows 8 键盘上推自定义处理

    原文:Windows 8 键盘上推自定义处理 在Windows 8 应用程序中,当TextBox控件获得焦点时,输入面板会弹出,如果TextBox控件处于页面下半部分,则系统会将页面上推是的TextB ...