关于侧滑菜单,网上也有很多方案,最多的应该就是使用Android的开源库,而本文主要Android自带的侧滑菜单控件DrawerLayout
。
Android自带的侧滑菜单,也就是再v4
包下DrawerLayout
控件。该控件简单易用,先看下实现的效果图。
左菜单:
右菜单:
使用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 Listdata = 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
控件,使用NavigationView
和DrawerLayout
配套使用更友好。 这里最重要的一点就是使用DrawerLayout.DrawerListener()
设置监听,监听的onDrawerSlide
方法,可以监听到滑动的距离0-1
的变化,利用这个数据,我们可以做一些实现滑动效果,比如qq菜单的滑动效果。 旧版本设置监听的方法是:mDrawerLayout.setDrawerListener
,现在google的api已经不推荐使用了,推荐通过mDrawerLayout.addDrawerListener
方法设置监听。
关于DrawerLayout更多的使用方法,可以查看源码或者api。