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