不久前因项目需要,实现类似人人客户端侧滑栏效果,现整理出来分享,相互学习一下。具体的实现思路就不多说了,直接贴代码,有不明白的地方,沙发即可。
1.SlideMenu.java
package com.galesnjak.base;
import com.galesnjak.utility.Debug;
import android.app.Activity;
import android.content.Context;
import android.graphics.RectF;
import android.util.AttributeSet;
import android.util.DisplayMetrics;
import android.view.GestureDetector;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewConfiguration;
import android.view.ViewGroup;
import android.widget.LinearLayout;
import android.widget.Scroller;
/**
* 自定义侧滑栏
* @author galesnjak
*
*/
public class SlideMenu extends ViewGroup {
/**
* 移动一定距离,触发View的滑动
*/
private int touchSlop = 10;
/**
* 右侧View距离左边距离
*/
private int rightViewMargin;
//右边视图、中间视图
private View rightView,middleView;
/**
* 第一次触摸的x坐标,用来作事件拦截
*/
private float interceptMotion_X;
private float interceptMotion_Y;
/**
* 记录用户滑动手势,ture:向左滑、false:向右滑
*/
private boolean moveLeft = true;
/**
* 当前侧滑栏打开状态
* true表示打开、false未打开
*/
private boolean isRightOpen = false;
/**
* 滑动事件的X坐标
*/
private float mLastMotionX;
private Scroller mScroller;
//自动回滚线程
private ScrollerRunable scrollerRunable;
/**
* 标识是否点击在侧滑栏打开区域
*/
private boolean mIsTapContent = false;
/**
* 监听单击手势
*/
private GestureDetector mGestureDetector;
/**
* 标识用户是否是否单击侧滑栏打开区域,以便关闭侧滑栏
*/
private boolean isTap = false;
/**
* 默认开启侧滑栏功能
*/
private boolean leftSlideEnable = false;
/**
* 屏幕宽度
*/
private int width;
/**
* 右侧视图默认宽度,单位px
*/
private int rightViewWidth;
/**
* 用来标记是否设置过右侧视图的宽度,如果设置过,子控件将按照该数值测量大小
*/
private boolean isSetRightViewWidth;
public SlideMenu(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
initView(context);
}
public SlideMenu(Context context, AttributeSet attrs) {
super(context, attrs);
initView(context);
}
public SlideMenu(Context context) {
super(context);
initView(context);
}
/**
* 该方法的作用:构造器
* @author galesnjak
* @date 2013-07-31
* @param context
* @param rightView
* @param middleView
*/
public SlideMenu(Context context,View rightView,View middleView){
super(context);
initView(context);
if(null != rightView && null != middleView){
addView(rightView,0);
this.rightView = rightView;
addView(middleView, getChildCount());
this.middleView = middleView;
}else{
checkView();
}
}
/**
* 该方法的作用:初始化
* @author galesnjak
* @date 2013-07-31
* @param context
*/
private void initView(Context context){
Debug.i("SlideMenu", "initView");
ViewConfiguration configuration = ViewConfiguration.get(context);
touchSlop = configuration.getScaledTouchSlop();
Debug.i("SlideMenu---->touchSlop:::", ""+touchSlop);
mGestureDetector = new GestureDetector(new CustomerSimpleOnGestureListener());
setRightViewDefaultWidth(context);
}
/**
* 设置右侧视图默认宽度值
* @param context
*/
private void setRightViewDefaultWidth(Context context){
DisplayMetrics metrics = new DisplayMetrics();
((Activity)context).getWindowManager().getDefaultDisplay().getMetrics(metrics);
width = metrics.widthPixels;
Debug.i("SlideMenu---->width:::", ""+width);
}
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
//如果侧滑栏功能开启,手势监听touch事件
if(leftSlideEnable){
mGestureDetector.onTouchEvent(ev);
}
return super.dispatchTouchEvent(ev);
}
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
//如果侧滑栏功能打开
if(leftSlideEnable){