先来看看效果:

目录:
一、实现思路
二、代码清单
三、效果与说明
?本文源码下载
------------------------------------------分割线------------------------------------------
具体下载目录在 /2015年资料/2月/18日/Android侧边栏的自定义实现(附源码)/
------------------------------------------分割线------------------------------------------
下面,让我们开始吧:
一、实现思路
1.思路
菜单在左,内容在右,然后菜单显示时和手机右边框有一定的间隔,内容显示一小部分。内容全部显示时,菜单全部不可见。如下面两个图

显示内容

显示菜单
2.判断逻辑
这是判断手指按着屏幕和手指抬起时要不要显示还是隐藏菜单

二、代码清单
首先来看下布局:
? ? xmlns:tools="http://schemas.android.com/tools"
? ? android:id="@+id/layout"
? ? android:layout_width="match_parent"
? ? android:layout_height="match_parent"
? ? android:orientation="horizontal"
? ? tools:context=".MainActivity" >
? ? ? ? ? ? android:id="@+id/menu"
? ? ? ? android:layout_width="match_parent"
? ? ? ? android:layout_height="match_parent"
? ? ? ? android:orientation="horizontal"
? ? ? ? android:background="@drawable/pn" >
? ?
? ? ? ? ? ? android:id="@+id/content"
? ? ? ? android:layout_width="match_parent"
? ? ? ? android:layout_height="match_parent"
? ? ? ? android:orientation="horizontal"
? ? ? ? android:background="@drawable/sn">? ?
? ?
?
接下来看看代码,都有注释:
package com.example.learningjava;
?
import com.example.learningjava.R.string;
?
import android.R.integer;
import android.R.menu;
import android.os.AsyncTask;
import android.os.Build;
import android.os.Bundle;
import android.annotation.SuppressLint;
import android.annotation.TargetApi;
import android.widget.LinearLayout.LayoutParams;
import android.app.Activity;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.Menu;
import android.view.MotionEvent;
import android.view.VelocityTracker;
import android.view.View;
import android.view.View.OnTouchListener;
import android.view.Window;
import android.widget.LinearLayout;
?
public class MainActivity extends Activity implements OnTouchListener{
? ? ?
? ? private LinearLayout menuLayout;//菜单项
? ? private LinearLayout contentLayout;//内容项
? ? private LayoutParams? menuParams;//菜单项目的参数
? ? private LayoutParams contentParams;//内容项目的参数contentLayout的宽度值?
? ? ?
? ? private int disPlayWidth;//手机屏幕分辨率
? ? private float xDown;//手指点下去的横坐标
? ? private float xMove;//手指移动的横坐标
? ? private float xUp;//记录手指上抬后的横坐标
? ? ?
? ? private VelocityTracker mVelocityTracker; // 用于计算手指滑动的速度。?
? ? float velocityX;//手指左右移动的速度
? ? public static final int SNAP_VELOCITY = 400; //滚动显示和隐藏menu时,手指滑动需要达到的速度。?
?
? ? private boolean menuIsShow = false;//初始化菜单项不可翙
? ? private static final int menuPadding=80;//menu完成显示,留给content的宽度
? ? ?
? protected void onCreate(Bundle savedInstanceState) {
? ? ? ? super.onCreate(savedInstanceState);
? ? ? ? requestWindowFeature(Window.FEATURE_NO_TITLE);
? ? ? ? setContentView(R.layout.activity_main);
? ? ? ? initLayoutParams();
? ? ? ? ?
? ? }
? /**
? *初始化Layout并设置其相应的参数
? */
? private void initLayoutParams()
? {
? ? //得到屏幕的大小?
? ? ? DisplayMetrics dm = new DisplayMetrics();
? ? ? getWindowManager().getDefaultDisplay().getMetrics(dm);?
? ? ? disPlayWidth =dm.widthPixels;?
? ? ? ?
? ? ? //获得控件
? ? ? menuLayout = (LinearLayout) findViewById(R.id.menu);
? ? ? contentLayout = (LinearLayout) findViewById(R.id.content);
? ? ? findViewById(R.id.layout).setOnTouchListener(this);
? ? ? ?
? ? ? //获得控件参数
? ? ? menuParams=(LinearLayout.LayoutParams)menuLayout.getLayoutParams();
? ? ? contentParams = (LinearLayout.LayoutParams) contentLayout.getLayoutParams();
? ? ? ?
?