在本篇博客,主要介绍android中自定义左右菜单的实现
下面一步一步介绍开始实现的方法:
新建一个CustomMenu 继承自LinearLayout
public class CustomMenu extends RelativeLayout;
1.在 CustomMenu 这个类中 我们要先创建三个视图,leftMenu,rigthMenu,middleMenu,maskMenu,分别为左,中,右,以及一个蒙版视图
private LinearLayout leftMenu, rightMenu, middleMenu, maskMenu;
2.然后建立一个初始化的方法,初始以上的四个视图
public void init(Context context) {
this.context = context;
leftMenu = new LinearLayout(context);
rightMenu = new LinearLayout(context);
middleMenu = new LinearLayout(context);
maskMenu = new LinearLayout(context);
scroller = new Scroller(context, new DecelerateInterpolator());
leftMenu.setBackgroundColor(Color.RED);
rightMenu.setBackgroundColor(Color.BLUE);
middleMenu.setBackgroundColor(Color.WHITE);
maskMenu.setBackgroundColor(0xaa000000);
addView(leftMenu);
addView(middleMenu);
addView(rightMenu);
addView(maskMenu);
maskMenu.setAlpha(0);
}
3.我们要设置四个视图的宽度和高度以及他们的位置,
通过重写onMeasure()这个函数,我们分别对以上四个子视图进行大小设置
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
int width = MeasureSpec.getSize(widthMeasureSpec);
int measureWidth = MeasureSpec.makeMeasureSpec((int) (width * 0.6), MeasureSpec.EXACTLY);
middleMenu.measure(widthMeasureSpec, heightMeasureSpec);
maskMenu.measure(widthMeasureSpec, heightMeasureSpec);
leftMenu.measure(measureWidth, heightMeasureSpec);
rightMenu.measure(measureWidth, heightMeasureSpec);
}
这里解释一下,函数传递过来的参数widthMeasureSpec和heightMeasureSpec可以看做屏幕的大小。middleMenu和maskMenu 的大小应该和传递过来的参数大小是一样,而左右菜单我们可以设置他们的宽度为中间视图的80%,通过measure()函数设置。
4,设置四个视图在猪布局中的位置onLayout():
protected void onLayout(boolean changed, int l, int t, int r, int b) {
super.onLayout(changed, l, t, r, b);
leftMenu.layout(l - leftMenu.getMeasuredWidth(), t, l, b);
rightMenu.layout(l + middleMenu.getMeasuredWidth(), t, r + rightMenu.getMeasuredWidth(), b);
middleMenu.layout(l, t, r, b);
maskMenu.layout(l, t, r, b);
}
最左边的视图leftMenu它的left应该为当前正中间视图的左边(传递过来的l)宽度为leftMenu.getMeasureWidth()处,右边在原中间视图的l处
顶部和底部一样。同理设置右边的视图rightMenu ,middleMenu和maskMenu在中间所以不用改变,直接调用layout(l,t,r,b)。
5,好了设置完了子视图的大小和位置,然而我们还不能看到效果,我们还得进行屏幕的触摸动作事件的处理 重写父类的dispatchTouchEvent()函数
首先我们要判断是不是已经按下了手指:这里通过设置一个标志量来代表是否按下
if (!isTestCompete) {
getEventType(ev);
return true;
}
当第一次开始触碰到屏幕时,我们进行一个动作类型的判断,调用getEventType(ev),在这个函数里我们判断动作并设置标志量isLeftRight判断是否左右滑动
private void getEventType(MotionEvent ev) {
switch (ev.getActionMasked()) {
case MotionEvent.ACTION_DOWN:
point.x = (