三种方式实现侧滑菜单(自定义View+github经典demo+v4 drawerlayout)

最近公司要实现一个侧滑菜单的功能,于是研究了一番侧滑菜单,不得不说网上的一些大神写的真是太牛逼了,特别是github上的那个经典的slidingmenu,有点历史了吧,那时候就能写出如此牛逼的控件,我还在大学玩泥巴,唉唉,下面总结下这段时间研究的侧滑菜单。
运行效果如下:
这里写图片描述

代码我都有注释的,运行的demogithub的链接https://github.com/913453448/SlidingMenuDemo,这里就简单说说实现方式了。
第一种实现方式:自定义一个View继承HorizontalScrollView,然后监听它的onScrollChanged方法,根据滑动的距离动态移动menu,还是比较简单的

package com.cisetech.slidingmenu.slidingmenudemo.view;

import android.content.Context;
import android.util.AttributeSet;
import android.util.TypedValue;
import android.view.MotionEvent;
import android.view.View;
import android.widget.HorizontalScrollView;

import com.cisetech.slidingmenu.slidingmenudemo.R;
import com.nineoldandroids.view.ViewHelper;

/**
 * Author:Yqy
 * Date:2016-08-19
 * Desc:简单SlidingMenu
 * Company:cisetech
 */
public class SimpleSlidingMenu extends HorizontalScrollView {
    private View mMenu;
    private View mContent;
    private int mPaddingRight=dp2px(150);
    private int screenWidth;
    private int mMenuWidth;
    public SimpleSlidingMenu(Context context) {
        this(context, null);
    }

    public SimpleSlidingMenu(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public SimpleSlidingMenu(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        screenWidth=getResources().getDisplayMetrics().widthPixels;
    }

    /**
     * 当布局文件加载完毕的时候调用
     * 一般可以在这里初始化或者获取子控件
     */
    @Override
    protected void onFinishInflate() {
        super.onFinishInflate();
        mMenu = findViewById(R.id.id_simple_menu);
        mContent = findViewById(R.id.id_simple_content);
    }

    private boolean onece;
    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        if (!onece) {
            if(mMenu!=null){
                mMenuWidth=mMenu.getLayoutParams().width=screenWidth-mPaddingRight;
                mContent.getLayoutParams().width=screenWidth;
            }
            onece = true;
        }
    }
    private int mScrimColor =  0x99000000;
    @Override
    protected void onScrollChanged(int l, int t, int oldl, int oldt) {
        if(l>mMenuWidth){
            l=mMenuWidth;
        }
        if(l<0){
            l=0;
        }
        super.onScrollChanged(l, t, oldl, oldt);
        float scale=l*1f/mMenuWidth;
        ViewHelper.setTranslationX(mMenu,l);
        final int baseAlpha = (mScrimColor & 0xff000000) >>> 24;
        final int imag = (int) (baseAlpha * (1-scale));
        final int color = imag << 24 | (mScrimColor & 0xffffff);

    }
    /**
     * 处理滑动事件
     */
    @Override
    public boolean onTouchEvent(MotionEvent ev) {
        /**
         * 当抬起的时候,如果滑动距离大于menu的一半的时候自动打开
         * 反之自动关闭
         */
        if(ev.getAction()==MotionEvent.ACTION_UP){
            int scrollX = getScrollX();
            if(scrollX>=mMenuWidth/2){
                smoothScrollTo(mMenuWidth,0);
            }else{
                smoothScrollTo(0,0);
            }
            return true;
        }
        return super.onTouchEvent(ev);
    }

    /**
     * dp2px
     * @param value
     * @return px
     */
    public int dp2px(float value) {
        return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, value, getResources().getDisplayMetrics());
    }
}

第二种方式:下载了一个github上面经典的slidingmenu,实现的方式有点类似我们上面第一种实现方式,但是封装跟处理的远远比我们第一种方式好多了,感兴趣的可以自己研究研究哦

第三种方式:正如当初侧滑比较火的时候,谷歌自己写了一个侧滑,不得不说,谷歌那群疯子程序员真心牛逼啊,写的东西略屌,通过DrawerLayout实现,v4包下面的。

具体实现方式看我github项目哦。有什么问题也欢迎一起交流交流,菜鸟一个,大牛勿喷啊^~^!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值