从源码分析,初步了解开源项目SlidingMenu(侧滑菜单)

我们看到的很多APP都有侧滑菜单的功能,今天我们学习一个Github上的开源项目SlidingMenu对SlidingMenu 还不是很了解的童鞋,可以参考下本博客。本博客从源码入手,写一个小Demo引入SlidingMenu,后续开发大家可以自行扩展。

jfeinstein10/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);
	}


为setTouchModeAbove()方法设置一个常量值,允许滑动菜单通过滑动屏幕的任何地方被打开:
        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;


根据dimension资源文件的ID来设置阴影的宽度(<dimen name="shadow_width">15dp</dimen>):
        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);

截图如下:





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值