Android侧滑菜单DrawerLayout使用

关于侧滑菜单,网上也有很多方案,最多的应该就是使用Android的开源库SlideMenu,而本文主要Android自带的侧滑菜单控件DrawerLayout

Android自带的侧滑菜单,也就是再v4包下DrawerLayout控件。该控件简单易用,先看下实现的效果图。

左菜单:

右菜单:

使用DrawerLayout可以实现左右侧滑菜单,接下来就是代码实现。

布局文件:

<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.DrawerLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/toolbar"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.lwj.uiproject.DrawerLayoutActivity">

    <LinearLayout
        android:id="@+id/content_layout"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="#ffffffff"
        android:gravity="center"
        android:orientation="vertical">

        <TextView
            android:id="@+id/content_tx"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="内容"
            android:textSize="20dp"/>
    </LinearLayout>

    <LinearLayout
        android:id="@+id/left"
        android:layout_width="250dp"
        android:layout_height="match_parent"
        android:layout_gravity="start"
        android:background="#ffadadad"
        android:orientation="vertical">

        <ListView
            android:id="@+id/draw_list"
            android:layout_width="match_parent"
            android:layout_height="match_parent"/>
    </LinearLayout>

    <LinearLayout
        android:id="@+id/right"
        android:layout_width="250dp"
        android:layout_height="match_parent"
        android:layout_gravity="end"
        android:background="#ff0000"
        android:orientation="vertical">

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:text="right"
            android:textSize="40dp"/>
    </LinearLayout>


</android.support.v4.widget.DrawerLayout>

复制代码

布局使用android.support.v4.widget.DrawerLayout作为根view,包含三个部分:内容,左菜单,右菜单。DrawerLayout布局最好是先布局内容,然后布局菜单,否则可能出现效果不对。 关于菜单布局,左菜单布局使用android:layout_gravity="start"标志,而右菜单使用android:layout_gravity="end"标志,内容不需要使用标志。

Actviity文件:

public class DrawerLayoutActivity extends AppCompatActivity {

    private TextView mTextView;
    private ListView mListView;
    private ListAdapter mAdapter;
    private List<String> data = new ArrayList<>();
    private DrawerLayout mDrawerLayout;
    private LinearLayout mLeftMenu;
    private LinearLayout mRightMenu;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_draw_layout);

        for (int i = 0; i < 20; i++) {
            String text = "drawerLayoutItem--->"+i;
            data.add(text);
        }
        mDrawerLayout = (DrawerLayout)this.findViewById(R.id.toolbar);
        mTextView = (TextView)this.findViewById(R.id.content_tx);
        mListView = (ListView)this.findViewById(R.id.draw_list);
        mLeftMenu = (LinearLayout)this.findViewById(R.id.left);
        mRightMenu = (LinearLayout)this.findViewById(R.id.right);

        mAdapter = new ListAdapter(DrawerLayoutActivity.this,data);
        mListView.setAdapter(mAdapter);
        View view = (View) LayoutInflater.from(this).inflate(R.layout.headerlayout,null);
        mListView.addHeaderView(view);

//        mDrawerLayout.setDrawerListener//已弃用
        mDrawerLayout.addDrawerListener(new DrawerLayout.DrawerListener() {
            @Override
            public void onDrawerSlide(View drawerView, float slideOffset) {
                Log.i("tag","---------->"+slideOffset);
                // 滑动的过程当中不断地回调 slideOffset:0~1
                View content = mDrawerLayout.getChildAt(0);
                View menu = drawerView;
                float offset = 1-slideOffset;//1~0
                if (drawerView == mLeftMenu){
                    content.setTranslationX(menu.getMeasuredWidth()*(1-offset));//0~width
                }else{
                    content.setTranslationX(-(menu.getMeasuredWidth()*(1-offset)));//0~width
                }
            }

            @Override
            public void onDrawerOpened(View drawerView) {

            }

            @Override
            public void onDrawerClosed(View drawerView) {

            }

            @Override
            public void onDrawerStateChanged(int newState) {

            }
        });

//        mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
//            @Override
//            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
//                mDrawerLayout.closeDrawers();
//                mTextView.setText(data.get(position));
//
//            }
//        });
        mAdapter.setOnItemOnclickListener(new ListAdapter.OnItemOnclickListener() {
            @Override
            public void onClike(String text) {
                mDrawerLayout.closeDrawers();
                mTextView.setText(text);
            }
        });


    }


    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0 && mDrawerLayout.isDrawerOpen(mDrawerLayout.getChildAt(1))) { //按下的如果是BACK,同时没有重复
            mDrawerLayout.closeDrawers();
            return true;
        }
        return super.onKeyDown(keyCode, event);
    }

//    @Override
//    public boolean onKeyDown(int keyCode, KeyEvent event) {
//        if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0 && !mDrawerLayout.isDrawerOpen(mDrawerLayout.getChildAt(1))) { //按下的如果是BACK,同时没有重复
//            mDrawerLayout.openDrawer(mDrawerLayout.getChildAt(1));
//            return true;
//        }
//        return super.onKeyDown(keyCode, event);
//    }
}

复制代码

初始化,关于菜单google推荐使用NavigationView控件,使用NavigationViewDrawerLayout配套使用更友好。 这里最重要的一点就是使用DrawerLayout.DrawerListener()设置监听,监听的onDrawerSlide方法,可以监听到滑动的距离0-1的变化,利用这个数据,我们可以做一些实现滑动效果,比如qq菜单的滑动效果。 旧版本设置监听的方法是:mDrawerLayout.setDrawerListener,现在google的api已经不推荐使用了,推荐通过mDrawerLayout.addDrawerListener方法设置监听。

关于DrawerLayout更多的使用方法,可以查看源码或者api。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值