我们看到的很多APP都有侧滑菜单的功能,今天我们学习一个Github上的开源项目SlidingMenu,对SlidingMenu 还不是很了解的童鞋,可以参考下本博客。本博客从源码入手,写一个小Demo引入SlidingMenu,后续开发大家可以自行扩展。
/SlidingMenuGitHub链接: https://github.com/jfeinstein10/SlidingMenu
An Android library that allows you to easily create applications with slide-in menus. You may use it in your Android apps provided that you cite this project and include the license in your app. Thanks!
我们参考官方Demo:
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);
}
}
然后自己结合源码Diy:
从官网下载library库后将其添加到工程依赖里,就可以直接使用啦。
SlidingMenu menu = new SlidingMenu(this);
传入一个context,在里面会调用两个参数的构造方法(属性值为空),
/**
* 初始化滑动菜单
*
* @param context the associated Context
*/
public SlidingMenu(Context context) {
this(context, null);
}
然后又调用3个参数的构造方法(defStyle为0):
/**
* 初始化滑动菜单
*
* @param context the associated Context
* @param attrs the attrs
*/
public SlidingMenu(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
在3个参数的构造方法里进行一系列设置并调用父类RelativeLayout的构造方法:
/**
* 初始化滑动菜单
*
* @param context the associated Context
* @param attrs the attrs
* @param defStyle the def style
*/
public SlidingMenu(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
LayoutParams behindParams = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
mViewBehind = new CustomViewBehind(context);
addView(mViewBehind, behindParams);
LayoutParams aboveParams = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
mViewAbove = new CustomViewAbove(context);
addView(mViewAbove, aboveParams);
...
// now style everything!
TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.SlidingMenu);
...
}
在父类RelativeLayout中又会层层回调自己、ViewGroup、View的构造方法:
public RelativeLayout(Context context, AttributeSet attrs, int defStyleAttr) {
this(context, attrs, defStyleAttr, 0);
}
public RelativeLayout(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
initFromAttributes(context, attrs, defStyleAttr, defStyleRes);
queryCompatibilityModes(context);
}
public ViewGroup(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
initViewGroup();
initFromAttributes(context, attrs, defStyleAttr, defStyleRes);
}
··· 接下来设置一系列属性:
为setMode()方法设置一个常量值,把滑动菜单放在左边
menu.setMode(SlidingMenu.LEFT);
我们可以也只能放在左/右/左右(参考源代码,否则抛出异常):
/**
* 为setMode()方法设置一个常量值,把滑动菜单放在左边
*/
public static final int LEFT = 0;
/**
* 为setMode()方法设置一个常量值,把滑动菜单放在右边
*/
public static final int RIGHT = 1;
/**
* 为setMode()方法设置一个常量值,把滑动菜单放在左右两边
*/
public static final int LEFT_RIGHT = 2;
/**
* 设置滑动菜单出现在视图中的位置
*
* @param mode must be either SlidingMenu.LEFT or SlidingMenu.RIGHT
*/
public void setMode(int mode) {
if (mode != LEFT && mode != RIGHT && mode != LEFT_RIGHT) {
throw new IllegalStateException("SlidingMenu mode must be LEFT, RIGHT, or LEFT_RIGHT");
}
mViewBehind.setMode(mode);
}
menu.setTouchModeAbove(SlidingMenu.TOUCHMODE_FULLSCREEN);
可选模式有以下三种:
/**
* 为setTouchModeAbove()方法设置一个常量值,允许滑动菜单通过滑动屏幕的边缘被打开
*/
public static final int TOUCHMODE_MARGIN = 0;
/**
* 为setTouchModeAbove()方法设置一个常量值,允许滑动菜单通过滑动屏幕的任何地方被打开
*/
public static final int TOUCHMODE_FULLSCREEN = 1;
/**
* 为setTouchModeAbove()方法设置一个常量值,不允许滑动菜单通过滑动屏幕被打开
*/
public static final int TOUCHMODE_NONE = 2;
menu.setShadowWidthRes(R.dimen.shadow_width);
根据资源文件ID来设置滑动菜单的阴影效果:
menu.setShadowDrawable(R.drawable.shadow);
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" >
<gradient
android:endColor="#33000000"
android:centerColor="#11000000"
android:startColor="#00000000" />
</shape>
设置滑动菜单视图的宽度,根据dimension资源文件的ID来设置下方视图的偏移量:
(<dimen name="slidingmenu_offset">80dp</dimen>)
menu.setBehindOffsetRes(R.dimen.slidingmenu_offset);
设置渐入渐出效果的值:
menu.setFadeDegree(0.35f);
把滑动菜单添加进所有的Activity中,可选值SLIDING_CONTENT,SLIDING_WINDOW:
menu.attachToActivity(this, SlidingMenu.SLIDING_CONTENT);
为侧滑菜单设置布局,从布局资源文件中设置下方(滑动菜单)的视图内容,这个布局会被填充添加到所有图层的最下方:
menu.setMenu(R.layout.leftmenu);
截图如下: