用view实现popwindow效果,弹出菜单.

来源:互联网 发布:原田知世 结婚了吗 编辑:程序博客网 时间:2024/05/10 12:18

之前是用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 stubSCREEN_HIGHT = getScreensHeight(activity);if (MENU_VIEW != null && SCREEN_HIGHT != 0) {ViewPropertyAnimator.animate(MENU_VIEW).translationY(SCREEN_HIGHT).setListener(new AnimatorListener() {@Overridepublic void onAnimationEnd(Animator arg0) {// TODO Auto-generated method stubMENU_VIEW.setVisibility(View.VISIBLE);}@Overridepublic void onAnimationCancel(Animator arg0) {// TODO Auto-generated method stub}@Overridepublic void onAnimationRepeat(Animator arg0) {// TODO Auto-generated method stub}@Overridepublic void onAnimationStart(Animator arg0) {// TODO Auto-generated method stub}});}if (null != contextView) {contextView.setOnTouchListener(new OnTouchListener() {@Overridepublic boolean onTouch(View v, MotionEvent event) {// TODO Auto-generated method stubclosemenu();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;// 屏幕的高dpint 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;}}


0 0
原创粉丝点击