如何使用滑动菜单SlidingMenu?

左側滑:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvanVuaHVhaG91c2U=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" 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" align="left" height="325" width="182">

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvanVuaHVhaG91c2U=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" 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();
时间: 2024-10-15 14:18:49

如何使用滑动菜单SlidingMenu?的相关文章

Android 滑动菜单SlidingMenu

首先我们看下面视图: 这种效果大家都不陌生,网上好多都说是仿人人网的,估计人家牛逼出来的早吧,我也参考了一一些例子,实现起来有三种方法,我下面简单介绍下: 方法一:其实就是对GestureDetector手势的应用及布局文件的设计. 布局文件main.xml    采用RelativeLayout布局. <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android=&quo

自定义滑动菜单SlidingMenu

最近没事就模仿scdn客户端的左右侧滑效果,自定义了一个SlindingMenu,虽然github上已经有了相当成熟的SlindingMenu开源框架,但本博客旨在帮助更多同学理解SlidingMenu的原理,使使用起来更得心应手. 1.分析 首先对其实现进行分析,SlindingMenu的布局需要有两部分,一个是菜单(menu)的布局,一个是内容(content)的布局.两个布局横向排列,菜单布局在左,内容布局在右.初始化的时候将菜单布局向左偏移,以至于能够完全隐藏,这样内容布局就会完全显示在

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

PS:努力的往前飞..再累也无所谓.. 学习内容: 1.使用SlidingMenu实现滑动菜单..   SlidingMenu滑动菜单..滑动菜单在绝大多数app中也是存在的..非常的实用..Github有位牛人将这个东西书写成了一个简单的框架..我们只需要通过引用相关的资源就能够完成一个滑动菜单的实现..有了这一层的基础..那么滑动菜单就很容易实现了..就拿我们最为熟悉的QQ来说吧..当我们进行滑动操作的时候..会有一个新的View去覆盖原本的View..我们可以通过触发新的视图上的控件来执行

SlidingMenu 左侧滑动菜单

1.MainActivity package loveworld.slidingmenu; import java.util.ArrayList; import android.app.Activity; import android.graphics.Color; import android.graphics.drawable.ColorDrawable; import android.os.Bundle; import android.provider.ContactsContract.C

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

Jeff Lee blog:   http://www.cnblogs.com/Alandre/  (泥沙砖瓦浆木匠),retain the url when reproduced ! Thanks 效果图: 求资源到首页上部加群即可. 一. SlidingMenu简介 github:https://github.com/jfeinstein10/SlidingMenu 官网上面的简介上翻译的: SlidingMenu是能让开发者很容易的开发有滑动菜单App(像Google+,YouTube,F

滑动菜单栏SlidingMenu动画效果的实现

经过上一篇文章的学习,相信大家对开源项目SlidingMenu的用法已经有了一个非常深入的了解,那么这一章博 主就来教大家滑动菜单栏滑动时动画效果的实现.博主这里用了三个不同动画效果的基础示例来教大家如何去实现, 等 大家 弄懂了之后完全可以做到举一反三,去实现更多不同的动画效果,让你的应用软件给用户带来眼前一亮的效 果. 一.SlidingMenu动画效果示例一 1.示例一效果图 该示例实现了滑动时缩放的效果,看左边的效果图可以明显的感觉到,滑动菜单栏刚刚打开时的图片比右边的效 果图 滑动菜单

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

南尘:每天进步一点点! 前面讲了官方的侧滑菜单DrawerLayout的使用,其实早在官方没有推出这个之前,就有很多第三方的jar包如SlidingMenu等,感谢开源的力量. SlidingMenu是一个开源的侧滑菜单(https://github.com/jfeinstein10/SlidingMenu). 为大家的安卓程序提供侧滑菜单,这个功能也非常有用. 配置:本人亲测使用第三方jar包在Eclipse下面可以正常使用,而在andorid studio下面直接导入jar包加入app中会报

怎么使用侧滑菜单SlidingMenu?

左侧滑: 右侧滑: 点击这里下载源码 在此之前,我使用网上朋友自定义的侧滑菜单.利用重写布局来控制和实现,但是到最后项目写80%的时候.突然发现跟我的功能产生了冲突.我去,这么凌乱的代码,我也搞不定.所以没办法,就在网上狂搜索,三天之后.搞定了,并成功嵌入到了我的项目中.其中的测试demo如上图!还是别带着好奇去使用那些自定义的侧滑菜单,当你项目马上要结项,你使用该侧滑菜单跟你 的项目功能产生了冲突,你又不能解决,这时候你才叫一个抓狂. 所以,经久的更耐用,人家都是用,当你项目出现问题,才能快熟

android自带DrawerLayout滑动菜单的使用

受到slidingMenu的启发android增加了DrawerLayout来实现滑动菜单 DrawerLayout是继承自ViewGroup,可以在其中放子view.DrawerLayout中分为主内容区和菜单区域 使用方法如下 1.和普通的LinearLayout一样 <android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android" androi