只有忙完才有点时间来更新博客。今天要讲的是实现侧滑菜单,当然,这个我也是在借鉴了他人的开源项目后修改而成,个人认为还是可以的~~
首先是效果图:
原理很简单,我其实是继承LinearLayout来实现,当然还可以是其他布局类,这样做的好处是:
1、可以成为一个框架,只要你在xml文件里应用,则可以使你对应的Activity成为侧滑,左边放菜单,右边放你的内容,则可以成为侧滑菜单;
2、逻辑实现上简单,只需控制leftMargin即可。
难点是:对拦截事件的处理。
下面是原理图以及源码:
一、具体实现类
SlidingLayout.java
package t.first;
import android.content.Context;
import android.os.AsyncTask;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.VelocityTracker;
import android.view.View;
import android.view.ViewConfiguration;
import android.view.WindowManager;
import android.widget.LinearLayout;
/**
* @ 对外仅需设置的接口
*
* -判断左侧布局是否完全显示出来,或完全隐藏,滑动过程中此值无效
* boolean SlidingLayout.isLeftLayoutVisible()
*
* -将屏幕滚动到右侧布局界面
* void SlidingLayout.scrollToRightLayout()
*
* -将屏幕滚动到左侧布局界面
* void SlidingLayout.scrollToLeftLayout()
*
*/
public class SlidingLayout extends LinearLayout {
private static final int SNAP_VELOCITY = 200; //滚动显示和隐藏左侧布局时,手指滑动需要达到的速度。
private VelocityTracker mVelocityTracker; //用于计算手指滑动的速度。
private int touchSlop; //在被判定为滚动之前用户手指可以移动的最大值。
private int screenWidth; //屏幕宽度值
private int leftEdge ; //左边最多可以滑动到的左边缘,值由左边布局的宽度来定,marginLeft到达此值之后,不能再减少。
private int rightEdge = 0; //左边最多可以滑动到的右边缘,值恒为0,即marginLeft到达0之后,不能增加。
private float xDown; //记录手指按下时的横坐标。
private float yDown; //记录手指按下时的纵坐标。
private float xMove; //记录手指移动时的横坐标。
private float yMove; //记录手指移动时的纵坐标。
private float xUp; //记录手机抬起时的横坐标。
private boolean isLeftLayoutVisible; //左侧布局当前是显示还是隐藏。只有完全显示或隐藏时才会更改此值,滑动过程中此值无效。
private boolean isSliding; //是否正在滑动。
private MarginLayoutParams leftLayoutParams; //左侧布局的参数,通过此参数来重新确定左侧布局的宽度,以及更改leftMargin的值。
private MarginLayoutParams rightLayoutParams; //右侧布局的参数,通过此参数来重新确定右侧布局的宽度。
private View leftLayout; //左侧布局对象。
private View rightLayout; //右侧布局对象。
//构造函数
public Slid