Android自定义侧滑菜单

  在安卓界面中有这样一种效果:手指向右侧滑,左边会有一个菜单栏伸出。也可以手指向左侧滑,右边会有一个菜单栏伸出。以下只记录左菜单栏滑出,这里的写法是自定义View,没有使用官方提供的位于v4包下的Drawlayout类

 

  自定义一个类MyMenu继承Relativelayout类,在这个类里写自己需要的View


public class MyMenu extends RelativeLayout {

static Context context;//承接上下文
static FrameLayout leftMenu;
static FrameLayout midleMenu;


public MyMenu(Context context) {
super(context);
initView(context);

}

public MyMenu(Context context, AttributeSet attrs) {
super(context, attrs);
initView(context);
}


// 初始化方法
public void initView(Context context) {
this.context = context;
leftMenu = new FrameLayout(context);
midleMenu = new FrameLayout(context);
leftMenu.setBackgroundColor(Color.GREEN);
midleMenu.setBackgroundColor(Color.GREEN);
//将自定义的view添加到父类RelativeLayout的View中去
addView(leftMenu);
addView(midleMenu);

}

//给菜单定义不同的宽度,由手机屏幕大小决定
public void onMeasure(int width, int height) {
super.onMeasure(width, height);//调用父类的测量方法
midleMenu.measure(width, height);
int realwidth = MeasureSpec.getSize(width);
int realwidth_1 = width;
int tempwidth = (int)(realwidth*0.8f);
leftMenu.measure(tempwidth, height);

}

//把菜单放进layout中
@Override
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, r, b);
midleMenu.layout(l, t, r, b);

}

public boolean testCompete = false;
boolean isleftrightevent = true;
Point point = new Point();//获得当前点的坐标

//判断动作事件类型
public void EventType(MotionEvent event) {

switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
point.x = (int) event.getX();
point.y = (int) event.getY();
break;

case MotionEvent.ACTION_MOVE:
// 这里的point.x和point.y是在ACTION_DOWN动作事件下获得的
int dx = Math.abs((int) event.getX() - point.x);
int dy = Math.abs((int) event.getY() - point.y);
if (dx >= 20 && dx > dy) {
isleftrightevent = true;
testCompete = true;
} else if (dy >= 20 && dy > dx) {
isleftrightevent = false;
testCompete = true;
}
// 重新赋值当下点的坐标
point.x = (int) event.getX();
point.y = (int) event.getY();
break;

case MotionEvent.ACTION_UP:
break;

}
}




// 分发事件的确认,返回布尔值
// 判断三个事件,左右滑动,上下滑动,点击事件
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
if (!testCompete) {
EventType(ev);
return true;
}
if(isleftrightevent){
switch (ev.getAction()){
case MotionEvent.ACTION_MOVE:
int scroll = getScrollX();//屏幕的偏移量,初始为0,向右时不断减小为负数,向左是正数
int getx = (int)ev.getX()-point.x;//手指移动的距离
int expX = -getx+scroll;
int finalx = 0;
if(expX>0){
finalx = Math.max(expX,leftMenu.getWidth());
}else{
finalx = Math.max(expX,-leftMenu.getWidth());
}
scrollTo(finalx,0);
point.x = (int)ev.getX();
break;
case MotionEvent.ACTION_UP:
isleftrightevent=false;
testCompete=false;
break;

}
}else{//如果不是水平移动则要进行重新默认,否则上下移动之后就不能再左右移动了
switch (ev.getAction()){
case MotionEvent.ACTION_DOWN:
isleftrightevent=false;
testCompete=false;
break;
}

}


return super.dispatchTouchEvent(ev);
}
}



将自定义的View放到主类当中
public class MainActivity extends AppCompatActivity {
MyMenu myMenu;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
myMenu = new MyMenu(this);
setContentView(myMenu);
}
}
 

  

原文地址:https://www.cnblogs.com/lyd447113735/p/7997399.html