之前是用popwindow做弹出菜单,发现他只能在最顶层。当加入上滑效果的时候,我们想要的是,从底部的某一个控件底部滑出来,
但是popwindow只能从他上面滑动出来。非常的难看。达不到效果。
因此。用view实现了popwindows。
代码还有待优化。有更好的实现方法请联系我。
/**
<span style="white-space:pre"> </span> *
<span style="white-space:pre"> </span> * @param activity
<span style="white-space:pre"> </span> * @param menu 弹出菜单的布局
<span style="white-space:pre"> </span> * @param buttomview 在哪里弹出的布局
<span style="white-space:pre"> </span> * @param homeView 想要监听的逐步局,实现,嗲你家空白地方,关闭view
<span style="white-space:pre"> </span> */
<span style="white-space:pre"> </span>public Mymenu(Activity activity, View menu, View buttomview, View homeView) {
<span style="white-space:pre"> </span>this.MENU_VIEW = menu;
<span style="white-space:pre"> </span>this.BUTTOM_VIEW = buttomview;
<span style="white-space:pre"> </span>this.contextView = homeView;
<span style="white-space:pre"> </span>this.activity = activity;
<span style="white-space:pre"> </span>init();
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>/**
<span style="white-space:pre"> </span> *
<span style="white-space:pre"> </span> * @param mymenuListem 设置回调监听
<span style="white-space:pre"> </span> */
<span style="white-space:pre"> </span>public void setMymenuListem(MymenuListem mymenuListem) {
<span style="white-space:pre"> </span>this.mymenuListem = mymenuListem;
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>/*
<span style="white-space:pre"> </span>* 监听 菜单关闭和打开
<span style="white-space:pre"> </span>*/
public interface MymenuListem {
public void onMenuClose();
public void onMenuOpen();
}
public class Mymenu {
private View MENU_VIEW, BUTTOM_VIEW;
private Boolean IsOpen = false;
private int MENU_HIGHT = 0;
private int BUTTOM_MARGIN_TOP_HIGHT = 0;
private int SCREEN_HIGHT = 0;
private MymenuListem mymenuListem;
private View contextView;
private Activity activity;
public Mymenu(Activity activity, View menu, View buttomview, View homeView) {
this.MENU_VIEW = menu;
this.BUTTOM_VIEW = buttomview;
this.contextView = homeView;
this.activity = activity;
init();
}
public void setMymenuListem(MymenuListem mymenuListem) {
this.mymenuListem = mymenuListem;
}
public void init() {
// TODO Auto-generated method stub
SCREEN_HIGHT = getScreensHeight(activity);
if (MENU_VIEW != null && SCREEN_HIGHT != 0) {
ViewPropertyAnimator.animate(MENU_VIEW).translationY(SCREEN_HIGHT)
.setListener(new AnimatorListener() {
@Override
public void onAnimationEnd(Animator arg0) {
// TODO Auto-generated method stub
MENU_VIEW.setVisibility(View.VISIBLE);
}
@Override
public void onAnimationCancel(Animator arg0) {
// TODO Auto-generated method stub
}
@Override
public void onAnimationRepeat(Animator arg0) {
// TODO Auto-generated method stub
}
@Override
public void onAnimationStart(Animator arg0) {
// TODO Auto-generated method stub
}
});
}
if (null != contextView) {
contextView.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
// TODO Auto-generated method stub
closemenu();
return true;// 把触摸消耗掉吧
}
});
}
}
public Boolean getIsOpen() {
return IsOpen;
}
public void setIsOpen(Boolean isOpen) {
IsOpen = isOpen;
}
public void openmenu() {
if (!IsOpen) {
if (MENU_VIEW.getVisibility() != View.VISIBLE) {
MENU_VIEW.setVisibility(View.VISIBLE);
}
if (MENU_HIGHT == 0) {
MENU_HIGHT = MENU_VIEW.getHeight();
}
if (BUTTOM_MARGIN_TOP_HIGHT == 0) {
BUTTOM_MARGIN_TOP_HIGHT = BUTTOM_VIEW.getTop();
}
ViewPropertyAnimator.animate(MENU_VIEW).setDuration(300)
.translationY(BUTTOM_MARGIN_TOP_HIGHT - MENU_HIGHT);
IsOpen = true;
if (null != mymenuListem) {
mymenuListem.onMenuOpen();
}
}
}
public void closemenu() {
if (IsOpen) {
if (MENU_VIEW.getVisibility() != View.VISIBLE) {
MENU_VIEW.setVisibility(View.VISIBLE);
}
if (MENU_HIGHT == 0) {
MENU_HIGHT = MENU_VIEW.getHeight();
}
if (BUTTOM_MARGIN_TOP_HIGHT == 0) {
BUTTOM_MARGIN_TOP_HIGHT = BUTTOM_VIEW.getTop();
}
ViewPropertyAnimator.animate(MENU_VIEW).setDuration(300)
.translationY(BUTTOM_MARGIN_TOP_HIGHT);
IsOpen = false;
if (null != mymenuListem) {
mymenuListem.onMenuClose();
}
}
}
public static int getScreensHeight(Activity activity) {
DisplayMetrics metrics = new DisplayMetrics();
activity.getWindowManager().getDefaultDisplay().getMetrics(metrics);
int height = metrics.heightPixels;// 屏幕的高dp
int statusBarHeight = getStatusHeight(activity);
return height - statusBarHeight;
}
public static int getStatusHeight(Activity activity) {
int statusHeight = 0;
Rect localRect = new Rect();
activity.getWindow().getDecorView()
.getWindowVisibleDisplayFrame(localRect);
statusHeight = localRect.top;
if (0 == statusHeight) {
Class<?> localClass;
try {
localClass = Class.forName("com.android.internal.R$dimen");
Object localObject = localClass.newInstance();
int i5 = Integer.parseInt(localClass
.getField("status_bar_height").get(localObject)
.toString());
statusHeight = activity.getResources()
.getDimensionPixelSize(i5);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (NumberFormatException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (SecurityException e) {
e.printStackTrace();
} catch (NoSuchFieldException e) {
e.printStackTrace();
}
}
return statusHeight;
}
}