左側滑:

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. Vs2012在Linux应用程序开发(3):加入新平台hi3516

    下面我们将VS2012添加一个新的平台支持,由于近来与哈斯hi3516.就选它吧! 1.1     复制平台文件 原来一直认为要让VS支持一个新的平台须要编写代码,某天在看MSBUILD文件夹的时候突 ...

  2. JNDI 什么

    JNDI是 Java 命名与文件夹接口(Java Naming and Directory Interface).在J2EE规范中是重要的规范之中的一个,不少专家觉得,没有透彻理解JNDI的意义和作用 ...

  3. WPS2012交叉引用提示word比wps这种强烈的更新参考

                WPS2012交叉引用技巧,word比wps这点强更新參考文献 到时生成仅仅有有一条线,好像WPS不能够,word能够,假设谁知道能够补充.^_^ 1.写论文,參考文献的改动非 ...

  4. How to Compile Java DBus

    1 download or git clone Java DBus git clone git://anongit.freedesktop.org/dbus/dbus-java dbus-java 2 ...

  5. Python3.4 邮件(包含附件与中国)

    import smtplib import os from email.mime.text import MIMEText from email.mime.multipart import MIMEM ...

  6. codeforces #256 A. Rewards

    A. Rewards time limit per test 1 second memory limit per test 256 megabytes input standard input out ...

  7. POJ 2250 Compromise (UVA 531)

    LCS问题.基金会DP. 我很伤心WA非常多.就在LCS问题,需要记录什么路. 反正自己的纪录path错误,最后,就容易上当. 没有优化,二维阵列,递归打印,cin.eof() 来识别 end of ...

  8. SharePoint综合Excel数据与Excel Web Access Web部分

    SharePoint综合Excel数据与Excel Web Access Web部分 Excel Web Access Web零件SharePoint于Excel以电子形式提交数据. 1. 打开Exc ...

  9. FileStream:The process cannot access the file because it is being used by another process

    先看下面一段代码(先以共享的方式打开文件读写,然后以只读的方式打开相同文件): FileStream fs  = new FileStream(filePath, FileMode.Open, Fil ...

  10. 【Android笔记】MediaPlayer基本用法

    Android MediaPlayer基本使用方式 使用MediaPlayer播放音频或者视频的最简单样例: JAVA代码部分: public class MediaPlayerStudy exten ...